SIEMENS内蒙古巴彦淖尔市 西门子代理商——西门子华北一级总代理
电机PID速度控制
上面介绍了PID的基础知识,接下来就使用位置式PID来实现对直流电机转速的控制。
程序自定义PID结构体typedefstruct{
float target_val; //目标值
float err; //偏差值
float err_last; //上一个偏差值
float Kp,Ki,Kd; //比例、积分、微分系数
float integral; //积分值
float output_val; //输出值
}PID;
PID算法实现(位置式PID)float PID_realize(float actual_val)
{
/*计算目标值与实际值的误差*/
pid.err = pid.target_val - actual_val;
/*积分项*/
pid.integral += pid.err;
/*PID算法实现*/
pid.output_val = pid.Kp * pid.err +
pid.Ki * pid.integral +
pid.Kd * (pid.err - pid.err_last);
/*误差传递*/
pid.err_last = pid.err;
/*返回当前实际值*/
return pid.output_val;
}
周期调用PID计算//周期定时器的回调函数
void AutoReloadCallback()
{
int sum = 0;/*编码器值(PID输入)*/
int res_pwm = 0;/*PWM值(PID输出)*/
/*读取编码器测量的速度值*/
sum = read_encoder();
/*进行PID运算,得到PWM输出值*/
res_pwm = PID_realize(sum);
/*根据PWM值控制电机转动*/
set_motor_rotate(res_pwm);
/*给上位机通道1发送实际值*/
set_computer_value(SEND_FACT_CMD, CURVES_CH1, &sum, 1);
}
上位机
这里使用野火多功能调试助手的"PID调试助手“来进行实验,用于显示PID调节时的电机转速曲线。
实验演示目标速度值设为50(这里的目标值50使用的是编码器10ms捕获的脉冲数),通过体调节PID的参数,来测试电机能否较快的达到目标速度。
先调节P【1】P值先使用10看看效果,从速度曲线可以看出,达不到目标速度,且与目标速度相差较大。
10 | 0 | 0 |
展开全文
相关产品