本文例子參考《STM32單片機開發實體——基于Proteus虛擬仿真與HAL/LL庫》
源代碼:https://github.com/LanLinnet/STM33F103R6
專案要求
實作呼吸燈的效果:D1為長亮LED,D2為呼吸燈,通過PWM的方式實作D2亮→滅→亮→滅……的漸變效果,一次變化周期為1秒,
硬體設計
-
在第一節的基礎上,在Proteus中添加電路如下圖所示,其中我們還添加了一個示波器OSCILLOSCOPE,

-
PWM(Pulse Width Modulation, 脈沖寬度調制)技術就是對固定周期脈沖波形的高電平寬度進行調節,在一個脈沖周期內高電平持續時間所占的比例我們稱之為占空比,高電平不同,脈沖信號波形的平均電壓不同,脈沖信號波形的平均電壓與占空比D、電平電壓U之間的關系為:\(\overline U=DU\),PWM可以用于直流電動機調速、開關電源、LED亮度調節等領域,在這里我們就是利用PWM對LED燈的亮度進行調節,從而實作呼吸燈的效果,
-
時鐘頻率采用默認的8MHz,我們不妨設定PSC為
79,ARR為99,那么此時可以計算出TIM3的計數脈沖周期為\(T_{CNT}\)為10\(\mu s\),定時器一次溢位時間\(T_{OUT}\)為1ms,
還需要計算PWM信號的占空比:如圖所示,定時器從0開始向上計數到ARR的值,溢位后自動復位開始新一輪計數,我們只需要設定CCRx暫存器的值,當定時器計數值在0-CCRx時,PWM信號輸出有效電平,當定時器計數值在CCRx-ARR之間時翻轉電平……周而復始,那么CCRx的值就決定了PWM信號的占空比,

-
打開CubeMX,建立工程,我們在本專案中采用定時器3,普通定時器TIM3的4路PWM輸出通道TIM3_CH1~TIM3_CH4分別對應PC6-PC9引腳,我們將PC6配置為
GPIO_Output,用于驅動長亮LED,將PC7配置為TIM3_CH2,使能TIM3-CH2的PWM信號輸出功能,由PC7驅動呼吸燈,隨后對定時器進行設定:點擊“Categories”中的“Timer”串列,選中“TIM3”,在“TIM3 Mode and Configuration”視窗中設定“Clock Source”為
Internal Clock,Channel2設定為PWM Generation CH2,設定“PSC”為79,“Counter Period”為99,隨后進行通道2的PWM信號生成設定“PWM Generation Channel 2”:設定Mode為
PWM mode 1(即當當前計數值<CRRx時輸出有效電平),設定“CH Polarity”為Low(即有效電平為低電平),

接下來點擊“Clock Configuration”進入時鐘配置界面,這里我們采用默認設定的8MHz,

-
點擊“Generator Code”生成Keil工程,
軟體撰寫
-
本次我們需要實作PWM輸出實作呼吸燈效果,需要用到PWM相關函式,其API檔案如下:
HAL_TIM_PWM_Start 定時器運行并輸出PWM函式

宏定義__HAL_TIM_SET_COMPARE 給定時器設定通道x的捕獲比較暫存器(CRRx)的值,該宏定義可以在“stm32f1xx_hal_tim.h”檔案中找到

-
點擊“Open Project”在Keil中打開工程,雙擊“main.c”檔案,
-
首先我們需要在main函式中初始化并運行定時器3 通道2 PWM函式的輸出,
我們首先在main.c檔案的main函式中初始化定時器,/* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); //定時器2運行并在通道2輸出PWM函式 /* USER CODE END 2 */然后,在
while(1)中插入代碼如下,不斷設定PWM輸出的占空比,從而實作呼吸燈的效果/* USER CODE BEGIN WHILE */ while (1) { uint8_t i; //回圈變數 for(i=0; i<=100; i+=4) //一次回圈時間 100/4*20ms = 500ms 漸弱 { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, i); //賦予定時器TIM3的CRR2暫存器的值為i HAL_Delay(20); } for(i=100; i>=0; i-=4) //一次回圈時間 100/4*20ms = 500ms 漸強 { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, i); //賦予定時器TIM3的CRR2暫存器的值為i HAL_Delay(20); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
聯合除錯
- 點擊運行,生成HEX檔案,
- 在Proteus中加載相應HEX檔案,點擊運行,LED燈1長亮,LED燈2呈現呼吸燈燈狀態,觀察示波器,可以看到通道B波形的占空比不斷改變,且占空比不同的時候,LED燈2的亮度也不同,
占空比為0,LED燈2不亮

占空比較小,LED燈2亮度低

占空比較大,LED燈2亮度高

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/472837.html
標籤:嵌入式
