申明以下都是個(gè)人理解,僅供參考。如果錯(cuò)誤歡迎指教。本文不講底層,根據(jù)實(shí)際使用來(lái)逆向講解。
1.什么是pwm?
pwm最簡(jiǎn)單的理解就是“功率”,調(diào)節(jié)PWM的占空比就是調(diào)節(jié)功率。
2.如何調(diào)節(jié)占空比?
圖1?
?根據(jù)圖1很容易看出來(lái)調(diào)節(jié)CCRX的值就可以調(diào)節(jié)占空比,CCRX的值越大,占空比越大(在不超過(guò)ARR時(shí))。
在默認(rèn)有效值為高電平的時(shí),當(dāng)CCRX的值等于ARR時(shí)PWM的波形為一條直線(即全是邏輯電平1)全功率輸出。
3.什么是有效值,什么是CCRX,什么是ARR,什么是占空比?
先貼一段代碼:
void TIM2_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2| RCC_APB1Periph_TIM3, ENABLE); //使能定時(shí)器2/3時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外設(shè)時(shí)鐘
//引腳功能配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2; //TIM2_CH1 // TIM2_CH2 // TIM3_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出!!
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化TIM2
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來(lái)作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分頻系數(shù):不分頻 //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
//初始化TIM2 Channel1、Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OCInitStructure.TIM_Pulse = 0; //跳變值
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM2 OC1 通道1
TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM2 OC2 通道2
TIM_OC3Init(TIM2, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM2 OC2 通道3
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的預(yù)裝載寄存器
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的預(yù)裝載寄存器
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的預(yù)裝載寄存器
TIM_ARRPreloadConfig(TIM2, ENABLE); // 使能TIM2重載寄存器ARR
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
TIM_SetCompare2(TIM3,400);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)
{
/* Check the parameters */
assert_param(IS_TIM_LIST6_PERIPH(TIMx));
/* Set the Capture Compare2 Register value */
TIMx->CCR2 = Compare2;
}
CCRX:就是設(shè)置定時(shí)器的比較值,
ARR:自動(dòng)重裝載寄存器周期的值
PWM占空比=CCRX/ARR或者是WM占空比=(ARR-CCRX)/ARR
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; ? //輸出極性:TIM輸出比較極性高
這句話就是用來(lái)設(shè)置有效值。
TIM脈沖寬度調(diào)制模式有兩種(看別人總結(jié)的):
PWM1:TIMx_CNT<TIMx_CCRX,輸出高電平(有效值默認(rèn)為高),否則輸出低電平。
PWM2:TIMx_CNT>TIMx_CCRX,輸出高電平(有效值默認(rèn)為高),否則輸出低電平。
如圖分析,即在t0-t1,t2-t3,t4-t5時(shí)間段輸出高電平.
4.PWM輸出頻率
PWM輸出頻率=時(shí)鐘頻率/(ARR+1)*(PSC+1)
5.keil軟件仿真波形輸出
選擇完模式,設(shè)置有效電平,設(shè)置CCRX,ARR就可以開(kāi)始使用PWM了。
下圖是軟件仿真輸出波形配置。
圖2?
配置圖片如下,GPIOX_DIR.X 例如本例程使用的PA0則寫為GPIOA_DIR.0。還有Display Type要選擇為Bit。
圖3?
?下圖為PA0 PA1的波形。PA0,PA1分別為定時(shí)器2的通道1,通道2.如果顯示no signel,參考軟件仿真輸出波形配置(圖2)。
圖4?
?上圖波形是PWM1模式下生成的。
最后附上源碼,有需要測(cè)試的可以下載?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-416373.html
鏈接:https://pan.baidu.com/s/1S6e3zdv62SktAtIjBtD5DA?
提取碼:7n7b文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-416373.html
到了這里,關(guān)于簡(jiǎn)單明了的說(shuō)明STM32的PWM原理以及實(shí)現(xiàn)方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!