TIM1马达驱动配置头大啊

[复制链接]
7358|8
 楼主| crazy2012 发表于 2013-8-29 08:57 来自手机 | 显示全部楼层 |阅读模式
就是这个硬件刹车后上下桥臂互补通道的电平怎么确定。看了那个手册上的表格没看明白啊@airwill
 楼主| crazy2012 发表于 2013-8-29 09:00 来自手机 | 显示全部楼层
总是配置不出来我想要的波形啊
airwill 发表于 2013-8-29 09:19 | 显示全部楼层
你想配置成什么呢? 最常用的是刹车变成全部无效低电平.
虽然设置有好多项, 也不算太复杂
测试的时候, 可以借助仿真器先验证一下各个寄存器配置.
 楼主| crazy2012 发表于 2013-8-29 15:19 | 显示全部楼层
本帖最后由 crazy2012 于 2013-8-29 15:29 编辑
airwill 发表于 2013-8-29 09:19
你想配置成什么呢? 最常用的是刹车变成全部无效低电平.
虽然设置有好多项, 也不算太复杂
测试的时候, 可以 ...

下面我写的可能比较多,希望你能耐心好好看看,代码部分你大概看下,看似好长其实很多是重复的配置。关键的地方我都说出来了。

另外这里面总是反复出现一个什么高电平、低电平有效啥的。我的理解就是:1就是高电平、就是有效电平,0则反之,不知道手册上引入有效电平这个概念有何意图。


我在做BLDC,我的硬件条件为上桥臂PMOS,低电平导通。下桥臂NMOS,高电平导通。
我需要的波形如下。

理想波形.gif

现在可以正常输出,遇到的问题是刹车功能不能按照我的意愿输出。
下图为正常输出的波形。
正常输出波形.gif
下图为刹车后,我需要CH1为高电平,CH1N为低电平,但是,却输出这个波形。
实测刹车波形.gif

我的软件代码是在6step这个例程中修改的
这里我只写出关键代码
初始化配置如下:
=================================

  1. /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  2.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  3.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  4.   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  5.   TIM_OCInitStructure.TIM_Pulse = ps;
  6.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  7.   TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  8.   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  9.   TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
  10.   TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  11.   /* Automatic Output enable, Break, dead time and lock configuration*/
  12.   TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  13.   TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  14.   TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  15.   TIM_BDTRInitStructure.TIM_DeadTime = 1;
  16.   TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
  17.   TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
  18.   TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  19.   TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
6步换相代码如下,这里提示一下,请注意换相过程中对下桥臂的输出电平进行的调整
这里比较绕口的就是  Polarity_Low实际上是往极性控制位写1,所以会输出高电平,
而Polarity_High实际上是往极性控制位写0,所以会输出低电平,也就是手册中所说的异或(xor)。

=====================================================
  
  1. if (step == 1)
  2.   {
  3.    /* Next step: Step 2 Configuration ---------------------------- */
  4.    
  5.    /*  Channel1 configuration */
  6.    // TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
  7.    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
  8. #if 0   
  9.    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
  10.    /**OC1N=CC1NP,CC1NP=0下桥臂关*/
  11.    TIM_OC1NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  12. #endif
  13.    
  14.    /*  Channel2 configuration */
  15.    // TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1 );
  16.    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
  17.    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
  18.    /*OC2N=CC2NP,CC2NP=1下桥臂开*/
  19.    TIM_OC2NPolarityConfig(TIM1, TIM_OCNPolarity_Low);
  20.    
  21.    /*  Channel3 configuration */
  22.    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
  23.    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
  24.    /*OC3N=CC3NP,CC3NP=0下桥臂关*/
  25.    TIM_OC3NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  26.    step++;
  27.   }
  28.   else if (step == 2)
  29.   {
  30.    /* Next step: Step 3 Configuration ---------------------------- */
  31.    
  32.    /*  Channel1 configuration */
  33.    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
  34. #if 0   
  35.    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
  36.    /**OC1N=CC1NP,CC1NP=0下桥臂关*/
  37.    TIM_OC1NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  38. #endif
  39.    
  40.    /*  Channel2 configuration */
  41.    //  TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
  42.    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);   
  43. #if 0
  44.    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
  45.    /*OC2N=CC2NP,CC2NP=1下桥臂开*/
  46.    TIM_OC2NPolarityConfig(TIM1, TIM_OCNPolarity_Low);
  47. #endif   
  48.    
  49.    /*  Channel3 configuration */
  50.    //   TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
  51.    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
  52. #if 0
  53.    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
  54.    /*OC3N=CC3NP,CC3NP=0下桥臂关*/
  55.    TIM_OC3NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  56. #endif   
  57.    step++;
  58.   }
  59.   else if (step == 3)
  60.   {
  61.    /* Next step: Step 4 Configuration ---------------------------- */
  62.    
  63.    /*  Channel1 configuration */
  64.    //   TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
  65.    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
  66.    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
  67.    /*OC1N=CC1NP,CC1NP=1下桥臂开*/
  68.    TIM_OC1NPolarityConfig(TIM1, TIM_OCNPolarity_Low);
  69.    
  70.    /*  Channel2 configuration */
  71.    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
  72.    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
  73.    /*OC2N=CC2NP,CC2NP=0下桥臂关*/
  74.    TIM_OC2NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  75.    
  76.    /*  Channel3 configuration */
  77.    //   TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
  78.    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
  79. #if 0
  80.    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
  81.    /*OC3N=CC3NP,CC3NP=0下桥臂关*/
  82.    TIM_OC3NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  83. #endif  
  84.    step++;
  85.   }
  86.   else if (step == 4)
  87.   {
  88.    /* Next step: Step 5 Configuration ---------------------------- */
  89.    
  90.    /*  Channel1 configuration */
  91.    //   TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
  92.    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
  93.    /*下桥臂常开*/
  94.    TIM_OC1NPolarityConfig(TIM1, TIM_OCNPolarity_Low);
  95.    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
  96.    
  97.    /*  Channel2 configuration */
  98.    //  TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
  99.    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
  100. #if 0
  101.    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
  102.    /*OC2N=CC2NP,CC2NP=0下桥臂关*/
  103.    TIM_OC2NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  104. #endif
  105.    
  106.    /*  Channel3 configuration */
  107.    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
  108. #if 0
  109.    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
  110.    /*OC3N=CC3NP,CC3NP=0下桥臂关*/
  111.    TIM_OC3NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  112. #endif  
  113.    step++;
  114.   }
  115.   else if (step == 5)
  116.   {
  117.    /* Next step: Step 6 Configuration ---------------------------- */
  118.    
  119.    /*  Channel1 configuration */
  120.    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
  121.    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
  122.    /**OC1N=CC1NP,CC1NP=0下桥臂关*/
  123.    TIM_OC1NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  124.    
  125.    /*  Channel2 configuration */
  126.    //   TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
  127.    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
  128. #if 0
  129.    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
  130.    /*OC2N=CC2NP,CC2NP=0下桥臂常关*/
  131.    TIM_OC2NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  132. #endif
  133.    
  134.    /*  Channel3 configuration */
  135.    //   TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
  136.    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
  137.    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
  138.    /*OC3N=CC3NP,CC3NP=1下桥臂开*/
  139.    TIM_OC3NPolarityConfig(TIM1, TIM_OCNPolarity_Low);  
  140.    step++;
  141.   }
  142.   else
  143.   {
  144.    /* Next step: Step 1 Configuration ---------------------------- */
  145.    /*  Channel1 configuration */
  146.    //   TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
  147.    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
  148. #if 0   
  149.    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
  150.    /**OC1N=CC1NP,CC1NP=0下桥臂关*/
  151.    TIM_OC1NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  152. #endif
  153.    
  154.    /*  Channel2 configuration */
  155.    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
  156. #if 0
  157.    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
  158.    /*OC2N=CC2NP,CC2NP=0下桥臂关*/
  159.    TIM_OC2NPolarityConfig(TIM1, TIM_OCNPolarity_High);
  160. #endif   
  161.    
  162.    /*  Channel3 configuration */
  163.    //    TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
  164.    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
  165.    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
  166.    /*OC3N=CC3NP,CC3NP=1下桥臂开*/
  167.    TIM_OC3NPolarityConfig(TIM1, TIM_OCNPolarity_Low);  
  168.    step = 1;
我发现采用上面的代码刹车后,上下桥臂照样有输出,只不过成了下面这种情况。
于是我放弃硬件刹车功能改用软件刹车,当需要刹车时候,不再执行6步换相的函数代码,而是采用下面的方法。
这样可以实现我的功能。就是硬件刹车还是用不起来。

  1. /*  Channel1 configuration */
  2. TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
  3. /**OC1=CC1P,CC1P=1上桥臂关*/
  4. TIM_OC1PolarityConfig(TIM1, TIM_OCPolarity_Low);
  5. TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
  6. /**OC1N=CC1NP,CC1NP=0下桥臂关*/
  7. TIM_OC1NPolarityConfig(TIM1, TIM_OCNPolarity_High);
我对下面的几个参数组合配置还是迷糊,请问里面的空闲状态到底什么时候是空闲状态,是指刹车后,不再输出PWM,输出指定的电平么?
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

下面两个更是诡异
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
BTDR.gif

下面这个表格感觉太隐晦了,不知道是我理解能力差还是他这个表格太简单了,看的头晕啊,我调试了3天了。

CR2
CCMR1
CCER
BDTR
这几个寄存器我都有好好看过,但是还得觉得理解不透侧。

下面这个表格看的我是云里来雾里去啊
CCER.gif





 楼主| crazy2012 发表于 2013-8-29 15:27 | 显示全部楼层
airwill 发表于 2013-8-29 09:19
你想配置成什么呢? 最常用的是刹车变成全部无效低电平.
虽然设置有好多项, 也不算太复杂
测试的时候, 可以 ...

我要求刹车以后,上桥臂OCx输出高电平,下桥臂OCxN输出低电平
天四明 发表于 2015-1-22 13:45 | 显示全部楼层
现在有同样的问题,关注
天四明 发表于 2015-1-23 13:50 | 显示全部楼层
问一个问题啊,不知道你有没有发现你实现的波形和理想的pwm波形并不一样?你的电路上桥是pmos,高压关断,低压导通,所以在不导通的时候应该都是高压状态,但是你输出的是低压状态,这会不会问题的原因呢?
vivianlan1990 发表于 2015-12-9 10:53 | 显示全部楼层
解决了没有?
gyh974 发表于 2015-12-10 08:17 | 显示全部楼层
刹车就是互补通输出均无效
您需要登录后才可以回帖 登录 | 注册

本版积分规则

150

主题

939

帖子

9

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