Chapter1 三环串联控制
多环控制
电流、速度、位置 环路
电机控制的闭环嵌套遵循 “内环快、外环慢” 的原则(内环运算频率外环的 5~10 倍),三个环的分工和必要性完全互补,缺一不可

-
最内环:电流环(转矩环)—— 电机的 “执行层”,快响应、抗扰动
核心控制目标:精准跟踪速度环给出的电流给定值,控制电机定子电流(交流电机)/ 电枢电流(直流电机),间接控制电机输出转矩(转矩与电流成线性关系)。
1 最快的动态响应:电流是电机最直接的执行变量,电流环带宽最高,即运算频率最高,ms或者us,能瞬间抑制电流层面的干扰(如电源电压波动、绕组电阻变化),避免电流过流 / 欠流导致转矩突变。
2 转矩精准控制:电机的转速 / 位置变化本质由转矩驱动,电流环保证转矩的精准输出,为外环的速度 / 位置控制打下稳定的执行基础。没有电流环,转矩会随负载 / 电源剧烈波动,后续控制全是空谈。
3 硬件保护:电流环可直接实现过流保护,是电机的第一道安全屏障,防止硬件烧毁。
-
中间环:速度环 —— 电机的 “调速层”,稳转速、抑负载
核心控制目标:对比电机实际转速与位置环给出的速度给定值,通过 PI/PID 调节输出电流环的给定值,精准控制电机转速。
1 抑制负载扰动:当电机负载突然变化(人站上跑步机、机械卡阻),转速会瞬间波动,速度环能快速调节转矩(通过电流环) 补偿负载变化,让转速快速回归给定值 —— 无速度环的话,电机转速会随负载大幅漂移(如轻载超速、重载失速)。
2 解耦速度与转矩:把 “位置控制” 和 “转矩执行” 解耦,位置环无需关注转矩如何输出,只需给出速度指令,由速度环处理调速细节,降低控制复杂度。
3 为位置环铺垫:将位置的位移目标转化为速度目标,避免位置环直接控制电流导致的 “超调 / 震荡”(位置是慢变量,直接控快变量会失稳)。
-
最外环:位置环 —— 电机的 “目标层”,精定位、无静差
核心控制目标:对比电机实际位置(由编码器 / 霍尔 / 光栅尺检测)与外部给定的位置目标,通过 PI/PID 调节输出速度环的给定值,实现电机轴的精准定位 / 轨迹跟踪(如机器人关节定位、机床丝杆进给)。
1 保证最终控制精度:位置是电机控制的最终目标(如要求电机转到 90°、走 50mm),位置环直接闭环最终输出量,实现无静差定位,这是速度环 / 电流环无法直接实现的。
2 平滑轨迹跟踪:通过位置环的调节,将阶跃的位置目标转化为平滑的速度曲线(如加减速曲线),避免电机启停 / 变向时的冲击、超调,保证运动平稳性。
电流环
电流环的输入是速度环PID调节后的输出,我们称为“电流环的给定”。
电流环给定值 和 电流环的反馈值 进行比较后的误差在电流环内做PID调节输出给电机。
速度环
速度环的输入就是位置环PID调节后的输出以及位置设定的前馈值,我们称为“速度设定”。
速度设定 和 速度环反馈 值进行比较后的误差在速度环做PID调节(主要是比例增益和积分处理)后输出就是上面讲到的“电流环的给定”。
速度环的反馈来自于编码器的反馈后的值经过 编码器-速度换算 得到的。所以速度环控制时就包合了速度环和电流环,换句话说任何形式都必须使用电流环,电流环是控制的根本,在速度和位置控制的同时系统实际也在进行电流(转矩)的控制以达到对速度和位置的相应控制。
位置环
位置环的输入就是外部的脉冲(通常情况下,直接写数据到驱动器地址的伺服例外),外部的脉冲经过平滑滤波处理和电子齿轮计算后作为“位置环的设定”。
位置环的设定 和 来自编码器反馈的脉冲信号 经过偏差计数器的计算后的数值在经过位置环的PID调节(比例增益调节,无积分微分环节)后输出和位置给定的前馈信号的合值就构成了上面讲的速度环的给定。
位置环的反馈也来自于编码器。由于位置控制环内部输出就是速度环的设定,位置控制模式下系统进行了所有三个环路的运算,此时的系统运算量最大,动态响应速度也最慢。
编码器安装于伺服电机尾部,它和电流环没有任何联系,他采样来自于电机的转动而不是电机电流,和电流环的输入、输出、反馈没有任何联系。而电流环是在驱动器内部形成的,即使没有电机,只要在每相上安装模拟负载(例如电灯泡)电流环就能形成反馈工作。
三环控制示例
/*----------------------------------三环控制----------------------------------*/
bdcm_position = encoder_get_position(); //计算位置
bdcm_speed_r_min = encoder_get_speed(); //计算速度
bdcm_current_now = get_current(); //获得电流
//位置有偏差,进入PID计算
if((bdcm_position < bdcm_position_pid.target - POS_DEAD_ZONE)\
||(bdcm_position > bdcm_position_pid.target + POS_DEAD_ZONE)))
{
/*----------------------------------位置环----------------------------------*/
bdcm_pwm_period = positional_pid(&bdcm_position_pid,bdcm_position);//位置pid计算
//限制位置环结果,作为速度设置值
#define BDCM_SPEED_PID_SET_LIMIT 100
if(bdcm_pwm_period < -BDCM_SPEED_PID_SET_LIMIT)
{
bdcm_pwm_period = -BDCM_SPEED_PID_SET_LIMIT;
}
else if(bdcm_pwm_period > BDCM_SPEED_PID_SET_LIMIT)
{
bdcm_pwm_period = BDCM_SPEED_PID_SET_LIMIT;
}
bdcm_speed_pid.target = bdcm_pwm_period;//位置pid结果控制速度设置值
if(bdcm_speed_pid.target != 0)
{
/*----------------------------------速度环----------------------------------*/
bdcm_pwm_period = incremental_pid(&bdcm_speed_pid,bdcm_speed_r_min);//速度pid计算
//限制速度环结果,作为电流环设置值
#define BDCM_CURRENT_PID_SET_LIMIT 30
if(bdcm_pwm_period < -BDCM_CURRENT_PID_SET_POINT)
{
bdcm_pwm_period=-BDCM_CURRENT_PID_SET_POINT;
}
else if(bdcm_pwm_period > BDCM_CURRENT_PID_SET_POINT)
{
bdcm_pwm_period=BDCM_CURRENT_PID_SET_POINT;
}
bdcm_current_pid.target = bdcm_pwm_period;//速度pid结果控制电流设置值
/*----------------------------------电流环----------------------------------*/
bdcm_pwm_period = incremental_pid(&bdcm_current_pid,bdcm_current_now);//电流pid计算
if(bdcm_speed_pid.target > 0)
bdcm_set(FORWARD_DIRCTION,bdcm_pwm_period);//正向输出
else
bdcm_set(BACKWARD_DIRCTION,-bdcm_pwm_period);//反向输出
}
}
//死区内不进行控制
else
{
bdcm_speed_pid.setpoint = 0;
bdcm_current_pid.setpoint = 0;
bdcm_pwm_period = 0;
}