搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2012-11-15 12:28:41 | 显示全部楼层 |阅读模式

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;
         }

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2012-11-18 20:53:16 | 显示全部楼层
自己顶一个,目前闭环能进去了,但大约10s 后出现卡的现象,卡两下就死掉了,数次实验都这样。目前mos 烧了。明天修板子,得后天大后天晚上才能继续了~~~ 无敌缓慢啊

出0入0汤圆

发表于 2012-11-18 21:31:12 | 显示全部楼层
调试电调的时候用带恒流的稳压电源吧,不至于烧管,空载的时候电流不大,3-5A的电源就够了。

出0入0汤圆

 楼主| 发表于 2012-11-18 22:12:44 | 显示全部楼层
GDYJ 发表于 2012-11-18 21:31
调试电调的时候用带恒流的稳压电源吧,不至于烧管,空载的时候电流不大,3-5A的电源就够了。 ...

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

出0入0汤圆

发表于 2012-11-25 19:28:49 | 显示全部楼层
电流给限制了,怎么还会烧管!

出0入0汤圆

 楼主| 发表于 2012-11-26 22:32:11 | 显示全部楼层
GDYJ 发表于 2012-11-25 19:28
电流给限制了,怎么还会烧管!

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

出0入0汤圆

发表于 2013-6-9 00:42:03 | 显示全部楼层
BRUCE$GAN 发表于 2012-11-26 22:32
12V 6A   当短路或者负载大的时候,肯定不是12V的,可能8V也可能更低,这样出的电流估计就是十几 二十A  ...

你这个根本都没有限流
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 04:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表