第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参数整定方法

参数整定,说白了就是找感觉。我常用的方法就两种:

方法一:试凑法

  1. 先调P:从小到大加,直到系统开始震荡
  2. 再调D:加一点阻尼,让震荡消失
  3. 最后调I:消除稳态误差

我记得第一次调参数,P给大了,电机嗡嗡响,像要散架似的。后来学乖了,每次只调一个参数,记录变化。

方法二:Ziegler-Nichols法

这个方法更系统:

  1. 先把I和D设为0
  2. 增大P直到系统持续震荡,记下临界增益Ku和震荡周期Tu
  3. 按表格计算参数
控制器类型 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