PWM常見輸出方法及避坑指南
[導(dǎo)讀]PWM的應(yīng)用可以說非常廣泛,控制電機速度、燈光亮度、通信調(diào)制等眾多領(lǐng)域。PWM的問題小伙伴問的比較多,最近也在用PWM,這里就分享一下關(guān)于PWM的一些內(nèi)容。什么是PWM?PWM:PulseWidthModulation,脈沖寬度調(diào)制。網(wǎng)上的解釋很多,通過下圖,你就能直觀的理解PW...
PWM的應(yīng)用可以說非常廣泛,控制電機速度、燈光亮度、通信調(diào)制等眾多領(lǐng)域。
PWM的問題小伙伴問的比較多,最近也在用PWM,這里就分享一下關(guān)于PWM的一些內(nèi)容。
什么是PWM?PWM:Pulse Width Modulation,脈沖寬度調(diào)制。
網(wǎng)上的解釋很多,通過下圖,你就能直觀的理解PWM,其實就是高低電平組成的脈沖信號。
通過改變其中頻率(脈沖周期)、占空比,就能應(yīng)用在很多場合。
PWM常見輸出方式通過上面描述,PWM就是一個IO口以不同的時間周期輸出高、低電平。
1.新手(菜鳥)級別while循環(huán)中,阻塞延時,控制IO口高低輸出:
2.入門(初級)級別while循環(huán)中,非阻賽延時,控制IO口高低輸出:
非阻賽延時可以是:定時器標(biāo)識檢測、RTOS(系統(tǒng))延時等。
3.熟悉(中級)級別定時器中斷控制IO高低電平輸出:
4.熟練(中級 )級別定時器PWM硬件控制輸出:
比較:
上面幾種PWM輸出方式,前面三種都會CPU干預(yù)PWM的輸出,也就是會占用CPU資源,特別是前面兩種方式,不僅占用CPU,誤差還比較大。
使用第三種中斷方式,如果頻率比較高,CPU消耗的也比較嚴(yán)重。這種情況適合于沒有硬件PWM輸出的單片機。
第四種就是單片機自帶硬件PWM輸出功能,只需要簡單配置就可以自動輸出PWM波形,無需CPU干預(yù)。
硬件輸出PWM例子這里以大家熟悉的STM32F1為例:為大家簡單分享一下硬件定時器輸出PWM波形。
PWM定時器相關(guān)宏定義:
PWM配置:
PWM的問題小伙伴問的比較多,最近也在用PWM,這里就分享一下關(guān)于PWM的一些內(nèi)容。
什么是PWM?PWM:Pulse Width Modulation,脈沖寬度調(diào)制。
網(wǎng)上的解釋很多,通過下圖,你就能直觀的理解PWM,其實就是高低電平組成的脈沖信號。
通過改變其中頻率(脈沖周期)、占空比,就能應(yīng)用在很多場合。
PWM常見輸出方式通過上面描述,PWM就是一個IO口以不同的時間周期輸出高、低電平。
1.新手(菜鳥)級別while循環(huán)中,阻塞延時,控制IO口高低輸出:
while(1){ IO口高電平 Delay阻塞延時 IO口低電平 Delay阻塞延時}阻塞延時可以是:軟件模擬延時,定時器阻塞延時等。2.入門(初級)級別while循環(huán)中,非阻賽延時,控制IO口高低輸出:
while(1){ IO口高電平 Delay非阻塞延時 IO口低電平 Delay非阻塞延時}非阻賽延時可以是:定時器標(biāo)識檢測、RTOS(系統(tǒng))延時等。
3.熟悉(中級)級別定時器中斷控制IO高低電平輸出:
定時器中斷配置 ——>?啟動定時器?——>?響應(yīng)中斷,控制IO高低電平···
4.熟練(中級 )級別定時器PWM硬件控制輸出:
配置PWM對應(yīng)的IO,以及定時器PWM輸出?——>?啟動PWM自動輸出···
void AppTask(void *p_arg){ PWM_TIM_Configuration();
PWM_Output(頻率, 占空比);
while(1) { //自己的應(yīng)用代碼 }}比較:
上面幾種PWM輸出方式,前面三種都會CPU干預(yù)PWM的輸出,也就是會占用CPU資源,特別是前面兩種方式,不僅占用CPU,誤差還比較大。
使用第三種中斷方式,如果頻率比較高,CPU消耗的也比較嚴(yán)重。這種情況適合于沒有硬件PWM輸出的單片機。
第四種就是單片機自帶硬件PWM輸出功能,只需要簡單配置就可以自動輸出PWM波形,無需CPU干預(yù)。
硬件輸出PWM例子這里以大家熟悉的STM32F1為例:為大家簡單分享一下硬件定時器輸出PWM波形。
PWM定時器相關(guān)宏定義:
//定時器計數(shù)時鐘(1M次/秒)#define PWM_COUNTER_CLOCK 1000000
//預(yù)分頻值(與系統(tǒng)時鐘、計數(shù)值有關(guān))#define PWM_PRESCALER_VALUE (SystemCoreClock/PWM_COUNTER_CLOCK - 1)PWM配置:
/** * @brief 定時器PWM輸出配置 * @param 無 * @retval 無 */void PWM_TIM_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;
/* 時鐘配置 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 引腳配置 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, 




