这个PID怎么调节?
时间:10-02
整理:3721RD
点击:
#include<stdio.h>
#include<stdlib.h>
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迅速减到很小值再慢慢累加到反馈值和设置值一致,
请问大侠怎么实现?
*/
#include<stdlib.h>
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迅速减到很小值再慢慢累加到反馈值和设置值一致,
请问大侠怎么实现?
*/
在PID_realize(float speed)函数里面判断ncrementSpeed是否为0,如果不是0就DAC(0),然后把DAC(speed);//更新占空比输出这句改为一个for语句,让DAC(0)到DAC(pid.ActualSpeed)逐渐升高