关于占空比和死区的设置

本文参考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,测试波形如下:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值