BRUCE$GAN 发表于 2012-11-15 12:28:41

AD采样过零检测 (闭环不成功)


6步换相的开环启动还是比较容易的,转起来了,也能加速到较高的速度。但开AD 检测过零 闭环就不大成功了。
方案是STM32的, AD采样用连续扫描方式的 使用最高转速速率,约1us 采样一次, 开启了连续扫描和DMA 通道,A、B、C 三路采样的数据就分别放到开辟的一个数据结构中(里面有三个变量)。
连续扫描 和DMA 通道的好处就是,数据实时更新,只要去读取都是最新刷新上去的,不用不读就是了,无需去开启关闭ADC。
另外开启了一路定时器,每50us 进入一次定时器中断,去判断AD 值过零状态。
      在开环加速进入稳态后开启定时器。可是我一开定时器,电机启动完之后就卡着没法继续下去了,昨晚试了一下,电机还是没法闭环转动,只转了启动开环加速,然后就停了

我的想法是进入闭环后,定时器每隔50us 就做一次判断 并换相,此外主程序就留给通讯或别的使用了

ADC检测代码如下,Average_G1A,Average_G1B,Average_G1C,分别是存放3组ADC值 的变量, StepMotorControl(); 是换相函数。
switch(BlmcStep.M1)
       {
       case 1:

                NonceBEMF = BEMF_ZERO + Average_G1C - (Average_G1A/2);
                if((MotorGroup1.NonceBEMF < BEMF_ZERO-10))                                    // A(B)-------C-A
                  {
                  delayus(10);       StepMotorControl();       delayus(10);
                  }
                break;

       case 2:
                NonceBEMF = BEMF_ZERO + Average_G1B- (Average_G1A/2);
                if(MotorGroup1.NonceBEMF > BEMF_ZERO+10)                                       // A(C)-------B-A
                  {   
                     delayus(10);   StepMotorControl();            delayus(10);               
                   }
                break;

       case 3:
                .NonceBEMF = BEMF_ZERO + Average_G1A- (Average_G1B/2);
                if((MotorGroup1.NonceBEMF < BEMF_ZERO-10))                                    // B(C)-------A-B
                  {
                     delayus(10); StepMotorControl();             delayus(10);
                  }
                break;

       case 4:
                NonceBEMF = BEMF_ZERO + Average_G1C- (Average_G1B/2);
                if(MotorGroup1.NonceBEMF > BEMF_ZERO+10)                                    // B(A)-------C-B
                  {
                        delayus(10);StepMotorControl();             delayus(10);
                  }
                break;

       case 5:
                NonceBEMF = BEMF_ZERO + Average_G1B- (Average_G1C/2);
                if((MotorGroup1.NonceBEMF < BEMF_ZERO-10))                                    // C(A)-------B-C
                  {
                     delayus(10);       StepMotorControl();             delayus(10);
                  }

                break;

       case 6:
                NonceBEMF = BEMF_ZERO + Average_G1A- (Average_G1C/2);
                if(MotorGroup1.NonceBEMF > BEMF_ZERO+10)                                       // C(B)-------A-C
                  {
                    delayus(10);   StepMotorControl();             delayus(10);
                  }
                break;
       }

BRUCE$GAN 发表于 2012-11-18 20:53:16

自己顶一个,目前闭环能进去了,但大约10s 后出现卡的现象,卡两下就死掉了,数次实验都这样。目前mos 烧了。明天修板子,得后天大后天晚上才能继续了~~~ 无敌缓慢啊

GDYJ 发表于 2012-11-18 21:31:12

调试电调的时候用带恒流的稳压电源吧,不至于烧管,空载的时候电流不大,3-5A的电源就够了。

BRUCE$GAN 发表于 2012-11-18 22:12:44

GDYJ 发表于 2012-11-18 21:31 static/image/common/back.gif
调试电调的时候用带恒流的稳压电源吧,不至于烧管,空载的时候电流不大,3-5A的电源就够了。 ...

买了个稳压电源的,12V6A 输出,不过mos 只要一通 稍不注意就烧了,这个保护没做好。 电机转不起来,还没心情做别的,呵呵。

GDYJ 发表于 2012-11-25 19:28:49

电流给限制了,怎么还会烧管!

BRUCE$GAN 发表于 2012-11-26 22:32:11

GDYJ 发表于 2012-11-25 19:28 static/image/common/back.gif
电流给限制了,怎么还会烧管!

12V 6A   当短路或者负载大的时候,肯定不是12V的,可能8V也可能更低,这样出的电流估计就是十几 二十A 了,详细的到多少伏后电源保护掉这个我倒没测过,也有关系我买到的mos 是假货的问题吧

logosz 发表于 2013-6-9 00:42:03

BRUCE$GAN 发表于 2012-11-26 22:32 static/image/common/back.gif
12V 6A   当短路或者负载大的时候,肯定不是12V的,可能8V也可能更低,这样出的电流估计就是十几 二十A...

你这个根本都没有限流
页: [1]
查看完整版本: AD采样过零检测 (闭环不成功)