12514|40

4996

帖子

19

TA的资源

裸片初长成(初级)

楼主
 

重磅出击,PID温度采集工具 [复制链接]

 
本帖最后由 zhaojun_xf 于 2014-11-5 14:19 编辑

       最近开发了一款智能电焊台,采用PID算法进行温度控制,并随手设计了一个温度采集工具,现在开源给大家,由于是公司项目并不开放智能焊台的代码与图纸,只开源PID温度采集工具和PID算法代码。

1. 首先看看工具吧:



本工具采用VB编程,通过串口进行温度,PWM等参数的传递,最好通过画图的形式表现出来: PID软件.zip (137.88 KB, 下载次数: 88, 售价: 10 分芯积分) MSCOMM32.zip (49.4 KB, 下载次数: 184)








此帖出自stm32/stm8论坛

最新回复

谢谢楼主分享!!!   详情 回复 发表于 2022-7-30 08:54

赞赏

4

查看全部赞赏

点赞 关注(7)
个人签名我的博客
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

推荐
 
本帖最后由 zhaojun_xf 于 2014-11-5 14:05 编辑

串口上传温度数据格式:


此帖出自stm32/stm8论坛
 
个人签名我的博客
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

板凳
 
2. 工作原理:

    PID的参数值通过串口发送给下位机,下位机安装此参数进行PID运行,后转换为PWM波开关mos管,从而控制手柄的温度值。手柄上的温度是通过AD采集手柄上的温度传感器实现,采样频率为10ms一次,而控制PID的运算和PWM波的输出则采用300ms的时间。至于为什么是这个值,这个是没有理由的,是通过系统特性调节出来的,而且PID的初始化值已经放大了100倍。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

4
 
3. PID代码如下:

  1. /**************************************************************************************
  2. *                             
  3. *                                    Address
  4. *  
  5. *                    (c) Copyright 20xx, Company Name, City, State
  6. *                               All Rights Reserved
  7. *
  8. *
  9. * FileName       : pid.h
  10. * Version        : V1.0
  11. * Programmer(s)  :
  12. * Parameters     :
  13. * DebugTools     :
  14. * Description    :
  15. *
  16. *
  17. **************************************************************************************/

  18. #ifndef __PID_H
  19. #define __PID_H

  20. /**************************************************************************************
  21. * Pin Definition                                                
  22. **************************************************************************************/

  23. /**************************************************************************************
  24. * Macro Definition                                                
  25. **************************************************************************************/
  26. #define PID_WRK_PGN      50                                                     // 温差小于时PID工作
  27. #define PID_ERR_PGN      1                                                      // 允许误差
  28. #define PID_CHG_PGN      20                                                     // PID改变范围

  29. /**************************************************************************************
  30. * Variable definition                                               
  31. **************************************************************************************/                                     
  32. typedef struct
  33. {
  34.     u16  SetPnt;                                                                // 设定目标 Desired Value  
  35.     u8   LstOut;
  36.    
  37.     u8   ProCon;                                                                // 比例常数 Proportional Const  
  38.     u8   IntCon;                                                                // 积分常数 Integral Const  
  39.     u8   DerCon;                                                                // 微分常数 Derivative Const  
  40.      
  41.     s8   LstErr;                                                                // Err[-1]  
  42.     s8   PrvErr;                                                                // Err[-2]  
  43.     s16  SumErr;                                                                // Sums of Errs
  44.    
  45. } PID_STR;

  46. extern PID_STR PID;

  47. /**************************************************************************************
  48. * Internal Function                                                  
  49. **************************************************************************************/

  50. /**************************************************************************************
  51. * Global Function                                                
  52. **************************************************************************************/
  53. extern void PIDInit(u8 pVal, u8 iVal, u8 dVal);                                 // 初始化
  54. extern void PIDClearErr(void);                                                  // 清除误差
  55. extern void PIDSetPoint(u16 sVal);                                              // 设置目标温度
  56. extern u8   PIDCalc(s16 next);                                                  // 运算

  57. /*************************************************************************************/
  58. #endif

  59. /**************************************************************************************
  60. * end of file         
  61. **************************************************************************************/
复制代码


此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

5
 
  1. /**************************************************************************************
  2. *                             
  3. *                                    Address
  4. *  
  5. *                    (c) Copyright 20xx, Company Name, City, State
  6. *                               All Rights Reserved
  7. *
  8. *
  9. * FileName       : pid.c
  10. * Version        : V1.0
  11. * Programmer(s)  : zhaojun_xf
  12. * Parameters     :
  13. * DebugTools     :
  14. * Description    :
  15. *
  16. *
  17. **************************************************************************************/

  18. /**************************************************************************************
  19. * HeaderFiles                           
  20. **************************************************************************************/
  21. #include "../User/config.h"

  22. /**************************************************************************************
  23. * Variable Definition                           
  24. **************************************************************************************/
  25. PID_STR PID;

  26. /**************************************************************************************
  27. * FunctionName   : PIDInit()
  28. * Description    : 初始化
  29. * EntryParameter : PID - 三参数初始化[放大10倍]
  30. * ReturnValue    : None
  31. **************************************************************************************/
  32. void PIDInit(u8 pVal, u8 iVal, u8 dVal)
  33. {
  34.     PID.ProCon = pVal;                                                          // 比例常数 ProConal Const  
  35.     PID.IntCon = iVal;                                                          // 积分常数 IntCon Const  
  36.     PID.DerCon = dVal;                                                          // 微分常数 DerCon Const  
  37. }

  38. /**************************************************************************************
  39. * FunctionName   : PIDClearErr()
  40. * Description    : 清除误差
  41. * EntryParameter : None
  42. * ReturnValue    : None
  43. **************************************************************************************/
  44. void PIDClearErr(void)
  45. {
  46.     PID.LstErr = 0;                                                             // Err[-1]  
  47.     PID.PrvErr = 0;                                                             // Err[-2]  
  48.     PID.SumErr = 0;                                                             // Sums of Errs
  49. }

  50. /**************************************************************************************
  51. * FunctionName   : PIDSetPoint()
  52. * Description    : 设置目标温度
  53. * EntryParameter : sVal - 目标温度
  54. * ReturnValue    : None
  55. **************************************************************************************/
  56. void PIDSetPoint(u16 sVal)
  57. {
  58.     PID.SetPnt = sVal;
  59. }

  60. /**************************************************************************************
  61. * FunctionName   : PIDCalc()
  62. * Description    : 运算 PID = Uk + KP*[E(k)-E(k-1)] + KI*E(k) + KD*[E(k)-2E(k-1)+E(k-2)](增量型PID算式)
  63. * EntryParameter : nxtPnt - 实时值
  64. * ReturnValue    : None
  65. **************************************************************************************/
  66. u8 PIDCalc(s16 nxtPnt)
  67. {
  68.     s16 dErr, tErr, uOut;
  69.     u8 outPwm;
  70.    
  71.     tErr        = PID.SetPnt - nxtPnt;                                          // 偏差e(k-2)
  72.     dErr        = PID.LstErr - PID.PrvErr;                                      // 当前微分
  73.    
  74.     PID.SumErr += tErr;                                                         // 积分  
  75.     PID.PrvErr  = PID.LstErr;                                                   // 更新e(k-2)
  76.     PID.LstErr  = tErr;                                                         // 更新e(k-1)

  77.     if (abs(tErr) >= PID_WRK_PGN)                                                // 开关控制
  78.     {
  79.         uOut = (tErr > 0) ? 100 : -100;
  80.     }
  81.     else if (abs(tErr) <= PID_ERR_PGN)                                          // 允许误差
  82.     {
  83.         uOut = 0;
  84.     }
  85.     else
  86.     {
  87.         uOut = PID.ProCon * tErr       +                                        // 比例
  88.                PID.IntCon * PID.SumErr +                                        // 积分项
  89.                PID.DerCon * dErr ;                                              // 微分项
  90.          
  91.         uOut = uOut / 100;                                                      // 放大100
  92.         
  93.         if (uOut > PID_CHG_PGN)        uOut = PID_CHG_PGN;
  94.         else if (uOut < -PID_CHG_PGN)  uOut = -PID_CHG_PGN;
  95.     }

  96.     if   ((uOut < 0) && (PID.LstOut < abs(uOut))) outPwm = 0;                   // 不能输出负数
  97.     else outPwm = PID.LstOut + uOut;
  98.     if   (outPwm > 100) outPwm = 100;
  99.    
  100. #if 0
  101.     u8 tmpBuf[] = {"OUT:      "};
  102.     u16 tmpDat;
  103.      
  104.     if (uOut < 0)
  105.     {
  106.         tmpBuf[4] = '-';
  107.         tmpDat = (0xFFFF-uOut) + 1;
  108.     }
  109.     else
  110.     {
  111.         tmpDat = uOut;
  112.     }
  113.    
  114.     OSLong2Asc(&tmpBuf[5], 4, tmpDat, 10);
  115.     UARTSendStr(tmpBuf);     
  116.         
  117.     u8 tmpBuf1[] = {"LST:    % "};
  118.     OSLong2Asc(&tmpBuf1[5], 3, PID.LstOut, 10);
  119.     UARTSendStr(tmpBuf1);
  120.    
  121.     u8 tmpBuf2[] = {"PWM:    % "};
  122.     OSLong2Asc(&tmpBuf2[5], 3, outPwm, 10);
  123.     UARTSendStr(tmpBuf2);   
  124.         
  125.     u8 tmpBuf3[] = {"TMP:     °\r\n"};
  126.     OSLong2Asc(&tmpBuf3[5], 4, AppDat.HndTemp, 10);
  127.     UARTSendStr(tmpBuf3);
  128.    
  129. #endif
  130.    
  131.     PID.LstOut = outPwm;
  132.     return outPwm;   
  133. }

  134. /**************************************************************************************
  135. * end of file                  
  136. **************************************************************************************/
复制代码

此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

6
 
代码非常简单,程序架构采样的是我自己设计的时间片轮询,所以实现这些时间是非常简单的。PWM是通过定时器实现的,PWM波的频率为100Hz。
此帖出自stm32/stm8论坛

点评

查询时间间隔是多少呢???还是一直查询呢????  详情 回复 发表于 2014-11-27 16:54
 
个人签名我的博客
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

7
 
支持,已购买附件
此帖出自stm32/stm8论坛
 
个人签名    懒得很
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

8
 

此帖出自stm32/stm8论坛
 
个人签名    懒得很
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

9
 
本帖最后由 zhaojun_xf 于 2014-11-5 14:17 编辑

忘了打包这个控件了,不好意思。后面添加上了。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

10
 
谢谢分享,有空学习一下!!
此帖出自stm32/stm8论坛
 
 
 

回复

5979

帖子

8

TA的资源

版主

11
 
搞的不错!
此帖出自stm32/stm8论坛
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

415

帖子

2

TA的资源

一粒金砂(高级)

12
 
学习了!!
此帖出自stm32/stm8论坛
 
个人签名只要你心中有梦想,你人在哪里,梦想就在哪里!
 
 

回复

222

帖子

0

TA的资源

一粒金砂(高级)

13
 
好东西,上位机是用什么编的啊
此帖出自stm32/stm8论坛

点评

不错,好项目。楼主说了用 VB 开发的。  详情 回复 发表于 2014-11-5 16:29
VB 6.0  详情 回复 发表于 2014-11-5 16:29
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

14
 
luooove 发表于 2014-11-5 16:09
好东西,上位机是用什么编的啊

VB 6.0                  
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

15
 
luooove 发表于 2014-11-5 16:09
好东西,上位机是用什么编的啊

不错,好项目。楼主说了用 VB 开发的。
此帖出自stm32/stm8论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

16
 
zhaojun_xf 发表于 2014-11-5 13:56
代码非常简单,程序架构采样的是我自己设计的时间片轮询,所以实现这些时间是非常简单的。PWM是通过定时器 ...
查询时间间隔是多少呢???还是一直查询呢????
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 
xuexile
此帖出自stm32/stm8论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

18
 
不错,好项目
此帖出自stm32/stm8论坛
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(中级)

19
 
Good data, nice job !!!
此帖出自stm32/stm8论坛
 
 
 

回复

793

帖子

8

TA的资源

纯净的硅(中级)

20
 
楼主威武
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表