比例部分的当前误差减去上次误差基本结果很小或直接就等于0呢。也就是比例部分没起作用,我想请教一下可能是什么原因呢?比如每次执行pid计算,PID计算函数变量都被置0了(我使用了全局变量,值应该保存到下次了)?采样频率不对,采样速度太快,两次之间的采样差值太小相减后约等于0????采样的频率有没有讲究?在程序中应该怎样体现??用定时器去定时的开合这个采样程序以控制采样周期(速度采样也是采集频率,也就是用一个定时器定时的控制另一个采样定时器的工作/停止??)????能给个思路?感激不尽!!!!!!!!!!!
这是PID的代码片段,传递的参数第一个是设定的转速,第二个是测得的转速。采用的是增量式PID。主函数中获取设定的转速以及测得的即时转速,调用这个函数计算出增量。转速的测量采用定时器采集频率,这个采集程序没做什么处理,就是让它不停的采集,50次后平均一下,通过全局变量将转速传出。所以这样会不会耽误主程序的效率以及这样还有没有采样周期的概念了??毕竟只是不停的工作???求解??
u16 PID_realize(u16 setSpeed,u16 measuredSpeed)
{
float incSpeed=0.0;
float Local_PID_pErr,Local_PID_dErr,Local_PID_iErr;
mypid.SetSpeed=setSpeed;
mypid.ActualSpeed=measuredSpeed;
mypid.err=mypid.SetSpeed-mypid.ActualSpeed;
Local_PID_pErr = mypid.err-mypid.err_next;
Local_PID_dErr = mypid.err-2*mypid.err_next+mypid.err_last;
Local_PID_iErr = mypid.err;
incSpeed=mypid.Kp*Local_PID_pErr+mypid.Ki*Local_PID_iErr+mypid.Kd*Local_PID_dErr;
mypid.err_last=mypid.err_next;
mypid.err_next=mypid.err;
return (int)(incSpeed);
}
传递的参数第一个是设定的转速,第二个是测得的转速。采用的是增量式PID。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
运用到定时器就会涉及到时间的问题,一定要确认好优先级和程序的运行实现,每个定时器之间不能乱掉。
要确认下你的PID算法是否正确,看你写的不好说,你参考这份文档吧。
PID控制原理及编程方法.pdf 下载积分: 积分 -1 分
460.82 KB, 下载次数: 51, 下载积分: 积分 -1 分
一周热门 更多>