第1章:电机控制算法基础——PID控制原理
各位同学好,我是老张。做窗帘电机调试这些年,踩过的坑比吃过的盐还多。今天咱们聊聊电机控制的核心——PID算法。说实话,刚入行那会儿我也觉得PID就是个公式,背下来就行。后来发现,真正难的不是公式,而是怎么让它听话。
1.1 PID控制原理
PID,说白了就是三个字:比例、积分、微分。你想想看,控制电机就像开车——
- 比例(P):看到偏差就猛打方向盘。偏差大,动作就大。但容易过头,来回晃。
- 积分(I):一直有偏差?那就慢慢累积,直到消除它。就像你开车跑偏了,一直微调方向。
- 微分(D):提前预判。看到偏差变化趋势,提前刹车或加速。
公式长这样:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
其中e(t)是目标位置和实际位置的差值。嗯,这里要注意,积分项容易出问题。我在项目中遇到过积分饱和,电机直接冲过头,差点把窗帘扯下来。后来加了抗积分饱和处理,才算稳当。
核心要点:PID不是万能药。调不好参数,再好的算法也是白搭。
1.2 位置环/速度环/电流环
窗帘电机控制,一般用三环结构。我习惯从内到外讲:
| 控制环 | 作用 | 响应速度 | 典型频率 |
|---|---|---|---|
| 电流环 | 控制电机力矩,最内层 | 最快(微秒级) | 10-20kHz |
| 速度环 | 控制电机转速 | 中等(毫秒级) | 1-5kHz |
| 位置环 | 控制最终位置,最外层 | 最慢(十毫秒级) | 100-500Hz |
为什么这么分层?你想想看,电流环最快,能及时响应负载变化。速度环居中,保证匀速运动。位置环最慢,只关心最终停在哪。我曾经见过有人把三个环的频率设成一样,结果系统震荡得像筛糠一样。
个人经验:调试时先调内环,再调外环。电流环不稳,速度环和位置环都是空中楼阁。
1.3 PID参数整定方法
参数整定,说白了就是找感觉。我常用的方法就两种:
方法一:试凑法
- 先调P:从小到大加,直到系统开始震荡
- 再调D:加一点阻尼,让震荡消失
- 最后调I:消除稳态误差
我记得第一次调参数,P给大了,电机嗡嗡响,像要散架似的。后来学乖了,每次只调一个参数,记录变化。
方法二:Ziegler-Nichols法
这个方法更系统:
- 先把I和D设为0
- 增大P直到系统持续震荡,记下临界增益Ku和震荡周期Tu
- 按表格计算参数
| 控制器类型 | Kp | Ki | Kd |
|---|---|---|---|
| P | 0.5*Ku | - | - |
| PI | 0.45*Ku | 1.2*Kp/Tu | - |
| PID | 0.6*Ku | 2*Kp/Tu | Kp*Tu/8 |
避坑指南:我曾经在窗帘电机上直接用Z-N法,结果参数太激进,电机来回震荡。后来发现,窗帘负载变化大,需要留余量。建议把计算值打八折再用。
1.4 梯形加减速与S形加减速
电机启动和停止,不能太粗暴。你想想看,如果直接全速启动,窗帘会猛地一抖,噪音大还容易坏。所以需要加减速控制。
梯形加减速
最简单,三段式:加速、匀速、减速。像梯形一样。
// 梯形加减速示例
void trapezoidal_move(int target_pos) {
int accel_steps = 100; // 加速步数
int decel_steps = 100; // 减速步数
int max_speed = 1000; // 最大速度
// 加速阶段
for (int i = 0; i < accel_steps; i++) {
set_speed(i * max_speed / accel_steps);
delay(1);
}
// 匀速阶段
// ...
// 减速阶段
for (int i = decel_steps; i > 0; i--) {
set_speed(i * max_speed / decel_steps);
delay(1);
}
}
优点:实现简单,计算量小。缺点:加速度突变,会有冲击感。
S形加减速
更平滑,加速度连续变化。像S曲线一样。
// S形加减速示例(简化版)
float s_curve_speed(float t, float total_time) {
float ratio = t / total_time;
// 使用正弦函数平滑过渡
return sin(ratio * PI) * max_speed;
}
我在项目中做过对比:梯形加减速,窗帘停止时有明显抖动。换成S形后,几乎感觉不到冲击。但S形计算量大,对MCU性能有要求。
我的建议:普通窗帘用梯形就够了。高端产品或者要求静音的,上S形。别为了炫技用S形,成本上去了,用户不一定买账。
好了,这一章就聊到这儿。下一章咱们讲电机驱动芯片选型和硬件设计,到时候见。
课后思考:如果窗帘负载变化很大(比如冬天挂厚窗帘),你的PID参数该怎么调整?想好了再往下学。
公众号:蓝海资料掘金营,微信deep3321