打印
[电机及执行机构驱动]

自己做了个STM32的BLDC,但随机正反转

[复制链接]
6156|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
i小贤|  楼主 | 2015-10-17 11:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
如题,用STM32主控,IR2103驱动功率管。现在电机能转起来,但电机静止启动时有时往正向转,有时反向转,或你用手往那边拨动电机转子,电机就往哪边转。但转速会不一样。。。
这是什么问题????求高手指教
换向程序如下,现在程序没有PID速度环和电流环,就是简单的让其转起来
C:\Documents and Settings\Administrator\桌面\00.png
C:\Documents and Settings\Administrator\桌面\00.png

相关帖子

沙发
i小贤|  楼主 | 2015-10-17 11:08 | 只看该作者
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                           //»ù±¾½á¹¹Ìå
   TIM_OCInitTypeDef  TIM_OCInitStructure;                     //Êä³ö½á¹¹Ìå
   TIM_BDTRInitTypeDef  TIM_BDTRInitStructure;                                   //ËÀÇøɲ³µ½á¹¹Ìå
   
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

   TIM_DeInit(TIM1);

   TIM_TimeBaseStructure.TIM_Prescaler = 0;                                           //TIM1»ù±¾³õʼ»¯
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//ÖÐÑë¶ÔÆë¼¼Êõģʽ TIM_CounterMode_UpÏòÉϼÆÊý
   TIM_TimeBaseStructure.TIM_Period = 1499;                                           //PWM 16K
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

   TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCMode_Timing;                    //TIM1Êä³öͨµÀ³õʼ»¯
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                  
   TIM_OCInitStructure.TIM_Pulse = 499;
   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 =1200;
   TIM_OC2Init(TIM1,&TIM_OCInitStructure);

//   TIM_OCInitStructure.TIM_Pulse =1200;
   TIM_OC3Init(TIM1,&TIM_OCInitStructure);

//   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                    //TIM1ͨµÀ4³õʼ»¯£¬ÓÃÓÚ´¥·¢AD²ÉÑù
//   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;                  
//   TIM_OCInitStructure.TIM_Pulse =1495;
//   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;           
//  
//   TIM_OC4Init(TIM1,&TIM_OCInitStructure);

   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 = 10;
   TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;         //²»ÄÜ´ò¿ª£¿
   TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
   TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

   TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);

   TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷ԤװÔØ
   TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);         //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷ԤװÔØ
   TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);         //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷ԤװÔØ
   
         TIM_CCPreloadControl(TIM1, ENABLE);
         
         TIM_SelectCOM(TIM1, ENABLE);
         
   TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1);        //ÊäÈë´¥·¢Ô´Ñ¡ÔñTIM2
  
         TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE);
         
   TIM_Cmd(TIM1,ENABLE);

   TIM_CtrlPWMOutputs(TIM1,ENABLE);


                                                case 0x01:{                                                                                
                                                                                                        TIM1->CCER=0x3098;//3,6        cb
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x05:{
                                                                                                        TIM1->CCER=0x3089;//2,3                 ab                    
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;                                                        
                                                case 0x04:{
                                                                                                        TIM1->CCER=0x3809;//2,5    ac
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x06:{
                                                                                                        TIM1->CCER=0x3908;//4,5                  bc
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x02:{
                                                                                                        TIM1->CCER=0x3980;//1,4                  ba         
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x03:{                                               
                                                                                                        TIM1->CCER=0x3890;//1,6                  ca         
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                default:break;
                                                //*/

使用特权

评论回复
板凳
i小贤|  楼主 | 2015-10-17 11:09 | 只看该作者
有感,带霍尔的电机

使用特权

评论回复
地板
lib6303c| | 2015-10-17 14:15 | 只看该作者
你的图片没有上成功啊,可以点击如图所示的图标加入你[url=]图片[/url]的图片文件,再上传。有图了大家好做分析。

QQ图片20151017141403.png (707 Bytes )

QQ图片20151017141403.png

使用特权

评论回复
5
cnb12345| | 2015-10-17 16:43 | 只看该作者
估计传感受器位置判断和控制时序不对

使用特权

评论回复
6
保夫鲁沙| | 2015-10-17 19:15 | 只看该作者
换向出现问题了,捕获霍尔判断下一次怎么发PWM

使用特权

评论回复
7
598330983| | 2015-10-18 07:05 | 只看该作者
估计就是楼上说的那样,传感器和判断方向的问题

使用特权

评论回复
8
wt.liu| | 2015-10-18 08:39 | 只看该作者
本帖最后由 wt.liu 于 2015-10-18 08:40 编辑

启动前应该先正确判定传感器位置,然后根据现有位置确定通电的相和相序。还有你必须要把传感器位置装对了。

使用特权

评论回复
9
mintspring| | 2015-10-18 12:00 | 只看该作者
思路要清晰,然后如何实现,再慢慢写代码,别弄错了,漏项了。

使用特权

评论回复
10
i小贤|  楼主 | 2015-10-19 11:45 | 只看该作者
本帖最后由 i小贤 于 2015-10-19 11:46 编辑
保夫鲁沙 发表于 2015-10-17 19:15
换向出现问题了,捕获霍尔判断下一次怎么发PWM

我用定时器2捕获霍尔信号,当霍尔信号变的时候在tim2中断判断转子位置,然后控制换向,这样控制行吗?
void TIM2_IRQHandler(void)
{

        if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
    // calculate motor  speed or else with CCR1 values
    Hall_period = TIM2->CCR1;
                polarity = (Hall_period+1)*(127/72)*12;
                temp = (60000000/polarity);
               
                if(temp>22000)
                {        
                        tim1_ccr--;
//                        if(tim1_ccr<50) tim1_ccr=50;
                        TIM1->CCR1=tim1_ccr;
                        TIM1->CCR2=tim1_ccr;
                        TIM1->CCR3=tim1_ccr;
                }
                        if(temp<21000)
                        {
                                tim1_ccr++;
//                                if(tim1_ccr>1499) tim1_ccr=1499;
                                TIM1->CCR1=tim1_ccr;
                                TIM1->CCR2=tim1_ccr;
                                TIM1->CCR3=tim1_ccr;
                        }

        }
        else
//                if (TIM_GetITStatus(TIM2, TIM_IT_Trigger) != RESET)
//                if(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET)
                if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
                {
                        TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
               
// Check for the source of TIMx int - Capture or Update Event -
  
    // A capture event generated this interrupt

//   if ( TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET )
//  {
   
        switch(ReadHallState())                                 //??????,??CCER???????????
                        {
                        //*
                                                case 0x01:{                                                                                
                                                                                                        TIM1->CCER=0x3098;//3,6        cb
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x05:{
                                                                                                        TIM1->CCER=0x3089;//2,3                 ab                    
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;                                                        
                                                case 0x04:{
                                                                                                        TIM1->CCER=0x3809;//2,5    ac
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x06:{
                                                                                                        TIM1->CCER=0x3908;//4,5                  bc
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x02:{
                                                                                                        TIM1->CCER=0x3980;//1,4                  ba         
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x03:{                                               
                                                                                                        TIM1->CCER=0x3890;//1,6                  ca         
//                                                                                                        TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                default:break;
                                                //*/

                        }
   }
}

u8 ReadHallState(void)//读霍尔信号,转子位置
{
  u8 ReadValue;

//  __SETPRIMASK();
  ReadValue = (u8)(GPIO_ReadInputData(GPIOA))& 0x07;
//  NVIC_RESETPRIMASK();

  return(ReadValue);

使用特权

评论回复
11
i小贤|  楼主 | 2015-10-19 11:52 | 只看该作者
wt.liu 发表于 2015-10-18 08:39
启动前应该先正确判定传感器位置,然后根据现有位置确定通电的相和相序。还有你必须要把传感器位置装对了。 ...

位置确认了,然后按电机的时序图控制导通功率管,之后tim2捕获霍尔信号,当位置变时,根据转子位置控制导通功率管换相。现在就是电机启动时不定向转,有时正转有时反转,但正反转的速度不同,波形也不同,tim1输出的PWM占空比不变。

使用特权

评论回复
12
wt.liu| | 2015-10-20 08:48 | 只看该作者
i小贤 发表于 2015-10-19 11:52
位置确认了,然后按电机的时序图控制导通功率管,之后tim2捕获霍尔信号,当位置变时,根据转子位置控制导 ...

把你的通电时序和启动判定流程说说,看能不能帮你找到问题。

使用特权

评论回复
13
i小贤|  楼主 | 2015-10-20 11:27 | 只看该作者
wt.liu 发表于 2015-10-20 08:48
把你的通电时序和启动判定流程说说,看能不能帮你找到问题。

按图上的通电时序编写的,霍尔信号换相程序如下
void BLDC_Hall_Conifg(void)
{
                                      switch(ReadHallState())
                                      {                                                                                               case 0x01:{                                                                                                                                                                                        TIM1->CCER=0x3098;//3,6        b+c-
//                                                                                                          TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x05:{
                                                                                                        TIM1->CCER=0x3089;//2,3                 a+c-                    
//                                                                                                          TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;                                                        
                                                case 0x04:{
                                                                                                        TIM1->CCER=0x3809;//2,5    a+b-
//                                                                                                          TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x06:{
                                                                                                        TIM1->CCER=0x3908;//4,5                  c+b-
//                                                                                                          TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x02:{
                                                                                                        TIM1->CCER=0x3980;//1,4                  c+a-         
//                                                                                                            TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                case 0x03:{                                               
                                                                                                        TIM1->CCER=0x3890;//1,6                  b+a-         
//                                                                                                          TIM_GenerateEvent(TIM1,TIM_EventSource_COM);
                                                                                        };break;
                                                default:break;
                                      }
}
启动时就调用以上这个函数
int main(void)
{
        BLCK_TIMConifg();//TIM1 PWM输出和TIM2霍尔信号捕获初始化
        BLDC_Hall_Conifg();//启动判断转子位置
        key_gpio_conifg();//停止启动按钮
        while(1)
        {}

}

之后在TIM2中断里控制换相,也是以上的 BLDC_Hall_Conifg()换相程序




无刷风扇.jpg (452.75 KB )

无刷风扇.jpg

使用特权

评论回复
14
slm342107| | 2015-10-20 18:59 | 只看该作者
线序与相序的对应先对应好

使用特权

评论回复
15
wangtao478552| | 2015-10-29 14:48 | 只看该作者
定时检测好像不是很好

使用特权

评论回复
16
whj_2008| | 2015-11-6 15:49 | 只看该作者
初始相位判定不正确会造成问题,3路霍尔都要有边沿触发检测。

使用特权

评论回复
17
lanmanck| | 2019-5-9 12:16 | 只看该作者
这个因果关系有点乱,检查到hall变化就换向,那启动的时候hall不变化怎么换向启动起来呢?我一般是定时器查询hall,然后直接给换向信号!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝