请教GD32F303Rxx,Timer0,启动死区就无波形输出。谢谢

[复制链接]
1600|7
 楼主| 汽车电子 发表于 2021-4-19 18:33 | 显示全部楼层 |阅读模式
void timer0_config(void)
{
    /* -----------------------------------------------------------------------
    TIMER0 configuration:
    generate 1 complementary PWM signal.
    TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 120 so the
    TIMER0 counter clock used is 1MHz.
    the duty cycle is computed as the following description:
    the channel 0 duty cycle is set to 25% so channel 0N is set to 75%.

    insert a dead time equal to ((32+31)*16*4)/systemcoreclock = 33.6us

    configure the break feature, active at high level, and using the automatic
    output enable feature.

    use the locking parameters level1.
    ----------------------------------------------------------------------- */
    timer_oc_parameter_struct                 timer_ocintpara;
    timer_parameter_struct                                 timer_initpara;
    timer_break_parameter_struct         timer_breakpara;
       
                dma_config();
       
          rcu_periph_clock_enable(RCU_TIMER0);
                rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_AF);

    /*configure PA8(TIMER0 CH0) as alternate function*/
    gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_8);

    /*configure PB13(TIMER0 CH0N) as alternate function*/
    gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_13);

   

    timer_deinit(TIMER0);

    /* TIMER0 configuration */
    timer_initpara.prescaler         = 0;
    timer_initpara.alignedmode       = TIMER_COUNTER_CENTER_BOTH;//TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 1250;                                // 24KHz
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    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,BufferSPWM[0]);
    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         = 100;
    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);
               
                /* TIMER0 update DMA request enable */
    timer_dma_enable(TIMER0,TIMER_DMA_UPD);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER0);

    /* TIMER0 counter enable */
    timer_enable(TIMER0);
}
 楼主| 汽车电子 发表于 2021-4-19 18:34 | 显示全部楼层
官方样例原样不修改,也不行。启动死区功能,就根本无波形输出。不启用死区时波形正常。
zeshoufx 发表于 2021-4-20 10:14 | 显示全部楼层
可以参考我的帖子,,,https://bbs.21ic.com/icview-3013678-1-1.html
sonicll 发表于 2021-4-20 10:29 | 显示全部楼层
是不是死区时间设置的比占空比还大了?
 楼主| 汽车电子 发表于 2021-4-20 10:45 | 显示全部楼层
sonicll 发表于 2021-4-20 10:29
是不是死区时间设置的比占空比还大了?

没有,死区时间才100,定时器周期1250,系列脉冲中,占空比小于100的极少数
 楼主| 汽车电子 发表于 2021-4-20 13:28 | 显示全部楼层
zeshoufx 发表于 2021-4-20 10:14
可以参考我的帖子,,,https://bbs.21ic.com/icview-3013678-1-1.html

谢谢,验证是可以的
喂什么玩意 发表于 2021-4-24 22:39 | 显示全部楼层
去参考贴看看
770621431 发表于 2022-8-24 10:10 | 显示全部楼层
timer_breakpara.breakstate       = TIMER_BREAK_ENABLE 这句话使能了中止功能,必须PB12脚接高电平才能输出,直接disable就行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

366

主题

2058

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部