一个设定频率,一个测量频率,通过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; } } } |
pid参数整定方法很多,像先比例后积分,最后加微分。从大到小顺序查等等。
如果知道你要控制的目标模型,可以用matlab建模,用仿真的方式整定。
评分
查看全部评分
是这样的,我用两个STM32单片机,1号单片机STM32单片机发生频率F,2号单片机测量这个频率,通过设定目标频率,通过PID算法控制,控制DAC输出电压,1号单片机通过ADC测量这个电压值,发生800-1500HZ频率的,就是不知道PID算法执行OUT参数怎么设置?
你的目的是干什么。有必要兜一个PID的大圈吗。
给一个设备做一个程序,设备在现场,我们每次都去现场测试,只能模拟下这个调节的流程,买程序这个也只需要把这个流程走通就行,他就是研究生的课题,现在1号单片机是没有的,是一个通过DAC改变输出电压,改变压电陶瓷的长度,进而调节激光器的频率。
主要不是做信号发生器,主要做PID调节两路频率,通过DAC改变电压给是一个通过DAC改变输出电压,改变压电陶瓷的长度,进而调节激光器的频率,使这个频率与设定的目标频率在一定的范围内,做一个这个PWM发生方波就是模拟现场这个设备。
那就是说,你不知道目标系统的响应情况,也就是不能用1号机模拟出目标系统的真实过程,也就是用1号机来调PID参数结果也是不怎么靠谱的。
忘掉1号机,去现场连接目标机进行参数调节。
是的,他这个就是研究生的一个课题,做出来就接业了,没那么高的要求,其实我也想去现场搞一把,但他们仪器很精密,估计不给随便接吧,他们那太设备好像是清华大学给设计的。