一、PWM簡介
PWM (Pulse Width Modulation)就是對(duì)外輸出脈寬(即占空比)可調(diào)的方波信號(hào),簡稱脈寬調(diào)制;
信號(hào)頻率由自動(dòng)重裝寄存器ARR 的值決定,占空比由比較寄存器CCR 的值決定。
PWM工作模式
PWM模式1 :
在向上計(jì)數(shù)時(shí),一旦TIMx_CNT<TIMx_CCR1時(shí)通道1為有效電平,否則為無效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>TIMx_CCR1時(shí)通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。
總結(jié)就是:PWM模式1,無論是向上還是向下計(jì)數(shù),當(dāng)計(jì)數(shù)值小于重裝載值是輸出有效電平。
PWM模式2 :
在向上計(jì)數(shù)時(shí),一旦TIMx_CNT<TIMx_CCR1時(shí)通道1為無效電平,否則為有效電平;在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>TIMx_CCR1時(shí)通道1為有效電平,否則為無效電平。
總結(jié)就是:PWM模式2,無論是向上還是向下計(jì)數(shù),當(dāng)計(jì)數(shù)值大于重裝載值是輸出有效電平。
在兩種模式下TIMx_CNT(計(jì)數(shù)器當(dāng)前值)與TIMx_CCR1(捕獲/比較值) 只是決定是有效電平還是無效電平,有效電平可以是高電平也可以是低電平
以向上計(jì)數(shù)圖例為例介紹
上圖中:CNT(計(jì)數(shù)器當(dāng)前值)、ARR(自動(dòng)重裝載值)之外,還多了一個(gè)值CCRx(捕獲/比較寄存器值)
當(dāng)CNT小于CCRx時(shí),TIMx_CHx通道輸出低電平;
當(dāng)CNT等于或大于CCRx時(shí),TIMx_CHx通道輸出高電平。
?
其中 預(yù)分頻系數(shù)決定了PWM的時(shí)鐘速度 、ARR(自動(dòng)重裝載值)的大小決定了PWM的周期 、 CRRx(捕獲/比較寄存器值)決定了輸出有效信號(hào)的時(shí)間
有效信號(hào): 高電平、低電平
PWM的一個(gè)周期:
定時(shí)器從0開始向上計(jì)數(shù);
0 ~ t1 ,定時(shí)器計(jì)數(shù)器TIMx_CNT值小于CCRx值 ,輸出低電平;
t1 ~ t2 ,定時(shí)器計(jì)數(shù)器TIMx_CNT值大于CCRx值,輸出高電平;
TIMx_CNT值達(dá)到ARR時(shí) ,定時(shí)器溢出,重新向上計(jì)數(shù);
循環(huán)上述過程;
PWM時(shí)間計(jì)算
PWM周期計(jì)算:
Tpwm = ( (ARR + 1) * (PSC + 1) ) / Tclk
ARR 是自動(dòng)重裝載的值
PSC 是預(yù)分頻系數(shù)
Tclk 是對(duì)應(yīng)的時(shí)鐘頻率
示例:Tclk = 72M 、ARR (自動(dòng)重裝載的值)= 9999、PSC (預(yù)分頻系數(shù))= 7199
Tpwm = ( (ARR + 1) * (PSC + 1) ) / Tclk = (7200*10000) / 72 000 000 = 1s
占空比:
Duty circle = TIM3->CCR1 / ARR (單位:%)
二、STM32Cube MX配置
基本配置可以參考:STM32 CubeMx教程 – 基礎(chǔ)知識(shí)及配置使用教程
配置RCC,配置為外部晶振模式
配置SYS ,Debug為Serial Wire
配置TIM,設(shè)置為內(nèi)部時(shí)鐘,選擇通道一為PWM輸出模式,正好對(duì)應(yīng)到PA8,用于輸出呼吸燈
配置PWM的具體參數(shù),預(yù)分頻系數(shù)為 71,自動(dòng)重裝載值為 499,定時(shí)器溢出頻率,即PWM的周期,就是 72MHz/(71+1)/(499+1) = 2kHz
Mode: PWM模式1或模式2
Pulse: 占空比;對(duì)應(yīng)捕獲/比較寄存器2(TIMx_CCR2)中的CCR2[15:0]。
Output compare preload: 輸出自動(dòng)比較;對(duì)應(yīng)捕獲/比較模式寄存器1中的OC2PE位。輸出比較2預(yù)裝載使能
Fast Mode: PWM脈沖快速輸出;對(duì)應(yīng)捕獲/比較模式寄存器1中的OC2FE位。輸出比較2快速使能。
CH Polarity: 有效電平;對(duì)應(yīng)捕獲/比較使能寄存器(TIMx_CCER)中的CC2P位。定義輸出極性。
配置時(shí)鐘樹
三、代碼詳解
涉及到的HAL庫函數(shù):
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //開啟PWM輸出
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,50); //設(shè)置默認(rèn)的占空比值
代碼示例:文章來源:http://www.zghlxwxcb.cn/news/detail-428174.html
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t pwm_value=0; //PWM占空比
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //使能TIM1的PWM Channel1 輸出
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwm_value < 500)
{
pwm_value++;
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, pwm_value); //修改比較值,修改占空比
// TIM1->CCR1 = pwm_value; //與上方作用相同,直接修改寄存器
HAL_Delay(1);
}
while (pwm_value)
{
pwm_value--;
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, pwm_value); //修改比較值,修改占空比
// TIM1->CCR1 = pwmVal; //與上方作用相同,直接修改寄存器
HAL_Delay(1);
}
HAL_Delay(200);
}
/* USER CODE END 3 */
}
附錄
本文涉及到的代碼:STM32 HAL庫 PWM例程文章來源地址http://www.zghlxwxcb.cn/news/detail-428174.html
到了這里,關(guān)于STM32 HAL庫 STM32CubeMX -- PWM(呼吸燈)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!