登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看2738|回1|收藏
楼主 ID:264387 只看他
2021-6-4 14:53
#include "pid.h"

PID pid; //存放PID算法所需要的数据

//          pid.Sv=120;        //用户设定温度
//        pid.Kp=30;         //比例系数
//        pid.T=500;         //PID计算周期
//          pid.Ti=5000000;         //积分时间
//        pid.Td=1000;         //微分时间
//        pid.pwmcycle=200;        //pwm周期1000
//        pid.OUT0=1;
void PID_Calc()  //pid计算
{
        float DelEk;
        float ti,ki;
        float td;
        float kd;
        float out;
if(pid.C10ms<(pid.T))  //计算周期未到
{
    return ;
}

pid.Ek=pid.Sv-pid.Pv;   //当前的偏差值 = 设定值 - 返回值
pid.Pout=pid.Kp*pid.Ek; //比例输出 = 比例系数*偏差

pid.SEk+=pid.Ek;        //历史偏差总和

DelEk=pid.Ek-pid.Ek_1;  //最近两次偏差之差

ti=pid.T/pid.Ti;  //系数1

ki=ti*pid.Kp;     // 系数2

  pid.Iout=ki*pid.SEk*pid.Kp;  //积分输出 = 系数2 * 偏差和 * 比例系数

td=pid.Td/pid.T;   //系数3

kd=pid.Kp*td;      //系数4

pid.Dout=kd*DelEk; //微分输出 = 系数4 * 最近两次偏差和

out= pid.Pout+ pid.Iout+ pid.Dout; //PID输出 = 比例输出 + 积分输出 + 微分输出

///////////////////////////输出保护///////////////////////////////
if(out>pid.pwmcycle)
{
  pid.OUT=pid.pwmcycle;
}
else if(out<0)
{
  pid.OUT=pid.OUT0;
}
else
{
  pid.OUT=out;
}
//pid.OUT+=; //本次的计算结果
pid.Ek_1=pid.Ek;  //更新偏差

pid.C10ms=0;
}
沙发 ID:462629 只看他
2021-12-28 10:07
这个能直接使用吗,

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版