电机-5-[无刷直流电机]速度闭环控制实验

速度的PI控制

本实验中,只用到PI参数,D没有用到。速度目标值来自于电位器ADC采样值,实际速度测量值来自于定时器2的输入捕获中断中计算得到。输入捕获中断时间间隔=电机转了60°电角度所需时间=(TIM2->CCR1)时钟周期;所以实际速度 Speed_rel = K_SPEED/TIM2->CCR1;K_SPEED=HCLK/(6*POLE_PAIRS)60。本实验主时钟HCLK默认为170MHz,电机极对数POLE_PAIRS为2(电机旋转机械角度一周=360°*2的电角度=12次中断时间)。
image

image

PID控制如下公式:Kp 为比例系数,TI 为积分项时间常数,TD 为微分项时间常数,u(t) 为PI的输出,e(t) 为输入量与参考值的误差。
image
实际电机控制中常用PI控制器,D一般不用。
speed_err = speed_ref -speed_rel → PI→ pwm_value

实验步骤

定义需要的PI变量

float ek;//PI控制误差
float Kp=-1;//比例系数,采用的PWM2模式,当定时器计数值(0-8500)大于ccr时,输出有效电平1,所以ccr值越大,则占空比越小;
float Ki=-0.05f;//积分系数
float sum_eki;//累计积分值
float sum_eki_limit=8500;//ARR值设置为8500,CCR的值范围0-8500
float uk;// 计算出的pi的控制量
float speed_rel=0;//实际速度
float speed_ref;//目标速度

添加速度PI控制代码:

speed_ref = adc_value;//设置目标速度0-4095 rpm;

//速度环的PI调节;
ek=speed_ref - speed_rel;//计算速度误差
sum_eki+=Ki*ek;//误差积分计算
    if(sum_eki>sum_eki_limit)
sum_eki=sum_eki_limit;
    if(sum_eki<-sum_eki_limit)
sum_eki=-sum_eki_limit;
uk=sum_eki+Kp*ek;//PI 计算

//输出限幅:ARR值设置为8500,CCR的值范围0-8500
if(uk>sum_eki_limit) uk=sum_eki_limit;
    if(uk<0) uk=0;
pwm_value=uk;//根据PI结果值调节PWM占空比
  1. speed_ref = adc_value:用电位器 ADC 值,设定电机期望转速。
  2. ek=speed_ref - speed_rel:算误差,实际转速比目标慢时 ek>0,PI 输出增大,PWM 占空比提高,加速。
  3. sum_eki += Ki*ek:积分项,消除静差(解决电机稳速后有固定转速差)。
  4. 两个if积分限幅,防止积分值累积过大(积分饱和),避免超调、失控。
  5. uk=sum_eki+Kp*ek:PI 输出。
  6. 输出限幅:保证uk ∈ [0, sum_eki_limit],不能是负数,同时上限封顶;最终赋值给pwm_value,送到霍尔换相 switch 里面,控制 PWM 占空比调速。
posted @ 2026-09-13 17:25  灵垚克府  阅读(5)  评论(0)    收藏  举报