本文参考GD32F30x用户手册,例程来源于GD32F30x_Firmware_Library_V2.1.4中TIMER部分。
死区时间是PWM输出时,为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段,通常也指pwm响应时间。
根据用户手册,死区由互补通道保护寄存器(TIMERx_CCHP)中DTCFG[7:0]设置
DTvalue是死区时间;
tDTS为采样时钟周期;
tDT为采时钟周期乘以倍数,这个值用于计算最终死区时间,也叫步长。
把DTCFG分成两部分,一部分决定步长,另一部分是与步长相乘的参数,参数可以自行设定,步长*参数=死区时间
tDTS=1/fDTS,fDTS由控制寄存器0(TIMERx_CTL0)中的CKDIV[1:0]设定,例程中参数是TIMER_CKDIV_DIV4。fDTS = 120/4=30MHz,tDT = 1/30us
步长1/30us,死区时间0~4.23us
步长1/15us,死区时间4.27~8.47us
步长4/15us,死区时间8.53~16.8us
步长8/15us,死区时间17.07~33.6us
例程如下:
void timer_config(void)
{
timer_oc_parameter_struct timer_ocintpara;
timer_parameter_struct timer_initpara;
timer_break_parameter_struct timer_breakpara;
rcu_periph_clock_enable(RCU_TIMER0);
timer_deinit(TIMER0);
/* TIMER0 configuration */
timer_initpara.prescaler = 119;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 1599;
timer_initpara.clockdivision = TIMER_CKDIV_DIV4; //采样时钟
timer_initpara.repetitioncounter = 0;
timer_init(TIMER0,&timer_initpara);
/* CH0/CH0N configuration in PWM mode0 */
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_HIGH;
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
timer_channel_output_config(TIMER0,TIMER_CH_0,&timer_ocintpara);
timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,7); //占空比
timer_channel_output_mode_config(TIMER0,TIMER_CH_0,TIMER_OC_MODE_PWM0);
timer_channel_output_shadow_config(TIMER0,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);
/* automatic output enable, break, dead time and lock configuration*/
timer_breakpara.runoffstate = TIMER_ROS_STATE_DISABLE;
timer_breakpara.ideloffstate = TIMER_IOS_STATE_DISABLE ;
timer_breakpara.deadtime = 164; //死区
timer_breakpara.breakpolarity = TIMER_BREAK_POLARITY_LOW;
timer_breakpara.outputautostate = TIMER_OUTAUTO_ENABLE;
timer_breakpara.protectmode = TIMER_CCHP_PROT_0;
timer_breakpara.breakstate = TIMER_BREAK_ENABLE;
timer_break_config(TIMER0,&timer_breakpara);
/* TIMER0 primary output function enable */
timer_primary_output_config(TIMER0,ENABLE);
/* auto-reload preload enable */
timer_auto_reload_shadow_enable(TIMER0);
/* TIMER0 counter enable */
timer_enable(TIMER0);
}
程序说明:
配置TIMER0 CH0/CH0N为互补PWM信号,硬件对应PA8(CH0)和PB13(CH0N),MCU为GD32F303VET6
CNT_CLK(PSC_CLK)=120/(119+1)=1MHz,一个周期是1us
设置deadtime=164=8`b10100100
DTCFG[7:5]=3`b10x,DTCFG[5:0]=6`b100100,DTvalue=(64+36)*4*2/120=6.67us
PWM输出波形是占空比减死区,当占空比设置小于死区时间时,没有波形输出。设置占空比为7,大于死区时间6.67,脉冲宽度为7-6.67=0.03us,测试波形如下: