你的位置:大电流电感 > 交流中心

这个PID怎么调节?

2023-09-20 07:16:58      点击:
上一篇:贴片功率电感基础知识#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迅速减到很小值再慢慢累加到反馈值和设置值一致,
请问大侠怎么实现?
*/



在PID_realize(float speed)函数里面判断ncrementSpeed是否为0,如果不是0就DAC(0),然后把DAC(speed);//更新占空比输出这句改为一个for语句,让DAC(0)到DAC(pid.ActualSpeed)逐渐升高