找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10898|回复: 3
收起左侧

一个简单的PID单片机算法程序

[复制链接]
ID:372048 发表于 2018-9-11 20:52 | 显示全部楼层 |阅读模式
用单片机做的,在电机测试了可以用。就是开机的时候,会最大转速输出,有点噪音

单片机源程序如下:
  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)
回复

使用道具 举报

ID:101990 发表于 2019-4-22 15:42 | 显示全部楼层
学习学习啦!!!谢谢!!
回复

使用道具 举报

ID:602230 发表于 2019-8-21 09:21 | 显示全部楼层
学习学习啦!!!谢谢!!
回复

使用道具 举报

ID:593177 发表于 2019-9-4 10:08 | 显示全部楼层
感谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表