STM32使用PWM控制LED燈的亮滅程度
- 引言
- 介紹
- 軟體設計
- 後續
引言
隻要你是做單片機、嵌入式相關的從業者,我相信就不可能不知道PWM。我們在開發中,除了對電路進行簡單的數字量控制(打開/關閉),也就是“狀态”的控制。還會進行一些模拟電路控制,也就是“程度”的控制,這樣說或許有點抽象,舉個例子,比如我們現在控制一個燈,簡單的開燈,關燈就數字量的控制。控制燈的亮滅程度就是模拟量的控制。而PWM就是用來做程度控制的一種技術。
介紹
脈沖寬度調制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模拟電路進行控制的一種非常有效的技術。簡單一點,就是對脈沖寬度的控制。原理可以如圖所示,

圖中,我們假定定時器工作在向上計數 PWM模式,且當 CNT<CCRx 時,輸出 0,當 CNT>=CCRx 時輸出 1。那麼就可以得到如上的 PWM示意圖:當 CNT 值小于 CCRx 的時候,IO 輸出低電平(0),當 CNT 值大于等于 CCRx 的時候,IO 輸出高電平(1),當 CNT 達到 ARR 值的時候,重新歸零,然後重新向上計數,依次循環。改變 CCRx 的值,就可以改變 PWM 輸出的占空比,改變 ARR 的值,就可以改變 PWM 輸出的頻率,這就是 PWM 輸出的原理。
軟體設計
- STM32CubeMX配置
如果你是使用的HAL庫,建議還是學會使用STM32Cubemx的配置,可以簡化很多開發工作。
這裡我們選擇TIM3,使用其中的CH4通道,也就是PB1引腳。然後生成程式(如果STM32Cubemx完全不會,可以參考我以前的文章)。
- 控制LED燈亮滅
打開上面一步生成的工程,我們發現,裡面已經生成了PWM的配置,我們隻需要具體的進行功能的開發就夠了。使能TIM3,使能 CH4輸出.
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
我們設定2個變量,用1個變量來存放占空比,另一個變量存放擋位,友善我們序列槽檢視。
int ledtesk=0;//占空比
int LEDtime=0;//增加次數
在主循環中,設定占空比高于0XFFFF的時候,占空比和擋位進行清零,否則每次占空比加500,并設定擋位+1。
while(1)
{
usart_send[0]=LEDtime;
if(ledtesk<0xFFFF)
{
ledtesk=ledtesk+500;
LEDtime++;
}
else
{
LEDtime=0;
ledtesk=0;
}
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, ledtesk); //ledtesk占空比
HAL_UART_Transmit(&huart3,usart_send,1,portMAX_DELAY);
HAL_Delay(100);
}
- 此時我們會看到LED燈逐漸的變亮,當到達最值後,LED燈滅。并且序列槽會進行顯示上乘的次數,也可以了解為擋位。
擋位為5的時候,燈的狀态。
擋位在10的時候,燈的狀态。