微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 这个PID怎么调节?

这个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迅速减到很小值再慢慢累加到反馈值和设置值一致,
请问大侠怎么实现?
*/

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top