找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5722|回复: 1
收起左侧

基于单片机温度控制的PID算法及C程序实现

  [复制链接]
ID:711352 发表于 2020-4-22 10:18 | 显示全部楼层 |阅读模式
温度控制系统是一个惯性较大的系统,也就是说, 当给温区开始加热之后,并不能立即观察得到温区温度的明显上升;同样的, 当关闭加热之后, 温区的温度仍然有一定程度的上升。 另外,热电偶对温度的检测, 与实际的温区温度相比较,也存在一定的滞后效应。所以,传统的定点开关控制温度会有正负误差几度的现象, 但这不是温度控制器本身的问题, 而是整个热系统的结构性问题,使温度控制器控温产生一种惯性温度误差。这也给温度的控制带来了困难。
要解决温度控制器这个问题, 采用PID控制技术, 是明智的选择。PID控制,是针对以上的情况而制定的、新的温度控制方案,用先进的数码技术通过 Pvar、Ivar 、Dvar三方面的结合调整,形成一个模糊控制,来解决惯性温度误差问题。

基于单片机温度控制的PID算法的C 程序如下:
  1. /*
  2. pid 算法 C 源程序,还有实现 pid 自动调整。 51 用于控制温度 26-100 摄氏度。
  3. TIME:2018-07-29 20:15:07
  4. */
  5. #include <stdlib.h>
  6. #include "global_varible.h"
  7. /****************************************************************************
  8. * 模块名 : PID
  9. * 描述 : PID 调节子程序
  10. * 采用 PID-PD 算法。在偏差绝对值大于△ e 时,用 PD 算法,以改善动态品质。
  11. * 当偏差绝对值小于△ e 时,用 PID 算法,提高稳定精度。
  12. * PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
  13. *=====================================================================
  14. =======
  15. * 入口 : 无
  16. * 出口 : 无
  17. * 改变 : PID_T_Run= 加热时间控制
  18. *****************************************************************************/
  19. void PID_Math(void)
  20. {
  21. signed long ee1; //偏差一阶
  22. //signed long ee2; //偏差二阶
  23. signed long d_out; // 积分输出
  24. if(!Flag_PID_T_OK)
  25. return;
  26. Flag_PID_T_OK = 0;
  27. Temp_Set = 3700; //温度控制设定值 37.00 度
  28. PID_e0 = Temp_Set - Temp_Now; // 本次偏差
  29. ee1 = PID_e0 - PID_e1; //计算一阶偏差
  30. //ee2 = PID_e0-2*PID_e1+PID_e2; //计算二阶偏差
  31. //一阶偏差的限制范围
  32. if(ee1 > 500) ee1 = 500;
  33. if(ee1 < -500) ee1 = -500;
  34. PID_e_SUM += PID_e0; //偏差之和
  35. //积分最多累计的温差
  36. if(PID_e_SUM > 200) PID_e_SUM = 200;
  37. if(PID_e_SUM < -200) PID_e_SUM = -200;
  38. PID_Out = PID_kp * PID_e0 + PID_kd * ee1; //计算 PID 比例和微分输出
  39. if(abs(PID_e0) < 200) //如果温度相差小于 1.5 度则计入 PID 积
  40. 分输出
  41. {
  42. if(abs(PID_e0) > 100){ //如果温度相差大于 1 度时积分累计限制
  43. if(PID_e_SUM > 100) PID_e_SUM = 100;
  44. if(PID_e_SUM < -100) PID_e_SUM = -100;
  45. }
  46. d_out = PID_ki * PID_e_SUM; //积分输出
  47. if(PID_e0 < -5){ //当前温度高于设定温度 0.5 度时积分累
  48. 计限制
  49. if(PID_e_SUM > 150) PID_e_SUM = 150;
  50. if(PID_e_SUM > 0) d_out >>= 1; //当前温度高于设定温度 0.5 度时削弱积
  51. 分正输出
  52. }
  53. PID_Out += d_out; //PID 比例 ,积分和微分输出
  54. }
  55. else
  56. PID_e_SUM=0;
  57. PID_Out /= 100; //恢复被 PID_Out 系数放大的倍数
  58. if(PID_Out > 200) PID_Out=200;
  59. if(PID_Out<0) PID_Out=0;
  60. if(PID_e0 > 300) PID_Out=200; //当前温度比设定温度低 3 度则全速加热
  61. if(PID_e0 < -20) PID_Out=0; //当前温度高于设定温度 0.2 度则关闭加

  62. Hot_T_Run = PID_Out; //加热时间控制输出
  63. // PID_e2 = PID_e1; //保存上次偏差
  64. PID_e1 = PID_e0; //保存当前偏差
  65. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:97678 发表于 2024-10-24 07:54 | 显示全部楼层
global_varible.h  这个文件可以提供吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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