完善资料让更多小伙伴认识你,还能领取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。 |
|
相关推荐
4个回答
|
|
不知楼主中断用了多少?
|
|
|
|
|
|
|
|
PID控制采样周期和控制周期选择很重要
|
|
|
|
用定时器控制转速采样,完成采样后进行一次PID控制,不要让PID程序在main函数中的大循环内不停的运行
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12009 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 14:57 , Processed in 0.720860 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号