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

无刷直流电机不转

[复制链接]
好久啊 提问时间:2015-7-9 10:12 /
阅读主题, 点击返回1楼
收藏 评论12 发布时间:2015-7-9 10:12
12个回答
那就地方iv 回答时间:2015-7-14 11:02:48
好久啊 发表于 2015-7-14 09:58
暂时还用不到电调

电调就是控制无刷电机的,你现在做的控制板跟电调的功能是一样的
星辰一方 回答时间:2015-7-14 11:09:47
好久啊 发表于 2015-7-14 09:58
暂时还用不到电调

不用电调怎么驱动呢?
好久啊 回答时间:2015-7-14 11:14:10
本帖最后由 好久啊 于 2015-7-14 11:15 编辑
那就地方iv 发表于 2015-7-14 11:02
电调就是控制无刷电机的,你现在做的控制板跟电调的功能是一样的
  1. #include "hall.h"

  2. unsigned char bHallStartStep;//换相步序变量定义
  3. //换相步序值0-5分别对应AB\AC\BC\BA\CA\CB
  4. unsigned int OutPwmValue=0;//PWM输出值变量定义


  5. unsigned char bHallSteps[2][8]={
  6. {7,5,3,4,1,0,2,7},//正转
  7. {7,2,0,1,4,3,5,7}//反转
  8. };

  9. const unsigned char PWM_EN1_TAB[6]={0x01,0x01,0x10,0x10,0x00,0x00};
  10. //六步法中,CH1\CH2通道极性及使能配置
  11. const unsigned char PWM_EN2_TAB[6]={0x0,0x00,0x00,0x0,0x1,0x1};
  12. //六步法中,CH3通道极性及使能配置

  13. //初始化HALL捕获输入定义器
  14. void Init_TIM2(void)
  15. {
  16.         //计数器禁止、ARR预装载禁止、向上计数、边沿对齐模式
  17.         TIM2->CR1 = BIT2;

  18.         //禁止TIM2所有中断
  19.         TIM2->IER = 0;//禁止中断

  20.         TIM2->CCMR1 = 0x01;//TIM2的CH1\CH2\CH3通道配置为输入
  21.         TIM2->CCMR2 = 0x01;
  22.         TIM2->CCMR3 = 0x01;

  23.         #define IC_FILTER (u8)(5 << 4)
  24.         TIM2->CCMR1 |= IC_FILTER; //输入捕获滤波器
  25.         TIM2->CCMR2 |= IC_FILTER;
  26.         TIM2->CCMR3 |= IC_FILTER;

  27.         //prescale = div3 @ 16MHz -> 0.5us/count * 24MHz -> 0.33us/count
  28.         TIM2->PSCR = 0;

  29.         TIM2->ARRH=0xff;//计数周期设为最大
  30.         TIM2->ARRL=0xff;
  31.         
  32.         TIM2->CCER1 |= 0x01;//TIM2的CH1\CH2\CH3通道使能捕获功能
  33.         TIM2->CCER1 |= 0x10;
  34.         TIM2->CCER2 |= 0x01;

  35.         TIM2->CR1 |= 0x01;//使能TIM2定时器
  36. }

  37. //根据HALL状态换相,启动电机运行
  38. void TIM2_InitCapturePolarity(void)
  39.         {
  40.                 u8 bHStatus = 0;
  41.                 GPIOD->DDR &= (u8)(~(0x1c));//HALL端口模式配置
  42.                
  43.                 // Read status of H1 and set the expected polarity
  44.         if (H1_PORT & H1_PIN)
  45.         {
  46.                 TIM2->CCER1 |= BIT1;
  47.                 bHStatus |= BIT2;
  48.         }
  49.         else
  50.         {
  51.                 TIM2->CCER1 &= (u8)(~(BIT1));
  52.         }
  53.         
  54.         // Read status of H2 and set the expected polarity
  55.         if (H2_PORT & H2_PIN)
  56.         {
  57.                 TIM2->CCER1 |= BIT5;
  58.                 bHStatus |= BIT1;
  59.         }
  60.         else
  61.         {
  62.                 TIM2->CCER1 &= (u8)(~(BIT5));
  63.         }
  64.                
  65.                 // Read status of H3 and set the expected polarity
  66.         if (H3_PORT & H3_PIN)
  67.         {
  68.                         TIM2->CCER2 |= BIT1;
  69.                         bHStatus |= BIT0;
  70.         }
  71.         else
  72.         {
  73.                         TIM2->CCER2 &= (u8)(~(BIT1));
  74.         }

  75.                 bHallStartStep = bHallSteps[0][bHStatus];//得到换相步序

  76.                 if (bHallStartStep == 7)//不该出现的HALL状态
  77.                 {                        
  78.                         return;
  79.                 }
  80.                
  81.                 TIM2->SR1=(u8)~(TIM2_IT_CC3|TIM2_IT_CC2|TIM2_IT_CC1);        
  82.                 TIM2->IER = 0x0e;//使能输入捕获中断
  83.                 ComHandler();//输出PWM信号,启动电机
  84. }

  85. //捕获中断,即HALL状态变化时,进入此中断
  86. @near @interrupt @svlreg void TIM2_CAP_COM_IRQHandler(void)
  87. {
  88.         u8 bHStatus = 0;

  89.         // Read status of H1 and set the expected polarity
  90.         if (H1_PORT & H1_PIN)
  91.         {
  92.                 TIM2->CCER1 |= BIT1;
  93.                 bHStatus |= BIT2;
  94.         }
  95.         else
  96.         {
  97.                 TIM2->CCER1 &= (u8)(~(BIT1));
  98.         }
  99.         
  100.         // Read status of H2 and set the expected polarity
  101.         if (H2_PORT & H2_PIN)
  102.         {
  103.                 TIM2->CCER1 |= BIT5;
  104.                 bHStatus |= BIT1;
  105.         }
  106.         else
  107.         {
  108.                 TIM2->CCER1 &= (u8)(~(BIT5));
  109.         }
  110.         
  111.         // Read status of H3 and set the expected polarity
  112.         if (H3_PORT & H3_PIN)
  113.         {
  114.                 TIM2->CCER2 |= BIT1;
  115.                 bHStatus |= BIT0;
  116.         }
  117.         else
  118.         {
  119.                 TIM2->CCER2 &= (u8)(~(BIT1));
  120.         }
  121.         
  122.         if (TIM2->SR1 & BIT2)
  123.         {
  124.                 TIM2->SR1=(u8)(~TIM2_IT_CC2);
  125.         }

  126.         if (TIM2->SR1 & BIT1)
  127.         {
  128.                 TIM2->SR1=(u8)(~TIM2_IT_CC1);
  129.         }

  130.         if (TIM2->SR1 & BIT3)
  131.         {
  132.                 TIM2->SR1=(u8)(~TIM2_IT_CC3);
  133.         }


  134.         bHallStartStep = bHallSteps[0][bHStatus];//得到换相步序

  135.         if (bHallStartStep == 7)
  136.         { //故障,停止输出
  137.                 TIM1->BKR &= (uint8_t)(~TIM1_BKR_MOE);//禁止PWM输出
  138.                 PWM_A_OFF;
  139.                 PWM_B_OFF;
  140.                 PWM_C_OFF;
  141.                 return;
  142.         }
  143.         
  144.         ComHandler();        //换相
  145.         return;
  146. }

  147. //换相子函数
  148. void         ComHandler(void)
  149. {
  150.         TIM1->BKR &= (uint8_t)(~TIM1_BKR_MOE);//禁止PWM输出
  151.         if(bHallStartStep!=3&&bHallStartStep!=4)
  152.         PWM_A_OFF;
  153.         if(bHallStartStep!=0&&bHallStartStep!=5)
  154.         PWM_B_OFF;
  155.         if(bHallStartStep!=1&&bHallStartStep!=2)
  156.         PWM_C_OFF;
  157.          
  158.         //根据换相步序,打开不同的开关管,并施加正确的PWM信号
  159.         if(bHallStartStep==0)//AB
  160.         {
  161.                 TIM1->CCR1H = (uint8_t)(OutPwmValue >> 8);
  162.     TIM1->CCR1L = (uint8_t)(OutPwmValue);
  163.                 PWM_B_ON;
  164.         }
  165.   else if(bHallStartStep==1)        //AC
  166.         {
  167.                 TIM1->CCR1H = (uint8_t)(OutPwmValue >> 8);
  168.     TIM1->CCR1L = (uint8_t)(OutPwmValue);
  169.           PWM_C_ON;
  170.         }
  171.         else if(bHallStartStep==2)        //BC
  172.         {
  173.                 TIM1->CCR2H = (uint8_t)(OutPwmValue >> 8);
  174.     TIM1->CCR2L = (uint8_t)(OutPwmValue);
  175.           PWM_C_ON;
  176.         }
  177.         else if(bHallStartStep==3)        //BA
  178.         {
  179.                 TIM1->CCR2H = (uint8_t)(OutPwmValue >> 8);
  180.     TIM1->CCR2L = (uint8_t)(OutPwmValue);
  181.           PWM_A_ON;
  182.         }
  183.         else if(bHallStartStep==4)//CA
  184.         {
  185.                 TIM1->CCR3H = (uint8_t)(OutPwmValue >> 8);
  186.     TIM1->CCR3L = (uint8_t)(OutPwmValue);
  187.           PWM_A_ON;
  188.         }
  189.         else if(bHallStartStep==5)        //CB
  190.         {
  191.                 TIM1->CCR3H = (uint8_t)(OutPwmValue >> 8);
  192.     TIM1->CCR3L = (uint8_t)(OutPwmValue);
  193.           PWM_B_ON;
  194.         }
  195.         
  196.         TIM1->CCER1=PWM_EN1_TAB[bHallStartStep];
  197.         TIM1->CCER2=PWM_EN2_TAB[bHallStartStep];               
  198.         TIM1->BKR|=TIM1_BKR_MOE;//使能PWM输出
  199. }
复制代码



这一段是用tim2定时器捕获的霍尔信号模块,可以正常运行,然而我用外部中断,却不可以正常工作
12

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版