久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2152|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

stm32F103單片機(jī)溫控PID算法源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
電絡(luò)鐵的溫度控制源碼
電路原理圖如下:

單片機(jī)源程序如下:
  1. /*
  2. ==============T20焊臺(tái)控制器===============
  3. 作者:Bibibili 蔡子CaiZi
  4. 微處理器:STM32F103C8T6
  5. 外部時(shí)鐘: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. 旋轉(zhuǎn)編碼器:
  14.         BM_CLK -> PB0
  15.         BM_DT  -> PB3
  16.         BM_SW  -> PB1
  17. 蜂鳴器:
  18.         BEEPER -> PB9
  19. 控制相關(guān):
  20.         NTC         -> PA6
  21.         T12_ADC -> PA4
  22.         HEAT         -> PA0
  23.         SLEEP         -> PA8
  24.         Vm                -> PA2
  25. //此版本的代碼實(shí)現(xiàn)功能:
  26. //-T12烙鐵頭的溫度測(cè)量
  27. //-加熱器的分段PID控制
  28. //-通過旋轉(zhuǎn)編碼器進(jìn)行溫度控制
  29. //-短按旋轉(zhuǎn)編碼器開關(guān)可進(jìn)入休眠模式
  30. //-長按旋轉(zhuǎn)編碼器開關(guān)的設(shè)置菜單
  31. //-手柄運(yùn)動(dòng)檢測(cè)(通過檢查振動(dòng)開關(guān))
  32. //-輸入電壓檢測(cè)
  33. //-時(shí)間驅(qū)動(dòng)的睡眠/關(guān)機(jī)模式(通過計(jì)算未使用烙的時(shí)長)
  34. //-OLED上的信息顯示
  35. //-蜂鳴器
  36. //-將用戶設(shè)置存儲(chǔ)到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];//溫度數(shù)組,均值濾波
  47. u16 NTC_tempArray[NTC_TEMPARRLEN];//手柄溫度數(shù)組,均值濾波
  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();//初始化延時(shí)函數(shù)
  57.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2,2位搶占優(yōu)先級(jí)和2位子優(yōu)先級(jí)
  58.         usart_init(115200);//初始化串口1,波特率為115200
  59.         TIM3_Init(19999,71);//1MHz,每20ms檢測(cè)按鍵一次;
  60.         BEEPER_Init();        //BEEPER初始化
  61.         Adc_Init();                //ADC初始化
  62.         HEAT_Init();//加熱頭控制端初始化
  63.         OLED_Init();        //初始化OLED
  64.         set_Init();//讀取用戶設(shè)置數(shù)據(jù)
  65.        
  66.         PID_Setup();//PID初始化
  67.         TIM4_Counter_Init(99,719);//定時(shí)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.                         //手柄連接檢測(cè)
  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;}//短按觸發(fā)關(guān)閉休眠
  133.                                 else sleepFlag = 1;
  134.                         }
  135.                         if(shutFlag) {shutFlag=0;shutCount = 0;}//任意按鍵觸發(fā)開機(jī)
  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. //菜單處理函數(shù)
  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. }
復(fù)制代碼

單片機(jī)代碼下載: STM32_T12_Controller-main.7z (648.45 KB, 下載次數(shù): 80)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:370590 發(fā)表于 2023-11-1 10:48 | 只看該作者
感謝樓主無私奉獻(xiàn)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久性色 | 日日综合| 男人天堂国产 | 国产精品成人国产乱一区 | 国产韩国精品一区二区三区 | www.888www看片 | 国产视频中文字幕在线观看 | 青青久久久 | 在线免费观看视频你懂的 | 久久国产高清 | 自拍视频网 | 亚洲在线免费 | 亚洲人a| 国产黄色一级片 | 精品欧美一区二区在线观看 | 午夜精品久久 | 成人免费看片又大又黄 | 嫩草视频入口 | 精品美女久久久久久免费 | 成人亚洲视频 | 大陆一级毛片免费视频观看 | 中文字幕欧美一区 | 亚洲一区二区三区久久 | 精品福利视频一区二区三区 | 精品一区二区在线观看 | 亚洲精品日韩精品 | 久久久久久久久久久国产 | 精品欧美乱码久久久久久 | 天天夜干 | 五月香婷婷 | 欧美视频一区二区三区 | 亚洲五码在线 | 久久久久久久一区二区三区 | 99久久婷婷国产精品综合 | 欧美日韩不卡 | 欧美精品一 | 产真a观专区 | 国产精品一二三区 | 国产亚洲成av人片在线观看桃 | 偷拍亚洲色图 | 亚洲高清在线 |