概述
本章STM32CUBEMX配置STM32F103,并且在GD32F303中進(jìn)行開發(fā),同時(shí)通過開發(fā)板內(nèi)進(jìn)行驗(yàn)證。 本章主要配置定時(shí)器輸出PWM,同時(shí)演示PWM頻率與占空比。 查閱手冊(cè)可以得知,PB11為定時(shí)器1的通道3,對(duì)應(yīng)ST的為定時(shí)器2的通道4。 需要GD樣片的可以加QUN申請(qǐng):615061293 。
生成例程
這里準(zhǔn)備了自己繪制的開發(fā)板進(jìn)行驗(yàn)證。
使用PB11進(jìn)行驗(yàn)證。
工作過程
在ST中查看下面工作原理圖可以得知,時(shí)鐘可以由內(nèi)部Internal clock產(chǎn)生或者外部ETR。 同時(shí)可以設(shè)置復(fù)位,使能,向上/向下,計(jì)數(shù)。
在GD中,內(nèi)部時(shí)鐘源 TIMER_CK。
同時(shí)分頻只能為1、2、4。
查看ST下列文檔可以得知,定時(shí)器主要有TIMx_CNT、TIMx_PSC、TIMx_ARR控制。 同時(shí)預(yù)分頻器(TIMx_PSC)范圍位1-65535。
查看TIMx_PSC說明,可以得知定時(shí)器頻率為 fCK_PSC / (PSC[15:0] + 1)
可以看到,當(dāng)psc設(shè)置為不同的值的時(shí)候,計(jì)數(shù)頻率也會(huì)發(fā)生改變。
查看GD的文檔,可以得知,控制 PSC_CLK可以進(jìn)行分頻,定時(shí)器頻率為 fPSC_CLK / (PSC+ 1)。
在ST中,同時(shí)ARR可以改變計(jì)數(shù)值,當(dāng)寫入的arr越大,他的頻率越低,計(jì)數(shù)周期是ARR+1。
同時(shí)周期由TIMERx_CAR決定,pwm占空比由TIMERx_CHxCV決定。
ARR計(jì)數(shù)值如下所示。
占空比定義如下所示。
PWM頻率計(jì)算如下所示。 其中ARR在GD中中用CAR去定義了。
配置TIM參數(shù),預(yù)分頻系數(shù)設(shè)置為120-1, 自動(dòng)重載值設(shè)置為1000-1,那么PWM頻率為120,000,000/((120-1+1)*(1000-1+1))=1000Hz,即1KHz。
初始化代碼
/*使能TIMER1時(shí)鐘 */
rcu_periph_clock_enable(RCU_TIMER1);
/*使能GPIOB時(shí)鐘 */
rcu_periph_clock_enable(RCU_GPIOB);
/*使能復(fù)用時(shí)鐘 */
rcu_periph_clock_enable(RCU_AF);
/*設(shè)置io口,設(shè)置為復(fù)用模式 */
gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_11);
/*TIMER1全部重映射*/
gpio_pin_remap_config (GPIO_TIMER1_FULL_REMAP, ENABLE);
timer_oc_parameter_struct timer_ocintpara;
timer_parameter_struct timer_initpara;
/*定時(shí)器復(fù)位 */
timer_deinit(TIMER1);
/* TIMER1 configuration */
/*時(shí)鐘分頻系數(shù) */
timer_initpara.prescaler = 120-1;
/*邊沿對(duì)齊 */
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
/*上升計(jì)數(shù) */
timer_initpara.counterdirection = TIMER_COUNTER_UP;
/*計(jì)數(shù)值 */
timer_initpara.period = 1000-1;
/*根據(jù)prescaler,clockdivision最終該定時(shí)器時(shí)鐘評(píng)率為1M */
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
/*重復(fù)計(jì)數(shù)器的值 */
timer_initpara.repetitioncounter = 0;
/* */
timer_init(TIMER1,&timer_initpara);
/* CH0,CH1 and CH2 configuration in PWM mode */
/*是否使能輸出 */
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
/*是否互補(bǔ)通道輸出 */
timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
/*輸出極性 */
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
/*輸出死區(qū)延遲的極性 */
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
/*空閑狀態(tài)下通道輸出極性通道 */
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
/*空閑時(shí)互補(bǔ)通道輸出極性 */
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
/*配置通道 */
timer_channel_output_config(TIMER1,TIMER_CH_3,&timer_ocintpara);
/* CH3 configuration in PWM mode0,duty cycle 30% */
/*設(shè)置閾值(比較值,調(diào)節(jié)占空比的時(shí)候調(diào)節(jié)這個(gè)值) */
timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,300);
/*輸出模式配置 */
timer_channel_output_mode_config(TIMER1,TIMER_CH_3,TIMER_OC_MODE_PWM0);
/*不使用影子寄存器 */
timer_channel_output_shadow_config(TIMER1,TIMER_CH_3,TIMER_OC_SHADOW_DISABLE);
/* 使能定時(shí)器自動(dòng)重裝載值 */
timer_auto_reload_shadow_enable(TIMER1);
/* 使能定時(shí)器 */
timer_enable(TIMER1);
由于上述設(shè)置計(jì)數(shù)值位1000,那么設(shè)置30%的正占空比的ccr應(yīng)該配置為30%*1000=300。
/ *設(shè)置閾值(比較值,調(diào)節(jié)占空比的時(shí)候調(diào)節(jié)這個(gè)值) * / timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,300);
修改PWM頻率
修改PWM頻率可以修改PSC或者ARR來(lái)進(jìn)行改變。
設(shè)置TIM自動(dòng)重新加載寄存器值。 初始設(shè)置為PSC為120-1,ARR為1000-1,若設(shè)置為500-1,那么他的頻率應(yīng)該是120M/(120-1+1)(500-1+1)=2k 占空比為300/500*100%=60%
timer_autoreload_value_config (TIMER1, 500-1);
在運(yùn)行時(shí)設(shè)置TIM Prescaler。 初始設(shè)置為ARR為500-1,PSC為120-1,若設(shè)置為60-1,那么他的頻率應(yīng)該是120M/(60-1+1)(500-1+1)=4k 占空比為300/500*100%=60%
timer_prescaler_config (TIMER1, 60-1, TIMER_PSC_RELOAD_NOW);
審核編輯:湯梓紅
-
PWM
+關(guān)注
關(guān)注
114文章
5186瀏覽量
213916 -
固件庫(kù)
+關(guān)注
關(guān)注
2文章
97瀏覽量
14940 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14807 -
gd32f303
+關(guān)注
關(guān)注
4文章
38瀏覽量
3693
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論