概述
本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過開發板內進行驗證。 本章主要配置定時器輸出PWM,同時演示PWM頻率與占空比。 查閱手冊可以得知,PB11為定時器1的通道3,對應ST的為定時器2的通道4。 需要GD樣片的可以加QUN申請:615061293 。
生成例程
這里準備了自己繪制的開發板進行驗證。
使用PB11進行驗證。
工作過程
在ST中查看下面工作原理圖可以得知,時鐘可以由內部Internal clock產生或者外部ETR。 同時可以設置復位,使能,向上/向下,計數。
在GD中,內部時鐘源 TIMER_CK。
同時分頻只能為1、2、4。
查看ST下列文檔可以得知,定時器主要有TIMx_CNT、TIMx_PSC、TIMx_ARR控制。 同時預分頻器(TIMx_PSC)范圍位1-65535。
查看TIMx_PSC說明,可以得知定時器頻率為 fCK_PSC / (PSC[15:0] + 1)
可以看到,當psc設置為不同的值的時候,計數頻率也會發生改變。
查看GD的文檔,可以得知,控制 PSC_CLK可以進行分頻,定時器頻率為 fPSC_CLK / (PSC+ 1)。
在ST中,同時ARR可以改變計數值,當寫入的arr越大,他的頻率越低,計數周期是ARR+1。
同時周期由TIMERx_CAR決定,pwm占空比由TIMERx_CHxCV決定。
ARR計數值如下所示。
占空比定義如下所示。
PWM頻率計算如下所示。 其中ARR在GD中中用CAR去定義了。
配置TIM參數,預分頻系數設置為120-1, 自動重載值設置為1000-1,那么PWM頻率為120,000,000/((120-1+1)*(1000-1+1))=1000Hz,即1KHz。
初始化代碼
/*使能TIMER1時鐘 */
rcu_periph_clock_enable(RCU_TIMER1);
/*使能GPIOB時鐘 */
rcu_periph_clock_enable(RCU_GPIOB);
/*使能復用時鐘 */
rcu_periph_clock_enable(RCU_AF);
/*設置io口,設置為復用模式 */
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;
/*定時器復位 */
timer_deinit(TIMER1);
/* TIMER1 configuration */
/*時鐘分頻系數 */
timer_initpara.prescaler = 120-1;
/*邊沿對齊 */
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
/*上升計數 */
timer_initpara.counterdirection = TIMER_COUNTER_UP;
/*計數值 */
timer_initpara.period = 1000-1;
/*根據prescaler,clockdivision最終該定時器時鐘評率為1M */
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
/*重復計數器的值 */
timer_initpara.repetitioncounter = 0;
/* */
timer_init(TIMER1,&timer_initpara);
/* CH0,CH1 and CH2 configuration in PWM mode */
/*是否使能輸出 */
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
/*是否互補通道輸出 */
timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
/*輸出極性 */
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
/*輸出死區延遲的極性 */
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
/*空閑狀態下通道輸出極性通道 */
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
/*空閑時互補通道輸出極性 */
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% */
/*設置閾值(比較值,調節占空比的時候調節這個值) */
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);
/* 使能定時器自動重裝載值 */
timer_auto_reload_shadow_enable(TIMER1);
/* 使能定時器 */
timer_enable(TIMER1);
由于上述設置計數值位1000,那么設置30%的正占空比的ccr應該配置為30%*1000=300。
/ *設置閾值(比較值,調節占空比的時候調節這個值) * / timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,300);
修改PWM頻率
修改PWM頻率可以修改PSC或者ARR來進行改變。
設置TIM自動重新加載寄存器值。 初始設置為PSC為120-1,ARR為1000-1,若設置為500-1,那么他的頻率應該是120M/(120-1+1)(500-1+1)=2k 占空比為300/500*100%=60%
timer_autoreload_value_config (TIMER1, 500-1);
在運行時設置TIM Prescaler。 初始設置為ARR為500-1,PSC為120-1,若設置為60-1,那么他的頻率應該是120M/(60-1+1)(500-1+1)=4k 占空比為300/500*100%=60%
timer_prescaler_config (TIMER1, 60-1, TIMER_PSC_RELOAD_NOW);
審核編輯:湯梓紅
-
PWM
+關注
關注
114文章
5197瀏覽量
214571 -
固件庫
+關注
關注
2文章
97瀏覽量
14968 -
stm32cubemx
+關注
關注
5文章
284瀏覽量
14914 -
gd32f303
+關注
關注
4文章
38瀏覽量
3711
發布評論請先 登錄
相關推薦
評論