欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 78|回复: 0

PID-温控类-51单片机温度PID控制程序1602显示

[复制链接]
发表于 2023-7-26 11:35:16 | 显示全部楼层 |阅读模式
51单片机温度PID控制程序1602显示
以下是部分代码
  1. /******************************************************************

  2. Main.C  file
  3. 作者:颜强
  4. 建立日期: 2011.12.23
  5. 版本:V1.0
  6. Copyright(C) bg8wj
  7. /*******************************************************************/
  8. #include "ioconfig.h"
  9. #include "includes.h"
  10. #include "datacomm.h"
  11. /************************************************
  12.               PID函数
  13. *************************************************/
  14. void PIDInit (struct PID *pp)
  15. {
  16.   memset ( pp,0,sizeof(struct PID));
  17. }
  18. /************************************************
  19.               增量控制PID函数体
  20. 51单片机最不擅长浮点数计算,转换成int型计算
  21. *************************************************/
  22. unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
  23. {
  24.   unsigned int dError,Error,pError;
  25.   //增量法计算公式:
  26.   //Pdt=Kp*[E(t)-E(t-1)]+Ki*E(t)+Kd*[E(t)-2*E(t-1)+E(t-2)]
  27.   Error = set_temper - NextPoint;       // 偏差E(t)
  28.   pError=Error-pp->LastError;         //E(t)-E(t-1)
  29.   dError=Error-2*pp->LastError+pp->PrevError; //E(t)-2*E(t-1)+E(t-2)
  30.   pp->PrevError = pp->LastError;
  31.   pp->LastError = Error;
  32.   return (
  33.             pp->Proportion * pError        //比例
  34.             + pp->Integral *Error  //积分项
  35.             + pp->Derivative * dError          // 微分项
  36.                         );  
  37. }

  38. /************************************************
  39.                                 PID函数初始化
  40. *************************************************/
  41. void PIDBEGIN()
  42. {
  43.   PIDInit(&spid); // Initialize Structure
  44.   spid.Proportion = 10; // Set PID Coefficients
  45.   spid.Integral = 5;
  46.   spid.Derivative =4;
  47. }
  48. /************************************************
  49.                          实时温度读取函数
  50. 从DS18b20中读取实时温度
  51. 返回值放大10倍便于PID计算
  52. *************************************************/
  53. int ReadTemperature(void)
  54. {
  55.         unsigned char TPL=0;
  56.         unsigned char TPH=0;
  57.         unsigned int temperture=0;

  58.         //EA = 0;                 
  59.         Init_DS18B20();
  60.         WriteOneChar(0xCC); //跳过读序号列号的操作
  61.         WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  62.         TPL=ReadOneChar();        //读温度低字节
  63.         TPH=ReadOneChar();        //读温度高字节

  64.         //启动下一次温度转换
  65.         Init_DS18B20();
  66.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  67.         WriteOneChar(0x44); // 启动温度转换
  68.          //temperture=(TPH*256+TPL)*0.0625   //真实温度值 范围(+125,-55)
  69.         if(TPH&0xfc)
  70.          {
  71.            tp_flag=1;    //负温度标记
  72.            temperture=((TPH<<8)|TPL);
  73.            temperture=((~temperture)+1);
  74.            temperture*=0.625+0.5;
  75.          }
  76.         else
  77.          {
  78.            tp_flag=0;
  79.            //temperture=((TPH<<8)|TPL)*0.0625 //温度输出值范围(125.00,-55.00)
  80.            temperture=((TPH<<8)|TPL)*0.625+0.5;//温度值放大10倍 范围(+1250.00,-550.00)
  81.          }                                                                        //         +0.5四舍五入 精度只到小数后一位
  82.         return(temperture);         
  83. }
  84. /************************************************
  85.                                   lcd1602显示函数
  86. *************************************************/
  87. void xianshi(void)
  88. {
  89.     LCD_Write_String(0,0,"NOW TMP:");
  90.         LCD_Write_String(0,1,"SET TMP:");
  91. }
  92. /************************************************
  93.                         lcd1602显示实时温度
  94. *************************************************/
  95. void view(unsigned int tmp)
  96. {
  97.         LCD_Write_Char(15,0,'C');
  98.         LCD_Write_Char(14,0,0xdf);//摄氏温度符号
  99.         LCD_Write_Char(13,0,zhi[tmp%10]);//小数点后第1位
  100.         LCD_Write_Char(12,0,'.');                 
  101.         LCD_Write_Char(11,0,zhi[tmp%100/10]);//        个位
  102.         LCD_Write_Char(10,0,zhi[tmp/100]);         //十位
  103.         if(0==tmp/1000)LCD_Write_Char(9,0,' ');//百位 如果为零显示空格
  104.         else
  105.          LCD_Write_Char(9,0,zhi[tmp/1000]);
  106.         if(1==tp_flag)LCD_Write_Char(8,0,'-');//正负温度符号显示 负温度显示- 0上显示空格
  107.          else
  108.          LCD_Write_Char(8,0,' ');
  109. }
  110. /***********************************************************
  111.              PID温度控制做动函数
  112. ***********************************************************/
  113. void compare_temper()                 //PID温度控制输出函数
  114. {
  115.   unsigned char i;
  116.   
  117.   if(set_temper>temper)
  118.    {
  119.     if(set_temper-temper>50)//如果控制目标温度温与实时温度差大于5度,(放大10倍)是50
  120.      {
  121.       
  122.            PWM0_set(10); //PWM 输出高电平占空比最大。即全速加温
  123.            PWM1_set(10);
  124.      }
  125.         else
  126.     {
  127.      for(i=0;i<10;i++) //5度范围内PID增量控制,10次周期 即PID积分式中T=10
  128.      {
  129.       rin=ReadTemperature();//PID输入实时温度采样值
  130.       rout = PIDCalc ( &spid,rin ); // PID增量输出
  131.      }//PID增量输出范围(0-255)配合pwm取值范围
  132.      send_string_com("pid out:"); //串口输出监视数据
  133.          send_char_com(rin); //实时温度值
  134.          send_char_com(rout);//PID增量输出值
  135.          send_char_com(0x0d);//输出回车,换行间隔控制字符
  136.          send_char_com(0x0a);//
  137.          
  138.          if(rout>=240)rout=240;        //保障PWM输入值10-240 防止pwm出现失调。stc单片机特性。
  139.          if(rout<=20)rout=20;
  140.          
  141.          PWM0_set(255-rout);
  142.          PWM1_set(255-rout);
  143.           
  144.     }
  145.    }
  146.   else if(set_temper<=temper) //目标温度小于实时温度pwm输出低电平最高占空比,关闭加热。
  147.    {
  148.      PWM0_set(250);
  149.          PWM1_set(250);
  150.    }
  151. }
  152. /************************************************
  153.                         系统初始化函数
  154. *************************************************/
  155. void Sys_Init()                                                               
  156. {
  157. PWM_init();
  158. PIDBEGIN();
  159. LCD_Init();
  160. Init_DS18B20();
  161. LCD_Clear();
  162. InitUart1();
  163. }
  164. /*************************************************
  165.                   主函数
  166. **************************************************/
  167. void main(void)
  168. {        
  169. Sys_Init();                //系统初始化
  170. xianshi();                        //显示字符
  171. PWM0_set(250);                //初始化PWM两路输出最高低电平占空比,不要加热
  172. PWM1_set(250);
  173. delay500ms();                //延时稍等芯片初始化
  174. while(1)
  175.   {  
  176.            EA=0;
  177.           k=KeyPro();            //键盘扫描
  178.           if(k!=0xff)
  179.            {
  180.            if(k==15){i=0;shu[0]=0;shu[1]=0;shu[2]=0;shu[3]=0;}
  181.            else{shu[i]=k;i++;if(i>3)i=0;}//键值15对应清除设定温度显示及数组为0
  182.          }
  183.          if(k==14)//键值14键 置入设定温度并确定 输入格式xxx+确定键 第一位是百度 为0需要输入0
  184.          {
  185.           EA=1;
  186.           set_temper=1000*(shu[0])+100*shu[1]+10*shu[2];
  187.           compare_temper();        //启动PID温度控制作动函数
  188.          }
  189.         LCD_Write_Char(15,1,'C');        //显示设定温度值百位为0时 显示空格 但是输入必须输入0
  190.            LCD_Write_Char(14,1,0xdf); //温标符号
  191.         LCD_Write_Char(13,1,zhi[0]);
  192.         LCD_Write_Char(12,1,'.');
  193.         LCD_Write_Char(11,1,zhi[shu[2]]);
  194.         LCD_Write_Char(10,1,zhi[shu[1]]);
  195.        
  196.         if(shu[0]==0)LCD_Write_Char(9,1,' ');
  197.         else LCD_Write_Char(9,1,zhi[shu[0]]);   
  198.        
  199.         if(counter-- == 0) //温度联系读5次
  200.          {
  201.           temper=ReadTemperature();                        
  202.           counter =5;
  203.          }
  204.         view(temper);    //温度显示;
  205.         if(!set_temper==0)compare_temper();//只有设置目标温度后才启动PID温控作动函数       
  206. }
  207. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2025-10-31 17:10

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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