至于STM32的PWM的基本知識,部落格 STM32——PWM基本知識及配置過程已經說的非常清楚了,這裡再說明一下PWM的頻率和占空比計算
- 首先要搞清楚單片機的時鐘樹,搞清楚TIM的時鐘來源以及具體時鐘頻率,這裡以TIM2CH4為例,假設時鐘來源為内部時鐘HSI,最終到APB1的時鐘為8M,TIM2的時鐘也為8M
- 其次,搞明白PWM的計算公式,PWM的周期由ARR決定,定時器的計數器跑完一個(ARR+1)即為一個PWM周期,而計數器的計數機關時間為(PSC+1)/8M

- 計算,假設PWM周期設定為20ms即50Hz,
,假設PSC=7,則計數器計數機關為1us,再将ARR+1設定為20 000,20ms = (ARR+1)*[(PSC+1)/8M]
即設定PWM周期20ms1us*20 000=20ms
- PWM的占空比與CCRx和ARR寄存器有關,ARR決定CCRx的最大值,CCRx使用
設定TIM_SetComparex
-
備注
在實際操作中,因為單片機焊接了外部晶振8M,以為定時器的APB1時鐘頻率為72M,再怎麼計算修改寄存器值,輸出的PWM都不對,後來才發現單片機預設使用的是内部時鐘源!
- 代碼執行個體
void TIM2_PWM_Init() { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 20000-1; //arr 20000*1us=20ms TIM_TimeBaseStructure.TIM_Prescaler = 8-1;//psc 8/8M =1us TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1:CNT<CCR時輸出有效 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0;//TIM_SetCompare TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//設定極性-有效為高電平 TIM_OC4Init(TIM2, &TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM2,ENABLE); TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); } TIM_SetCompare4(TIM2,10000);//20ms 50%占空比