欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STM32單片機簡易光控溫控系統 HAL庫程序+原理圖PCB文件 [打印本頁]

作者: YAKI27    時間: 2022-5-2 21:20
標題: STM32單片機簡易光控溫控系統 HAL庫程序+原理圖PCB文件
之前做的項目整理了一下,基于STM32(HAL庫)簡易光控溫控系。相互學習,資料僅供參考 謝謝。
        本設計系統雖然是一個簡易桌面系統,而且其中硬件功能比較單一,但是其中開發流程還是比較齊全的,過程涉及到軟件比較通用,對于想入門的stm32的初學者也是比較友好的。其中涉及,硬件電路設計,程序設計,HAL庫使用,STM32CubeMX軟件使用。
       作品還有許多可以地方可以完善的,由于個人能力和經驗的不足,作品還存在著或多或少的缺陷,比如可添加攝像頭功能用于檢測坐姿或者是家長監督等。若是與語音模塊結合可起到監督小孩坐姿不端正等好處。還可以添加無線模塊,能起到遠程控制功能等。程序可以加入算法,能更好的達到自動控制效果,程序繼續優化可以使作品更穩定些。
制作出來的實物圖如下:

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


主程序流程圖



單片機源程序如下:
  1. #include "regulation/regulation.h"

  2. /********************************************************
  3.         本文件用于編寫有需要進行多個外設聯合調控的程序
  4. *********************************************************/

  5. //創建一個溫度調控的結構體變量,方便溫度調控的配置
  6. Temperature_SetTypeDef Tem_Regula_Set;
  7. //創建一個亮度調控的結構體變量,方便溫度調控的配置
  8. Brightness_SetTypeDef Bri_Regula_Set;

  9. /*
  10. 函數名稱:Regulation_Init()
  11. 函數功能:初始化需要調控的數據,避免初始值過于混亂
  12. 輸入參數:無
  13. 輸出參數:無
  14. 備 注  :
  15. */
  16. void Regulation_Init(void)
  17. {
  18.         //溫度調控初始化值
  19.         Tem_Regula_Set.Mode = 0;                        //溫度調控初始為手動模式
  20.         Tem_Regula_Set.Tem_Low_Limit = 25;        //溫度調控的下限值為23
  21.         Tem_Regula_Set.Tem_Up_Limit = 27;        //溫度調控的上限值為24
  22.         Tem_Regula_Set.Moto_Pwm_Val = 0;        //輸出調控值為0
  23.         
  24.         //亮度調控初始化值
  25.         Bri_Regula_Set.Mode = 0;                        //亮度調控初始化為手動模式
  26.         Bri_Regula_Set.Bri_Low_Limit = 20;        //亮度調控下限值為20
  27.         Bri_Regula_Set.Bri_Up_Limit = 70;        //亮度調控上限值為50
  28.         Bri_Regula_Set.Bri_Median = 50;                //亮度調控的中值為50
  29.         Bri_Regula_Set.LED_Pwm_Val = 0;                //LED照明控制輸出為0
  30.         Bri_Regula_Set.Work_Flag = 0;                //復位LED燈的工作狀態
  31.         Bri_Regula_Set.Resolution = 1;                //初始化LED控制的分辨率為1
  32.         Bri_Regula_Set.offset = 5;                        //初始化LED的偏移值為5
  33. }
  34.         

  35. /*
  36. 函數名稱:Temperature_Set()
  37. 函數功能:用于對溫度控制的配置更新
  38. 輸入參數:無
  39. 輸出參數:無
  40. 備 注  :
  41. */
  42. void Temperature_Set(void)
  43. {
  44.         if(Tem_Regula_Set.Mode == 1)                //手動模式
  45.         {
  46.                 Moto.PwmVal = Tem_Regula_Set.Moto_Pwm_Val;                //將設定好的值賦予到電機的控制變量中
  47.                 Moto_Control_Update();                                                        //刷新電機控制輸出的值
  48.         }
  49.         else if(Tem_Regula_Set.Mode == 0)        //自動模式
  50.         {
  51.                 if((DS18B20_Tem.Tem/10) < Tem_Regula_Set.Tem_Low_Limit)                //判斷讀取到的溫度值是否低于下限值
  52.                 {
  53.                         Moto.PwmVal = 0;                        //停止電機的工作
  54.                         Moto_Control_Update();                //刷新電機控制輸出的值
  55.                 }
  56.                 else if((DS18B20_Tem.Tem/10) > Tem_Regula_Set.Tem_Up_Limit)        //判斷讀取到的溫度值是否大于上限值
  57.                 {
  58.                         Moto.PwmVal = ((DS18B20_Tem.Tem/10) - Tem_Regula_Set.Tem_Low_Limit) + 6;                //計算電機的輸出速度
  59.                         Moto_Control_Update();                //刷新電機控制輸出的值
  60.                 }
  61.         }
  62.         if(Tem_Regula_Set.Tem_Low_Limit > Tem_Regula_Set.Tem_Up_Limit)                //判斷下限值是否大于上限值
  63.                 Tem_Regula_Set.Tem_Low_Limit = (Tem_Regula_Set.Tem_Up_Limit - 1);
  64. }



  65. /*
  66. 函數名稱:Brightness_Set()
  67. 函數功能:用于對亮度調控的配置更新
  68. 輸入參數:無
  69. 輸出參數:無
  70. 備 注  :
  71. */
  72. void Brightness_Set(void)
  73. {
  74. if(Bri_Regula_Set.Mode == 1)                //手動模式
  75.         {
  76.                 if(Bri_Regula_Set.LED_Pwm_Val != 0)
  77.                         Bri_Regula_Set.LED_Pwm_Val--;
  78.                 LED_Pwm_Val = Bri_Regula_Set.LED_Pwm_Val;                //將設定好的亮度值賦予到LED照明輸出端口中
  79.                 LED_PWM_Update();                                                                //刷新LED控制輸出的值
  80.         }
  81.         else if(Bri_Regula_Set.Mode == 0)        //自動模式
  82.         {
  83.                 if(brightness.BriVal > Bri_Regula_Set.Bri_Up_Limit)                //判斷讀取到的亮度值是否高于上限值
  84.                 {
  85.                         Bri_Regula_Set.Work_Flag = 0;        //復位LED燈的工作狀態
  86.                         LED_Pwm_Val = 0;                        //停止LED照明的工作
  87.                         LED_PWM_Update();                        //刷新LED照明控制輸出的值
  88.                 }
  89.                 else if(brightness.BriVal < Bri_Regula_Set.Bri_Low_Limit)        //判斷讀取到的亮度值是否小于下限值
  90.                 {
  91.                         Bri_Regula_Set.Work_Flag = 1;        //置位LED燈的工作狀態                        
  92.                 }
  93.                 if(Bri_Regula_Set.Work_Flag)                //LED燈處于工作狀態
  94.                 {
  95.                         if((Bri_Regula_Set.Bri_Median - brightness.BriVal) > Bri_Regula_Set.offset)                                //判斷讀取到的亮度值與設置的中間值差大于5(當讀取的亮度值小于中間值時)
  96.                                 LED_Pwm_Val+=Bri_Regula_Set.Resolution;                                                                                                                                                //如果讀取到的亮度值,小于設置的中間值,那么增加LED的控制端口量(這樣做是為了不會在一瞬間使LED的控制值太大)
  97.                         else if((brightness.BriVal - Bri_Regula_Set.Bri_Median) > Bri_Regula_Set.offset)                //判斷讀取到的亮度值與設置的中間值差大于5(當讀取的亮度值大于中間值時)
  98.                                 LED_Pwm_Val-=Bri_Regula_Set.Resolution;                                                                                                                                                //如果讀取到的亮度值,大于設置的中間值,那么減少LED的控制端口量(這樣做是為了不會在一瞬間直接關閉LED的控制)
  99.                         
  100.                         if(LED_Pwm_Val > 100)                                                                                        //判斷LED_Pwm_Val是否超出控制范圍
  101.                                 LED_Pwm_Val = 100;
  102.                         if(LED_Pwm_Val < 0)                                                                                                //判斷LED_Pwm_Val是否超出控制范圍
  103.                                 LED_Pwm_Val = 0;
  104.                         
  105.                         LED_PWM_Update();                        //刷新LED照明控制輸出的值
  106.                 }
  107.         }
  108.         if(Bri_Regula_Set.Bri_Low_Limit > Bri_Regula_Set.Bri_Up_Limit)                //判斷下限值是否大于上限值(下限值不能大于上限值)
  109.                 Bri_Regula_Set.Bri_Low_Limit = (Bri_Regula_Set.Bri_Up_Limit - 1);
  110.         if(Bri_Regula_Set.Bri_Median > Bri_Regula_Set.Bri_Up_Limit)                        //判斷中值是否大于上限值
  111.                 Bri_Regula_Set.Bri_Median = (Bri_Regula_Set.Bri_Up_Limit - 1);
  112.         if(Bri_Regula_Set.Bri_Low_Limit > Bri_Regula_Set.Bri_Median)                        //判斷下限值不能大于中間值
  113.                 Bri_Regula_Set.Bri_Low_Limit = (Bri_Regula_Set.Bri_Median - 1);
  114. }
復制代碼
  1. #include "task_list/task_list.h"


  2. //創建一個任務結構類型的數組,用于存放不同的任務,方便時間片的計時處理
  3. //在這里添加你需要增加的任務
  4. TASK_StatusTypeDef TaskComps[TASK_NUM] =
  5. {
  6.         {0,50,50,DS18B20_Update},                        //更新DS18B20的數據
  7.         {0,500,500,Brightness_Update},                        //更新亮度的數據
  8.         
  9.         //{0,100,100,Temperature_Set},                        //更新溫度調節
  10.         //{0,100,100,Brightness_Set},                        //更新亮度調節
  11.         
  12.         {0,50,50,Dis_Mark},                                                //更新界面的數據
  13. //        {0,200,200,Beep_Toggle},                                //更新蜂鳴器翻轉狀態
  14.         {0,500,500,LED1_Toggle}                                        //翻轉LED1,確認程序一直在工作
  15. //        {0,500,500,LED2_Toggle}
  16.         //在這里添加需要執行的任務,請根據任務的數量修改TASK_NUM的值
  17. };

  18. /*
  19. 函數名稱:Init_Sys()
  20. 函數功能:將所有外設需要的初始化放到這個函數底下,方便統一管理
  21.                         本函數在主函數中被調用
  22. 輸入參數:無
  23. 輸出參數:無
  24. 備 注  :
  25. */
  26. void Init_Sys(void)
  27. {
  28.         
  29.         delay_init(84);                //初始化滴答時鐘,使用內部時鐘這里設置成84,如果使用外部時鐘,這里可設置成12
  30.         
  31.         OLED_Init();                        //初始化OLED,先初始化OLED用于顯示初始化的進度
  32.         Flip_Screnn(1);        
  33.         
  34.         LED_Init();                                                        //LED端口初始化
  35.         LED_PWM_Init();
  36.                
  37.         DS18B20_Init();

  38.         Moto_Init();                        //電機初始化

  39.         Beep_GPIO_Init();
  40.         
  41.         Beep_Pwm_Init();                        //初始化蜂鳴器PWM控制
  42. //        Regulation_Init();                        //調控值初始化
  43.         
  44.         Mark_Sign.Interface_Mark = Main_Interface;
  45. }

復制代碼

  1. #include "architecture/architecture.h"



  2. /*
  3. 函數名稱:Time_Slice()
  4. 函數功能:任務標志位的處理,也是時間片的計時,
  5.                         本函數在計時器中斷中被調用,實現
  6.                         一個時間梯度進行一次遞減
  7. 輸入參數:無
  8. 輸出參數:無
  9. 備 注  :
  10. */
  11. void Time_Slice(void)
  12. {
  13.         uint8_t i;                        //定義一個變量用于循環計數來處理不同任務的時間記錄
  14.         for(i=0;i<TASK_NUM;i++)                //逐個任務時間處理
  15.         {
  16.                 if(TaskComps[i].Timer)        //判斷當前任務的時間片不為0
  17.                 {
  18.                         TaskComps[i].Timer--;                //減去一個節拍
  19.                         if(TaskComps[i].Timer==0)        //如果時間片減到0
  20.                         {
  21.                                 TaskComps[i].Timer = TaskComps[i].ItvTime;        //恢復時間片值,從新下一次計算
  22.                                 TaskComps[i].Run = 1;        //使能任務運行
  23.                         }                        
  24.                 }
  25.         }
  26. }

  27. /*
  28. 函數名稱:Task_Process()
  29. 函數功能:任務處理函數,在主函數中被調用,用于判斷各個任務是否需要被運行
  30. 輸入參數:無
  31. 輸出參數:無
  32. 備 注  :
  33. */
  34. void Task_Process(void)
  35. {
  36.         uint8_t i;                //創建一個變量,用于循環任務的計數
  37.         for(i=0;i<TASK_NUM;i++)                //逐個任務處理
  38.         {
  39.                 if(TaskComps[i].Run)        //如果運行標志位不為0
  40.                 {
  41.                         TaskComps[i].TaskHook();        //運行任務
  42.                         TaskComps[i].Run = 0;                //清除標志位
  43.                 }
  44.         }
  45. }
  46. /*
  47. 函數名稱:
  48. 函數功能:
  49. 輸入參數:
  50. 輸出參數:
  51. 備 注  :
  52. */

復制代碼
51hei附件下載,僅供參考:

51hei.png (7.75 KB, 下載次數: 98)

51hei.png

程序設計.7z

6.78 MB, 下載次數: 30, 下載積分: 黑幣 -5

程序

硬件設計.rar

4.06 MB, 下載次數: 27, 下載積分: 黑幣 -5

硬件

文檔 僅供參靠.7z

7.1 MB, 下載次數: 21, 下載積分: 黑幣 -5

文件






歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1