你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
你好我好大家好! 提问时间:2015-1-28 19:39 /
本帖最后由 你好我好大家好! 于 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的期间,对应管脚输出都为低电平。可能是哪里没有设置好,希望高手们可以只指点一下,



QQ截图20150128193242.png
收藏 1 评论19 发布时间:2015-1-28 19:39

举报

19个回答
你好我好大家好! 回答时间: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-2-4 09:21:08
本帖最后由 你好我好大家好! 于 2015-2-4 09:31 编辑
阳光_~~ 发表于 2015-2-3 11:56
你那个波形是怎么来的呀,我用的没问题,不过我是用在Full bright上,没一点问题呀。应该是你文档研究的 ...

你是说1楼的那个波形吗?那个波形就是用逻辑分析仪测量出来的。就是将stm32f0xx的外设库中的TIM_6Steps例程(历程的位置:STM32F0xx_StdPeriph_Lib_V1.4.0->Projects->STM32F0xx_StdPeriph_Examples->TIM->TIM_6Steps)下载到我的学习开发板:stm32f0discovery中测量出来的,打算把这个例程用到无刷直流电机驱动上面上呢,结果测量后发现在上下两个互补通道都关闭后,对应引脚输出的为高电平(按照无刷直流电机驱动理论和例程中的配置:TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High ;对应引脚应该输出低电平。就是1楼图片中划红线部分为两个互补通道都关闭的时候,应该输出低电平才对的),不知道是开发板坏了,还是我没理解好手册,阳光大哥配置的代码是使用在f0xx上面吗?能把你的代码贴出来共享一下吗?谢谢了
你好我好大家好! 回答时间:2015-2-4 09:37:55
bldc小菜鸟 发表于 2015-2-3 19:33
能把你用逻辑分析仪检测的波形贴出来吗?不然不好分析。另,关于官网自带的程序的库还有讨论的空间:官网 ...

逻辑分析仪测量出来的波形贴在1楼了,就是将stm32f0xx的外设库中的TIM_6Steps例程(历程的位置:STM32F0xx_StdPeriph_Lib_V1.4.0->Projects->STM32F0xx_StdPeriph_Examples->TIM->TIM_6Steps)下载到我的学习开发板:stm32f0discovery中测量出来的,打算把这个例程用到无刷直流电机驱动上面上呢,结果测量后发现在上下两个互补通道都关闭后,对应引脚输出的为高电平(按照无刷直流电机驱动理论和例程中的配置:TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High ;对应引脚应该输出低电平。就是1楼图片中划红线部分为两个互补通道都关闭的时候,应该输出低电平才对的),不知道是开发板坏了,还是我没理解好手册,找了好几天原因了,还是没解决,哎哎,另外你这波形是103的吧
lkl0305 回答时间:2015-1-28 20:25:17
没有用过,帮顶啊
埃斯提爱慕 回答时间:2015-1-29 09:11:48
提示: 作者被禁止或删除 内容自动屏蔽
星辰一方 回答时间:2015-1-29 09:22:16
没用过,帮顶,等待大神来解答
bldc小菜鸟 回答时间:2015-1-29 11:40:23
这和你的pwm驱动方式有关系,如果你采用了cmos的驱动方式,官网的驱动方式是什么样问题的,因为对于上桥高电平是关断状态,不会直通;如果你采用nnmos的驱动模式,就会出现你说的直通,会爆管子的。改进方法很简单,把现在的pwm输出极性任意取反一个即可,不管是上桥还是下桥都可以的。
wyxy163@126.com 回答时间:2015-1-31 12:56:47
提示: 作者被禁止或删除 内容自动屏蔽
左岸右岸 回答时间: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输出极性的影响,参照下图,希望对你有帮助。
库对pwm极性影响.jpg
bldc小菜鸟 回答时间:2015-2-4 16:44:25
你好我好大家好! 发表于 2015-2-4 09:37
逻辑分析仪测量出来的波形贴在1楼了,就是将stm32f0xx的外设库中的TIM_6Steps例程(历程的位置:STM32F0xx ...

现在使用103的还比较普遍,而且库版本问题一直都很困扰,051的程序不能直接移植,其时钟和io口设置和103有较大的差别,要不你换一个库试试,而且用于bldc的pwm驱动程序网上也有很多,不见得非得要用它的,它的程序自然接近最优的,但是很大替换程序写得也不差,换相部分的程序也有不少,我最近也在做bldc控制,只不过做的是无感的,算法要复杂一些,不过还没有做出来。
你好我好大家好! 回答时间:2015-2-4 21:40:26
本帖最后由 你好我好大家好! 于 2015-2-4 21:43 编辑
bldc小菜鸟 发表于 2015-2-4 16:44
现在使用103的还比较普遍,而且库版本问题一直都很困扰,051的程序不能直接移植,其时钟和io口设置和103 ...

哎!关键051的板子已经做出来了。刚才我试了一下103官方外设库中自带的六步电压的历程,测量出来的波形是正确的,波形图如下,其中的配置和051的差不多,可是051的就是不对,看着051的手册和历程中软件的配置是一致的,但是测量的波形就是不对,哎,,,愁死我了C:\Users\Administrator\Desktop
stm32f103.png
bldc小菜鸟 回答时间:2015-2-5 09:51:42
你好我好大家好! 发表于 2015-2-4 21:40
哎!关键051的板子已经做出来了。刚才我试了一下103官方外设库中自带的六步电压的历程,测量出来的波形是 ...

哦,好吧,这个我也不清楚了,我用的pwm波都是我自己调出来的,感觉还行。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版