找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1010|回复: 1
打印 上一主题 下一主题
收起左侧

stm32F103单片机温控PID算法源码

  [复制链接]
跳转到指定楼层
楼主
电络铁的温度控制源码
电路原理图如下:

单片机源程序如下:
  1. /*
  2. ==============T20焊台控制器===============
  3. 作者:Bibibili 蔡子CaiZi
  4. 微处理器:STM32F103C8T6
  5. 外部时钟:8MHz
  6. ===================引脚===================
  7. OLED显示屏(7脚SPI):
  8.         OLED_D0  -> PB13
  9.         OLED_D1         -> PB15
  10.         OLED_RES -> PB15
  11.         OLED_DC -> PB11
  12.         OLED_CS -> PB12
  13. 旋转编码器:
  14.         BM_CLK -> PB0
  15.         BM_DT  -> PB3
  16.         BM_SW  -> PB1
  17. 蜂鸣器:
  18.         BEEPER -> PB9
  19. 控制相关:
  20.         NTC         -> PA6
  21.         T12_ADC -> PA4
  22.         HEAT         -> PA0
  23.         SLEEP         -> PA8
  24.         Vm                -> PA2
  25. //此版本的代码实现功能:
  26. //-T12烙铁头的温度测量
  27. //-加热器的分段PID控制
  28. //-通过旋转编码器进行温度控制
  29. //-短按旋转编码器开关可进入休眠模式
  30. //-长按旋转编码器开关的设置菜单
  31. //-手柄运动检测(通过检查振动开关)
  32. //-输入电压检测
  33. //-时间驱动的睡眠/关机模式(通过计算未使用烙的时长)
  34. //-OLED上的信息显示
  35. //-蜂鸣器
  36. //-将用户设置存储到FLASH

  37. */
  38. #include "stm32f10x.h"
  39. #include "main.h"

  40. void menuHandler(void);

  41. extern unsigned char logo[];
  42. char tempStr[10];//电池电压字符串
  43. float volatile VinVolt;//输入电压
  44. u16 volatile NTC_temp,last_NTC_temp;//手柄温度

  45. u16 volatile T12_temp;//烙铁头温度
  46. u16 volatile tempArray[TEMPARRLEN];//温度数组,均值滤波
  47. u16 NTC_tempArray[NTC_TEMPARRLEN];//手柄温度数组,均值滤波
  48. u16 count;
  49. u8 err,err_count;
  50. u8 n;
  51. int main()
  52. {
  53.         u8 i;
  54.         u16 sum;
  55.         KEY_Init();//初始化按键GPIO
  56.         delay_init();//初始化延时函数
  57.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2,2位抢占优先级和2位子优先级
  58.         usart_init(115200);//初始化串口1,波特率为115200
  59.         TIM3_Init(19999,71);//1MHz,每20ms检测按键一次;
  60.         BEEPER_Init();        //BEEPER初始化
  61.         Adc_Init();                //ADC初始化
  62.         HEAT_Init();//加热头控制端初始化
  63.         OLED_Init();        //初始化OLED
  64.         set_Init();//读取用户设置数据
  65.        
  66.         PID_Setup();//PID初始化
  67.         TIM4_Counter_Init(99,719);//定时1ms中断一次
  68.         OLED_Clear();
  69.         OLED_DrawPointBMP(0,0,logo,128,64,1);//显示logo
  70.         OLED_Refresh_Gram();//刷新显存
  71.         delay_ms(1000);
  72.        
  73.         beeperOnce();
  74.         //初始化温度
  75.         NTC_temp = get_NTC_temp();//读取手柄温度
  76.         T12_temp = NTC_temp;
  77.         for(n=0; n<TEMPARRLEN; n++)
  78.         {
  79.                 tempArray[n]=T12_temp;
  80.         }
  81.        
  82.         OLED_Fill(0,0,127,63,0);
  83.         while (1){
  84.                 if(count%100==0)//更新一次
  85.                 {
  86.                         NTC_temp =  get_NTC_temp();//获取一次手柄温度值
  87.                         get_Vin();//获取一次输入电压值
  88.                        
  89.                         if(NTC_temp>=50)
  90.                         {
  91.                                 NTC_temp =last_NTC_temp;
  92.                         }
  93.                         else
  94.                         {
  95.                             last_NTC_temp = NTC_temp;
  96.                         }
  97.                         sum=0;
  98.                         for(i=0;i<NTC_TEMPARRLEN-1;i++)
  99.                         {
  100.                                 NTC_tempArray[i] = NTC_tempArray[i+1];//元素前移
  101.                                 sum += NTC_tempArray[i+1];
  102.                         }
  103.                         NTC_tempArray[NTC_TEMPARRLEN-1] = NTC_temp;
  104.                         sum += NTC_tempArray[NTC_TEMPARRLEN-1];
  105.                         NTC_temp = (u16)sum/NTC_TEMPARRLEN;//均值滤波
  106.                         //手柄连接检测
  107.                         if(NTC_temp>=5&&NTC_temp<=50)
  108.                         {
  109.                                 err_count=0;
  110.                                 err=0;
  111.                         }
  112.                         if((NTC_temp<5||NTC_temp>50)&&err==0)
  113.                         {
  114.                                 err_count++;
  115.                         }
  116.                         if(err_count>=8)
  117.                         {
  118.                                 err=1;//手柄未连接
  119.                         }
  120.                 }
  121.                 if(nowMenuIndex==home && count%800==0)//更新一次home界面
  122.                 {
  123.                         homeWindow();//显示主界面
  124.                         OLED_Refresh_Gram();//刷新显存
  125.                 }
  126.                 if(menuEvent[0])
  127.                 {
  128.                         menuHandler();
  129.                         beeperOnce();
  130.                         if(menuEvent[1]==KEY_enter && nowMenuIndex == home)
  131.                         {
  132.                                 if(sleepFlag) {sleepFlag=0; sleepCount=0;shutCount = 0;}//短按触发关闭休眠
  133.                                 else sleepFlag = 1;
  134.                         }
  135.                         if(shutFlag) {shutFlag=0;shutCount = 0;}//任意按键触发开机
  136.                         lastMenuIndex = nowMenuIndex;
  137.                         menuEvent[0] = 0;
  138.                         OLED_display();
  139.                         STMFLASH_Write(FLASH_SAVE_ADDR,(u16 *)&setData,setDataSize);//写入FLASH
  140.                 }
  141.                 if(setData.sleepTime>0 && sleepCount>setData.sleepTime*600) {sleepFlag=1;}
  142.                 if(setData.shutTime>0 && shutCount>setData.shutTime*600) {shutFlag=1;}
  143.                 count++;
  144.                 delay_us(100);
  145.         }
  146. }
  147. //菜单处理函数
  148. void menuHandler(void)
  149. {
  150.         if(menuEvent[1]==BM_up)
  151.         {
  152.                 switch(nowMenuIndex){
  153.                         case home:
  154.                                 setData.setTemp+=5;
  155.                         break;
  156.                         case xmsjSet:
  157.                                 setData.sleepTime++;
  158.                         break;
  159.                         case gjsjSet:
  160.                                 setData.shutTime++;
  161.                         break;
  162.                         case gzmsSet:
  163.                                 setData.workMode=!setData.workMode;
  164.                         break;
  165.                         case fmqSet:
  166.                                 setData.beeperFlag = !setData.beeperFlag;
  167.                         break;
  168.                         case yyszSet:
  169.                                 setData.langFlag = !setData.langFlag;
  170.                         break;
  171.                 }
  172.         }
  173.         else if(menuEvent[1]==BM_down)
  174.         {
  175.                 switch(nowMenuIndex){
  176.                         case home:
  177.                                 setData.setTemp-=5;
  178.                         break;
  179.                         case xmsjSet:
  180.                                 setData.sleepTime--;
  181.                         break;
  182.                         case gjsjSet:
  183.                                 setData.shutTime--;
  184.                         break;
  185.                         case gzmsSet:
  186.                                 setData.workMode=!setData.workMode;
  187.                         break;
  188.                         case fmqSet:
  189.                                 setData.beeperFlag = !setData.beeperFlag;
  190.                         break;
  191.                         case yyszSet:
  192.                                 setData.langFlag = !setData.langFlag;
  193.                         break;
  194.                 }
  195.         }
  196.         else {}
  197.         if(setData.setTemp>TEMP_MAX) setData.setTemp=TEMP_MAX;
  198.         if(setData.setTemp<TEMP_MIN) setData.setTemp=TEMP_MIN;
  199.         if(setData.sleepTime>60) setData.sleepTime=60;
  200.         if(setData.sleepTime<0) setData.sleepTime=0;
  201.         if(setData.shutTime>60) setData.shutTime=60;
  202.         if(setData.shutTime<0) setData.shutTime=0;
  203. }
复制代码

单片机代码下载: STM32_T12_Controller-main.7z (648.45 KB, 下载次数: 71)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:370590 发表于 2023-11-1 10:48 | 只看该作者
感谢楼主无私奉献。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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