标题: 一个简单的PID单片机算法程序 [打印本页]

作者: doublecityggb    时间: 2018-9-11 20:52
标题: 一个简单的PID单片机算法程序
用单片机做的,在电机测试了可以用。就是开机的时候,会最大转速输出,有点噪音

单片机源程序如下:
  1. void Pid_regulate(void)
  2. {
  3.         u8 TempError;
  4.         u8 TempAngle;
  5.         if(Pid_Ts != 0)
  6.         {
  7.                 return;                //采样时间未到,退出
  8.         }
  9.         Pid_ts = 0x1a;        //重置采样时间
  10.         TempError = Temp_Setting - TempOp;        //温度误差
  11.         Integral = Integral + Ki * TempError;                //误差* 积分增益并累加
  12.         if(Integral > 1024)
  13.                 Integral = 1024;
  14.         else if(Integral < -1024)
  15.                 Integral = -1024;
  16.         TempAngle = FeedFwd_agnle(Templn,Voltage,WaterFlow);
  17.         TempAngle = Kp * TempError;
  18.         TempAngle = TempAngle + (Integral >> 4);//累加
  19.         if(TempAngle < 2)
  20.                 TempAngle = 2;                //下限
  21.         else if(TempAngle > 200)
  22.                 TempAngle = 200;                //上限
  23.         Fire_angle = 200 - (u8)TempAngle;        //得到触发角

  24. }

  25. void PID(void)
  26. {
  27.         float ek,ek1,ek2,ek_sum;
  28.         uint a;
  29.         ek=K-temp; //计算误差
  30.         while(1)
  31.         {
  32.                 if(ON_OFF==1) //温控开关开
  33.                 {
  34.                         if(ek>=15)
  35.                         {
  36.                                 outflag=1;
  37.                                 OUT=0;
  38.                                 Time_on=100;
  39.                                 break;
  40.                         } //温差大于15度,不用PID调节
  41.                         else if(ek<0)
  42.                         {
  43.                                 ek=0;
  44.                                 outflag=0;
  45.                                 OUT=1;
  46.                                 Time_on=0;
  47.                                 break;
  48.                         } //温差小于等于0不调节
  49.                         else
  50.                         {
  51.                                 if(ek>5)
  52.                                         a=0;
  53.                                 if(ek<5)
  54.                                         a=1;
  55.                                 ek2=ek1;
  56.                                 ek1=ek;
  57.                                 ek_sum+=ek;
  58.                                 uk=kp*ek+ki*ek_sum+kd*(ek1-ek2);
  59.                                 //计算PID输出uk
  60.                                 if(start_flag==0) //PID运算标志位
  61.                                 {
  62.                                         uk0=uk; //uk初值,用于参考以后uk加热时间
  63.                                         start_flag=1;
  64.                                         div=100/uk0;
  65.                                 } //开始PID计算
  66.                                 else if(start_flag==1)//加热片加热时间
  67.                                 {
  68.                                         Time_on=uk*div;
  69.                                         OUT=0;
  70.                                         outflag=1;
  71.                                 }
  72.                                 break;
  73.                         }
  74.                 }
  75.                 else
  76.                 {
  77.                         outflag=0;
  78.                         OUT=1;
  79.                         break;
  80.                 } //不加热
  81.         }
  82. }
复制代码

所有资料51hei提供下载:
Pid.rar (861 Bytes, 下载次数: 99)



作者: li96261    时间: 2019-4-22 15:42
学习学习啦!!!谢谢!!
作者: zhaocheng_er    时间: 2019-8-21 09:21
学习学习啦!!!谢谢!!
作者: ultra梦幻雨    时间: 2019-9-4 10:08
感谢分享!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1