完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#include float incrementSpeed; float speed; int set_shu,fb_shu;//设置数,反馈数 int pwm; struct _pid{ float SetSpeed; //定义设定值 float ActualSpeed; //定义实际值 float err; //定义偏差值 float err_next; //定义上一个偏差值 float err_last; //定义最上前的偏差值 float Kp,Ki,Kd; //定义比例、积分、微分系数 }pid; void PID_init(){ pid.SetSpeed=0.0; pid.ActualSpeed=0.0; pid.err=0.0; pid.err_last=0.0; pid.err_next=0.0; pid.Kp=0.2; pid.Ki=1; pid.Kd=0.2; } float PID_realize(float speed){ pid.SetSpeed=speed; pid.err=pid.SetSpeed-pid.ActualSpeed; incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last); pid.ActualSpeed+=incrementSpeed; pid.err_last=pid.err_next; pid.err_next=pid.err; return pid.ActualSpeed; } void DAC(int pwm) { ;//更新占空比函数,占空比为1-1023/1024 } int main() { PID_init();//PID初始化 set_shu=10;//上电设置数为10,调试中输入设置值0-1024。 fb_shu=0;//上电默认反馈为0,调试中输入反馈值0-1024。 while(1) { pid.SetSpeed=set_shu;//读取设置值 pid.ActualSpeed=fb_shu;//读取反馈值 speed=PID_realize(set_shu);//PID计算 DAC(speed);//更新占空比输出 } } /*现况:做了个恒流电源,设置电流10A,上电未接负载,所以反馈值为0,DAC(speed)值为0或很小,DAC基本无输出,过很久时间后,电流可以慢慢达到设定值,达到设定值后就很稳定了, 想要的结果是:设置值>反馈值很多,DAC输出1024最大,一但检测到反馈信号,DAC迅速减到很小值再慢慢累加到反馈值和设置值一致, 请问大侠怎么实现? */ |
|
相关推荐
1个回答
|
|
在PID_realize(float speed)函数里面判断ncrementSpeed是否为0,如果不是0就DAC(0),然后把DAC(speed);//更新占空比输出这句改为一个for语句,让DAC(0)到DAC(pid.ActualSpeed)逐渐升高
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32串口接受中断使用C++STL中的queue导致所有中断失效
3507 浏览 1 评论
2717 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1289 浏览 0 评论
3571 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
3375 浏览 4 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-2 22:41 , Processed in 0.496508 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号