|
楼主 |
发表于 2011-1-26 12:12:27
|
显示全部楼层
回【65楼】 breeze_one
————————————————
那是几年前实验板的程序,具体是怎么样我也想不起来,但是对于数字PI调节器,其实很简单,作单位阶跃响应理解就行了。
一般简单PWM控制电机转速,输入就是PWM占空比,输出是电机转速。把它们都当成1 处理就行了,比列系数取0.几。至于中间系数是多少,根据实际变换就是啦。
更新一个容易理解的给你参考:
PID_Speed_InitStructure.Reference = PIDSetValue;
speed_error[1] = PID_Speed_InitStructure.Reference - PID_speed;//PID_speed,实测速度,reference,设定速度
up = speed_error[1]*PID_Speed_InitStructure.Kp_Gain / 100;//这里实际kp系数是 Kp_Gain/100,不用小数是为了提高运算而已
ui[1] = speed_error[0]*PID_Speed_InitStructure.Ki_Gain /100;
ui[1]=ui[1] + ui[0];
if(ui[1] > MOTOR_MAX_SPEED_RPM) //积分已饱和,这里的输入的单位先取与输出一样MOTOR_MAX_SPEED_RPM
{
ui[1] = MOTOR_MAX_SPEED_RPM ;
}
out_speed[1] = up + ui[1];
if( out_speed[1] > MOTOR_MAX_SPEED_RPM )
{
out_speed[1] = MOTOR_MAX_SPEED_RPM; /* Anti-Reset-Wind-Up */
}
if( out_speed[1] < DUMMY_VALUE )
{
out_speed[1] = OUT_SPEED_MIN;
}
ui[0] = ui[1];
speed_error[0] = speed_error[1];
out_speed[0] = out_speed[1];
pwm_duty[1] = (u16)(out_speed[0]* PWM_MAX / MOTOR_MAX_SPEED_RPM);//这里才化为PWM 输入一样的单位。
TIM1->CCR4 = pwm_duty[1];//写入PWM发生器的寄存器,真正改变占空周期 |
|