完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
一个设定频率,一个测量频率,通过PID调节控制DAC寄存器的值,这个DAC12位的,执行机构通过这个电压改变频率,这个PID算法的各个参数怎么搞出来?
//extern int U_Set; //extern u16 CCR1_Val; /*==================================================================================================== PID Function The PID (比例、积分、微分) function is used in mainly control applications. PIDCalc performs one iteration of the PID algorithm. While the PID function works, main is just a dummy program showing a typical usage. =====================================================================================================*/ typedef struct PID { float SetPoint; // 设定目标Desired value float Proportion; // 比例常数Proportional Const float Integral; // 积分常数Integral Const float Derivative; // 微分常数Derivative Const float LastError; // Error[-1] float PrevError; // Error[-2] float SumError; // Sums of Errors } PID; /*====================================================================================================/ PID计算部分 =====================================================================================================*/ PID vPID={0,0.1,0.001,0.001,0,0,0}; float PIDCalc( PID *pp, float NextPoint ) { float dError, Error; Error = pp->SetPoint - NextPoint; // 偏差 pp->SumError += Error; // 积分 dError = pp->LastError - pp->PrevError; // 当前微分 pp->PrevError = pp->LastError; pp->LastError = Error; if(pp->SumError>900) pp->SumError=900; else if(pp->SumError<-900) pp->SumError=-900; return (pp->Proportion * Error // 比例项 + pp->Integral * pp->SumError // 积分项 + pp->Derivative * dError // 微分项 ); } float Vol(int vSet,int v3){ float vOut; // PID Response (Output) float vIn; // PID Feedback (Input) vPID.SetPoint = vSet; // Set PID Setpoint vIn = (float)v3; // Read Input vOut = PIDCalc ( &vPID,vIn ); // Perform PID Interation return vOut; } void mian() { while(1) { if(Flag_3S==1) { if(target-TIM_ExtCntFreq>=6||target-TIM_ExtCntFreq<=-6) { Pv=Vol(target,TIM_ExtCntFreq);// PID算法 dac_value=dac_value+Pv/2.04;//DAC 寄存器调节 DAC_SetChannel1Data(DAC_Align_12b_R,dac_value); } led3=~led3; Flag_3S=0; } } } |
|
相关推荐
1个回答
|
|
先要推导输入输出的关系,然后用matlab调节参数,确定参数然后再编程
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
991 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
970 浏览 2 评论
2080 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1177 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 16:46 , Processed in 0.728414 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号