STM32编码电机闭环PID调节教程。

这次我们来深入一下PID的强化核心。

一.详情了解

1.例子

假设我们有一个电机用5V电池供电,想要让他每分钟500转,一开始电池满电时候,是可以达到要求的,但是当电池容量下降一半时候,我们知道假设电机功率是10W,当电压为2.5V时候电机就只有2.5W了,电压下降一半,功率缩小四分之一,我们转速肯定达不到要求了。所以我们就需要引入一个反馈,来对电机实现闭环控制,当电压波动下降或升高时候,转速就会根据反馈,进行自动调节。

还有就是如果你有两个电机,想让小车直着走,那也是用问题的,因为单机制造工艺不同,他就会歪着走。

2.一般的编码器电机

有两个相位差90°的霍尔传感器,可以输出正交波形,从而对电机进行测速。

比如说这样子,这就是能检测方向的原理,正反时候,A相和B项的波形出现的时机不同。

启动的是定时器的PA8和PA90预分频,最大计数65535,满量程之后我们进行程序编写,我们都了解过单片机的额定时器编码器模式,CNT是计数器,然后ARR是自动重装值,决定你能记录多少个数字。还需要注意编码器线程和计数模式,这些都是偏移量。比如说T1T2计数模式,来一个脉冲会记录两个数字,ab项就会记录四个。就是两个通道同时计数,如果选择T1,就是A计数,选择T2就是B计数。

3.程序编写

即使我们配置完成后也需要进行开启外设,cubemx不会帮我们开启外设。

然后通过串口我们来打印一下。

然后旋转编码器计数器的值就会增加。

然后正传和反转是不一样的。

我们可以开一个10MS的定时器,看看这个时间内记录了多少数。

我们使用定时器3计数。

同时开启中断,因为我们要处理溢出之后的数据。

然后使用hal库独有的,中断回调函数。

为什么不用中断函数呢,因为比如说我们在主函数里面定义了一个变量,想要在中断函数给置1,的话,那么就会保存,中断函数里面会说使用了未定义的变量,所以我们就需要使用到中断回调函数,来进行操作。

之后如果我们定时器->实例对象->==定时器3,也就是定时器3触发的中断,就执行下面的。然后我们以1000hz频率进行记录数据,之后把计数器的值进行清零。

之后就可以看一下转速了。

我们在开启一个定时器用来生产PWM波形。然后我们默认给一个500占空比的波形。我们不能直接用单片机驱动电机因为电流太小了,驱动不起来,我们可以加电机驱动模块,我这里用的是12V的电机所以用的就是L298N驱动模块。

然后对PWM进行使能。

之后可以看到是一个1KHz的占空比的一个信号。

可以看到编码器的计数值是大概16左右。

我们用手给电机一个阻力,电机的值就下降了。

4.闭环控制

控制什么就是什么环,比如我们这个是控制速度的就是速度环,控制电压的就叫电压环。闭环的话就是输入和输出有相互练习,有一个反馈给到输入。

然后就是PID控制函数,我们来调一下PID。

我们先只给P项看一下PID的输出。

之后打印以下PID。

之后我们设置一个想要的转速。

当我们没有开启PID时候先手动转就可以看到PID的偏差和时机速度以及误差。

你可以把想要的速度转换为PWM模式,也可以转化为每分钟转速,这里就转化为PWM相关的。

之后加入一个积分限幅,限制以下输出幅度。

之后蓝色的是目前的速度,绿色是目标值,可以看到目前是23没有达到目标值是因因为PID补偿太小了。

我们调整补偿。

可以看到基本上就可以了。

如果P的值过大,还会产生一个过冲就会有振荡。而且电机会出现异常响动。

I的值就是尽量让蓝色的去逼近绿色的线,消除一个固定的小误差。电机的话这两项就可以了。

相关推荐
Thecozzy4 分钟前
大厂 AI Coding 面试大招
人工智能·面试·职场和发展
何事误红尘17 分钟前
Mqtt学习笔记(一):Mosquitto服务器搭建、MQTTX安装测试
学习
青山是哪个青山37 分钟前
LangChain 学习笔记(三):LangSmith 调试与监控
笔记·学习·langchain
Dr.kangder44 分钟前
嵌入式面试总结(十五)——异常处理
单片机·面试·职场和发展·系统架构·嵌入式
那年窗外下的雪.2 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php
蒸蒸yyyyzwd2 小时前
cpp选手备战后端学习笔记day6 秋招笔试题
笔记·学习
zlinear数据采集卡3 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
ACP广源盛139246256733 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
程序员爱钓鱼3 小时前
Go switch 详解
后端·面试·go
程序员爱钓鱼3 小时前
Rust Struct结构体详解:定义自己的复杂数据类型
后端·面试·rust