完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
比例部分的当前误差减去上次误差基本结果很小或直接就等于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。 |
|
相关推荐
1个回答
|
|
数值的问题肯定是程序的问题,先调试好数值测量是正确的再加入PID。
运用到定时器就会涉及到时间的问题,一定要确认好优先级和程序的运行实现,每个定时器之间不能乱掉。 要确认下你的PID算法是否正确,看你写的不好说,你参考这份文档吧。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
4330 浏览 1 评论
1646 浏览 0 评论
3561 浏览 1 评论
【⌈嵌入式机电一体化系统设计与实现⌋阅读体验】+磁力输送机系统设计的创新与挑战
1755 浏览 0 评论
4498 浏览 2 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 00:02 , Processed in 0.798096 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号