西周时代 发表于 2012-7-16 17:37:26

简易自搭电路强行驱动电机,电调的强行驱动部分...求助

本帖最后由 西周时代 于 2012-7-16 23:13 编辑

刚弄电调,自己的水平有限,自己根据网上的最基本的电路自己搭了一个驱动朗宇电机2212的简易的无过零点检测的简易的面包板电路,电路的测试基本正常,想用程序直接强行驱动这个电机,在调试的过程中,电机堵住了,一直抖动。。小的自认为是周期和占空比的设置不对,求大神指点一下这个问题,不胜感激啊。。。。。。
启动的基本思想就是:先给一定的占空比,每一相的通电时间逐渐变短(缩短规律参照mk的timer-=timer/15+1),然后短到一定时间后,直接切换到正常的换向程序(由于没有过零点检测的反馈,所以就还是固定周期的换每一相)..
可是一直就是抖啊抖的。。。不转。。。。求大神指导一下菜鸟。。。谢谢了啊。。。

976717326 发表于 2012-7-16 17:45:22

同求大神现身!

西周时代 发表于 2012-7-16 18:12:18

急等大神指导啊。。求指导啊。。。。。。

就是一枪 发表于 2012-7-16 18:34:45

大神在哪里?快出来吧。我们都急切地呼唤你。。。{:titter:}

tiancaigao7 发表于 2012-7-16 18:37:54

贴程序,保证你的换相顺序是正确的,磁链是顺序旋转的。

西周时代 发表于 2012-7-16 19:35:15

tiancaigao7 发表于 2012-7-16 18:37 static/image/common/back.gif
贴程序,保证你的换相顺序是正确的,磁链是顺序旋转的。

程序写的不好啊,很搓的,,还望见谅一下,帮忙开一看!
分了蛮多外设的文件,就没有全部贴上来,只是将几个函数贴上来了。。用的是stm32的板子做的。。
这个是强行启动的函数:

/********************************************************
/ Function Name : Start
/ Description   : 强行启动电机
/ InPut         : pwm开始的强行输入值和强行驱动的时间的长度timer ,temp启动的截止时间
/ OutPut      : None
/ Return      : 0(表示启动未完成)&1(表示启动完成)
********************************************************/
//u16 Start(u16 pwm,float timer)
void Start(u16 pwm,u16 timer,u16 temp)
{       
//    if(timer>17) return 0;
//        else
//        {
                while(timer>temp)
                {
                        PWM5_VAL=0;
                        PWM2_VAL=0;
                        PWM1_VAL=pwm;                                                                  //A+的pwm值输入
                        A=0;C=0;B=1;                                                                  //A+B-
                        delay_us(timer*100);
                        LED1=1;
//                  if((ADC_MITTEL>0)&&(ADC_MITTEL<4096))
//                        {
//                                return 1;
//                        }               
                                  
                        timer=timer-timer/15+1;
                        PWM2_VAL=0;
                        PWM5_VAL=0;
                        PWM1_VAL=pwm;                                                                  //A+的pwm值输入
                        A=0;B=0;C=1;                                                                  //A+C-
                        delay_us(timer*100);
                        LED3=!LED3;
                        LED1=!LED1;
//                        if((ADC_MITTEL>0)&&(ADC_MITTEL<4096))
//                        {
//                                return 1;
//                        }
                        timer=timer-timer/15+1;
                        PWM1_VAL=0;
                        PWM5_VAL=0;
                        PWM2_VAL=pwm;                                                                  //B+的pwm值输入
                        A=0;B=0;C=1;                                                                  //B+C-
                        delay_us(timer*100);
                        LED3=1;
//                        if((ADC_MITTEL>0)&&(ADC_MITTEL<4096))
//                        {
//                                return 1;
//                        }
                        timer=timer-timer/15+1;
                        PWM1_VAL=0;
                        PWM5_VAL=0;
                        PWM2_VAL=pwm;                                                                  //B+的pwm值输入
                        B=0;C=0;A=1;                                                                  //B+A-
                        delay_us(timer*100);
                        LED3=!LED3;
//                  if((ADC_MITTEL>0)&&(ADC_MITTEL<4096))
//                        {
//                                return 1;
//                        }
                        timer=timer-timer/15+1;
                        PWM1_VAL=0;
                        PWM2_VAL=0;
                        PWM5_VAL=pwm;                                                                  //C+的pwm值输入
                        B=0;C=0;A=1;                                                                  //C+A-
                        delay_us(timer*100);
//                        LED3=!LED3;
//                  if((ADC_MITTEL>0)&&(ADC_MITTEL<4096))
//                        {
//                                return 1;
//                        }
                        timer=timer-timer/12+1;
                        PWM1_VAL=0;
                        PWM2_VAL=0;
                        PWM5_VAL=pwm;                                                                  //C+的pwm值输入
                        A=0;C=0;B=1;
                        LED1=1;                                                                          //C+B-
                        delay_us(timer*100);
//                        LED3=!LED3;

//                  if((ADC_MITTEL>0)&&(ADC_MITTEL<4096))
//                        {
//                                return 1;
//                        }
                        timer=timer-timer/15+1;
                //        if((timer<2)&&(ADC_MITTEL>0)&&(ADC_MITTEL<4096)) return 1;
          }          
//        }                 
}
这个是换向的函数:
/************************************************************
/ Function Name : Change_Direction
/ Description   :换相
/ InPut                 :pwm_val
/ OutPut      :None
/ Return      :None
************************************************************/
void Change_Direction(u16 pwm_val,u16 timer)                                                                                  
{
        while(1)
        {
          PWM2_VAL=0;
      PWM5_VAL=0;
          PWM1_VAL=pwm_val;
          A=0;C=0;B=1;
          delay_ms(timer);
          LED1=0;
          LED3=0;
//          while(Get_Adc(ADC_NULL_C)!=Get_Adc(ADC_MITTEL))
//          {
//                  LED1=!LED1;
//        //        printf("%f\n",Get_Adc(ADC_NULL_C));
//                printf("1");
//          }
//          LED3=!LED3;

          PWM2_VAL=0;
          PWM5_VAL=0;
          PWM1_VAL=pwm_val;
          A=0;B=0;C=1;
          delay_ms(timer);
//          while(Get_Adc(ADC_NULL_B)!=Get_Adc(ADC_MITTEL))
//          {
//                  LED1=!LED1;
//                printf("2");
//          }
//          LED3=!LED3;

          PWM1_VAL=0;
          PWM5_VAL=0;
          PWM2_VAL=pwm_val;
          A=0;B=0;C=1;
          delay_ms(timer);
//          while(Get_Adc(ADC_NULL_A)!=Get_Adc(ADC_MITTEL))
//          {
//                  LED1=!LED1;
//                printf("3");
//          }
//          LED3=!LED3;

             PWM1_VAL=0;
          PWM5_VAL=0;
          PWM2_VAL=pwm_val;
          B=0;C=0;A=1;
          delay_ms(timer);
//          while(Get_Adc(ADC_NULL_C)!=Get_Adc(ADC_MITTEL))
//          {
//                  LED1=!LED1;
//                printf("4");
//          }
//          LED3=!LED3;

          PWM2_VAL=0;
          PWM1_VAL=0;
          PWM5_VAL=pwm_val;
          B=0;C=0;A=1;
          delay_ms(timer);
//          while(Get_Adc(ADC_NULL_B)!=Get_Adc(ADC_MITTEL))
//          {
//                  LED1=!LED1;
//                printf("5");
//          }
//          LED3=!LED3;

          PWM2_VAL=0;
          PWM1_VAL=0;
          PWM5_VAL=pwm_val;
          A=0;C=0;B=1;
          LED1=LED3=1;
          delay_ms(timer);
//          while(Get_Adc(ADC_NULL_A)!=Get_Adc(ADC_MITTEL))
//          {
//                  LED1=!LED1;
//                printf("6");
//          }
//          LED3=!LED3;
        }
}

pwm波的频率是4khz,主程序里面关于测试的部分主要是:
while(1)

                    Start(10,300,20);
                Change_Direction(10,2);


还有就是如果在编程的一些指导的建议的话或者是比较好的习惯的话,也请指出来,好学习一下的。。谢谢了。。
还麻烦看一看 程序。。。。

tiancaigao7 发表于 2012-7-16 19:52:35

你的300单位是什么?ms?如果强制换相都不转的话,一个是换向顺序有问题,不过楼上的那个看起来至少逻辑上没有什么问题,然后就是换相的间隔太快了,可能。

西周时代 发表于 2012-7-16 19:58:26

tiancaigao7 发表于 2012-7-16 19:52 static/image/common/back.gif
你的300单位是什么?ms?如果强制换相都不转的话,一个是换向顺序有问题,不过楼上的那个看起来至少逻辑上 ...

300的单位是0.1ms的,就是300*100us=30ms的换向时间,换相的逻辑上上按照电机的一般换向的顺序(AB->AC->BC->BA->CA->CB->AB),会不会有可能是由于开始换相的时候是不知道那一极,然后到了这一极的加速的时间过短啊?

tiancaigao7 发表于 2012-7-16 20:20:03

30ms理论上不短了,不过你可以考虑加长一些。另外换向顺序尝试一下AB-CB-CA-BA-BC-AC

西周时代 发表于 2012-7-16 20:29:30

tiancaigao7 发表于 2012-7-16 20:20 static/image/common/back.gif
30ms理论上不短了,不过你可以考虑加长一些。另外换向顺序尝试一下AB-CB-CA-BA-BC-AC ...

更换顺序的话,如果不修改代码的话就只是换一下电机的输入应该也可以的吧?

lollipop 发表于 2012-7-16 22:15:08

先从最根源最简单的地方检查:换相顺序对吗?

西周时代 发表于 2012-7-16 23:04:49

tiancaigao7 发表于 2012-7-16 20:20 static/image/common/back.gif
30ms理论上不短了,不过你可以考虑加长一些。另外换向顺序尝试一下AB-CB-CA-BA-BC-AC ...

刚才自己实验了一下,发现实际上还是没有什么变化,所有的现象基本上和没有调换之前是一样的。。。。所以基本上没有什么变化,我觉得是不是这种毫无反馈控制的强制启动的思想不对啊?

西周时代 发表于 2012-7-16 23:08:12

lollipop 发表于 2012-7-16 22:15 static/image/common/back.gif
先从最根源最简单的地方检查:换相顺序对吗?

换向的顺序是对的,可是就是强行启动不了啊。。时间的间隔的控制也没有什么问题,觉得因该是程序运行的过程中不管启动与否都直接运行下面的程序,可是这样简单的电路基本上是没有办法有反馈控制这部分的。。。所以还求大神支招啊。。。。。。

tiancaigao7 发表于 2012-7-17 09:02:37

不需要位置检测,强制换相从某种意义上说是最可靠的,只要启动的顺序正确,换相的间隔合适,任何电机都会转动。你可以只运行启动部分程序,然后用示波器看PWM的输出信号,看看是不是正确。

西周时代 发表于 2012-7-17 09:07:33

tiancaigao7 发表于 2012-7-17 09:02 static/image/common/back.gif
不需要位置检测,强制换相从某种意义上说是最可靠的,只要启动的顺序正确,换相的间隔合适,任何电机都会转 ...

听了你的话有信心继续弄下去了,好的,我去试一试。。。。

西周时代 发表于 2012-7-17 22:23:21

tiancaigao7 发表于 2012-7-17 09:02 static/image/common/back.gif
不需要位置检测,强制换相从某种意义上说是最可靠的,只要启动的顺序正确,换相的间隔合适,任何电机都会转 ...

基本上试了,基本上没有什么太大的变化。。。。这是一些波形图,希望您能给分析一下原因。。我觉得基本上应该都正确,,可是加上电机就不对了。。。求解释一下。。。。

tiancaigao7 发表于 2012-7-18 07:49:51

西周时代 发表于 2012-7-17 22:23 static/image/common/back.gif
基本上试了,基本上没有什么太大的变化。。。。这是一些波形图,希望您能给分析一下原因。。我觉得基本上 ...

简单一点,不要增加换相频率,就用最慢的速度换相,如果这样还不转,那么检查电机,看看是不是缺项。另外,你确定你使用的是BLDC??

西周时代 发表于 2012-7-18 09:08:26

tiancaigao7 发表于 2012-7-18 07:49 static/image/common/back.gif
简单一点,不要增加换相频率,就用最慢的速度换相,如果这样还不转,那么检查电机,看看是不是缺项。另外 ...

是bldc,我在实验一下。。。

就是一枪 发表于 2012-7-20 11:20:47

有个问题就是。下管的N-MOS管的驱动能力可能不够。建议用驱动芯片。或者加三极管增加驱动能力

西周时代 发表于 2012-7-23 22:52:00

tiancaigao7 发表于 2012-7-18 07:49 static/image/common/back.gif
简单一点,不要增加换相频率,就用最慢的速度换相,如果这样还不转,那么检查电机,看看是不是缺项。另外 ...

下桥臂上加了一个三极管增加了驱动能力,调试了一段时间之后是可以转了。。我正在努力的检测零点。。谢谢了哈。。。
页: [1]
查看完整版本: 简易自搭电路强行驱动电机,电调的强行驱动部分...求助