你好我好大家好! 发表于 2015-1-28 19:39:53

stm32f051自带例程库中,六步PWM波(TIM_6Steps)的调试问题

本帖最后由 你好我好大家好! 于 2015-1-28 19:44 编辑

   有高手调试过st库函数中自带的TIM_6Steps历程吗?stm32f051xx的。我调试了一下,出来的波形是下图这样的file:///C:\Users\Administrator\Documents\Tencent Files\1835116269\Image\4~}7E)9FBC$1E]F6CKEYB(H.jpg,感觉有些问题就是1和1n通道有同时为高电平的时候,这样在电机控制板中上下桥臂的两只管子就会直通,就把电源烧坏了。我希望是在1和1n通道没有输出pwm的期间,对应管脚输出都为低电平。可能是哪里没有设置好,希望高手们可以只指点一下,



lkl0305 发表于 2015-1-28 20:25:17

没有用过,帮顶啊:)

dsjsjf 发表于 2015-1-29 09:11:48

没有用过,帮顶

星辰一方 发表于 2015-1-29 09:22:16

没用过,帮顶,等待大神来解答

bldc小菜鸟 发表于 2015-1-29 11:40:23

这和你的pwm驱动方式有关系,如果你采用了cmos的驱动方式,官网的驱动方式是什么样问题的,因为对于上桥高电平是关断状态,不会直通;如果你采用nnmos的驱动模式,就会出现你说的直通,会爆管子的。改进方法很简单,把现在的pwm输出极性任意取反一个即可,不管是上桥还是下桥都可以的。

你好我好大家好! 发表于 2015-1-31 11:45:09

bldc小菜鸟 发表于 2015-1-29 11:40
这和你的pwm驱动方式有关系,如果你采用了cmos的驱动方式,官网的驱动方式是什么样问题的,因为对于上桥高 ...

您好啊:
         我采用的是nnmos的驱动模式。现在希望的是:在各通道上同时为Disable期间,对应通道的引脚为低电平,比如上图中1和1n通道中划红线的部分,是两个通道同时为Disable,希望这里同时为低电平。
         定时器的配置是这样的, /* Channel 1, 2,3 and 4 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 2047;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High ;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set   ;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = 1023;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = 511;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);

/* Automatic Output enable, Break, dead time and lock configuration*/
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
TIM_BDTRInitStructure.TIM_DeadTime = 1;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

在中断中六步pwm是这样的,void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
/* Clear TIM1 COM pending bit */
TIM_ClearITPendingBit(TIM1, TIM_IT_COM);

if (step == 1)
{
    /* Next step: Step 2 Configuration -------------------------------------- */
    /*Channel3 configuration */
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);

    /*Channel1 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);

    /*Channel2 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1 );
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
    step++;
}
else if (step == 2)
{
    /* Next step: Step 3 Configuration -------------------------------------- */
    /*Channel2 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
   
    /*Channel3 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
   TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);

    /*Channel1 configuration */
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
    step++;
}
else if (step == 3)
{
    /* Next step: Step 4 Configuration -------------------------------------- */
    /*Channel3 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);

    /*Channel2 configuration */
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);

    /*Channel1 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
    step++;
}
else if (step == 4)
{
    /* Next step: Step 5 Configuration -------------------------------------- */
    /*Channel3 configuration */
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);

    /*Channel1 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);

    /*Channel2 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
    step++;
}
else if (step == 5)
{
    /* Next step: Step 6 Configuration -------------------------------------- */
    /*Channel3 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);

    /*Channel1 configuration */
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);

    /*Channel2 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
    step++;
}
else
{
    /* Next step: Step 1 Configuration -------------------------------------- */
    /*Channel1 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);

    /*Channel3 configuration */
    TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);

    /*Channel2 configuration */
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
    step = 1;
}
}

按道理说在两个通道同时Disable期间,对应引脚输出的电平就是为低电平啊,因为定时器的配置为TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High ;
可是用逻辑分析仪测试的结果不是这样的,希望能指点一下,先谢谢了

数码小叶 发表于 2015-1-31 12:56:47

不懂:o:o

左岸右岸 发表于 2015-2-3 11:42:32

没用过,帮顶一下吧!

阳光_~~ 发表于 2015-2-3 11:56:30

你好我好大家好! 发表于 2015-1-31 11:45
您好啊:
         我采用的是nnmos的驱动模式。现在希望的是:在各通道上同时为Disable期间,对应通 ...

你那个波形是怎么来的呀,我用的没问题,不过我是用在Full bright上,没一点问题呀。应该是你文档研究的不够深入,我没用库文件,自己写的。ST的这个PWM真心不好用,文档看起来要吐血,写的不明不白的。

bldc小菜鸟 发表于 2015-2-3 19:33:52

你好我好大家好! 发表于 2015-1-31 11:45
您好啊:
         我采用的是nnmos的驱动模式。现在希望的是:在各通道上同时为Disable期间,对应通 ...

能把你用逻辑分析仪检测的波形贴出来吗?不然不好分析。另,关于官网自带的程序的库还有讨论的空间:官网的程序基于051,内核是cotex—m0的好像,103系列的是基于cotex_m3,对于库的版本对于pwm输出极性的影响,参照下图,希望对你有帮助。
页: [1] 2
查看完整版本: stm32f051自带例程库中,六步PWM波(TIM_6Steps)的调试问题