AXB 发表于 2014-3-28 09:49:05

求助,无刷直流电机波形异常问题

我用的电机是6对极,额定转速为6200转。
程序是用AD采集过零点,采回来之后滤波,计算,捕捉到过零点马上换向,相当于提前换向了。
为什么在低速时波形都不对称的?在差不多到额定转速时反电动势才正常。而且电机运行没力,一捏就停了。

AXB 发表于 2014-3-28 10:11:44

我的滤波函数,每次PWM采集一次AD值


    unsigned char filter_table={0,1,1,2,1,2,2,3};


    tableA = ADRES00;//将AD值存到TABLE中
   tableB = ADRES01;
    tableC = ADRES02;
    tableM = ADRES03;
    V_Cnt++;
    Tab_Cnt++;
    if(Tab_Cnt>=5){
      Tab_Cnt = 0;
    }
    if(V_Cnt>=5)
    {
      Voltage_A = (tableA+tableA+tableA+tableA+tableA)/5;//取平均值
      Voltage_B = (tableB+tableB+tableB+tableB+tableB)/5;
      Voltage_C = (tableC+tableC+tableC+tableC+tableC)/5;
      Voltage_M = (tableM+tableM+tableM+tableM+tableM)/5;

       
      if(Voltage_A>=Voltage_M ){//如果大于中点则某位为1否则为0
            filter_phase_A = (filter_phase_A<<1)|0x01;
      }else{
            filter_phase_A = (filter_phase_A<<1);
      }

      if(Voltage_B>=Voltage_M ){
            filter_phase_B = (filter_phase_B<<1)|0x01;
      }else{
            filter_phase_B = (filter_phase_B<<1);
      }

      if(Voltage_C>=Voltage_M ){
            filter_phase_C = (filter_phase_C<<1)|0x01;
      }else{
            filter_phase_C = (filter_phase_C<<1);
      }

        //判断过零否
        //由滤波数filter_phase_A的高三位的1/0的个数与第三位1/0的个数比较得出
      filter_cnt++;
      if(filter_cnt>=6){

            tmp_filter = filter_phase_A;
            num_low = filter_table;
            num_high = filter_table[(tmp_filter>>3)&0x07];
            if((num_high<=1)&&(num_low>=2)){//A相上升过零点
                if(control_flags.dir==CW){//正反转标志
                  tmp_sector = 0;
                }else{
                  tmp_sector = 1;
                }
            }else if((num_high>=2)&&(num_low<=1)){//A相下降过零点
                if(control_flags.dir==CW){
                  tmp_sector = 3;
                }else{
                  tmp_sector = 4;
                }
            }

            tmp_filter = filter_phase_B;
            num_low = filter_table;
            num_high = filter_table[(tmp_filter>>3)&0x07];
            if((num_high<=1)&&(num_low>=2)){//B相上升过零点
                if(control_flags.dir==CW){
                  tmp_sector = 2;
                }else{
                  tmp_sector = 3;
                }
            }else if((num_high>=2)&&(num_low<=1)){//B相下降过零点
                if(control_flags.dir==CW){
                  tmp_sector = 5;
                }else{
                  tmp_sector = 0;
                }
            }

            tmp_filter = filter_phase_C;
            num_low = filter_table;
            num_high = filter_table[(tmp_filter>>3)&0x07];
            if((num_high<=1)&&(num_low>=2)){//C相上升过零点
                if(control_flags.dir==CW){
                  tmp_sector = 4;
                }else{
                  tmp_sector = 5;
                }
            }else if((num_high>=2)&&(num_low<=1)){//C相下降过零点
                if(control_flags.dir==CW){
                  tmp_sector = 1;
                }else{
                  tmp_sector = 2;
                }
            }
      }
    }

AXB 发表于 2014-3-28 10:19:49

自己顶下{:sad:}

AXB 发表于 2014-3-28 20:08:51

坐等大神{:sad:}

lixin91985 发表于 2014-3-28 21:31:02

低速时 如果电机不好,波形这样也可以理解。
但是听你的描述,你忘了一个问题,

假设在某个过零点,因为某个干扰,导致你很长一段时间没有监测到过零事件(相对电周期)。这个时候你没有采取强制换相,那么在过零点后的一段时间内,你的电机是在产生阻力。这就是你电机没力的原因。也是一捏就停的原因。

过零事件必须要求在某段相对时间内出现。否则就必须采取措施。

AXB 发表于 2014-3-28 21:44:50

lixin91985 发表于 2014-3-28 21:31
低速时 如果电机不好,波形这样也可以理解。
但是听你的描述,你忘了一个问题,



假设 一切都正常的情况下, 直接换向就是超前30度 , 转矩肯定没有延时30度换向那么大 , 但不会导致电机没力的情况出现 , 是么

AXB 发表于 2014-3-28 21:52:02

lixin91985 发表于 2014-3-28 21:31
低速时 如果电机不好,波形这样也可以理解。
但是听你的描述,你忘了一个问题,



谢谢你的回答。 实验去{:smile:}

lixin91985 发表于 2014-3-28 21:54:52

AXB 发表于 2014-3-28 21:44
假设 一切都正常的情况下, 直接换向就是超前30度 , 转矩肯定没有延时30度换向那么大 , 但不会导致电机 ...

多米若骨牌效应啊 。

AXB 发表于 2014-4-9 14:16:10

说下这次做无刷的总结:
1、波形不对称是因为没有延时30°换相。
2、高速时捏停是因为捏的过程中造成消磁时间加大,等待消磁时间不足,造成吧消磁事件检测成过零事件了。
3、换相过后等待一段时间再去检测过零点是为了避免消磁的影响,这一段时间究竟取多久为合适呢,建议是30°时间的0.6倍。
4、对比于之前用hall传感器所做的无刷电机,虽然启动较慢,但运行效果差别不大。
5、一些资料所说的快速启动法,还没有尝试。

十剑山河荡狼烟 发表于 2016-6-28 19:46:54

楼主的波形有很多不正常的高电平尖峰毛刺 最后解决了吗?
页: [1]
查看完整版本: 求助,无刷直流电机波形异常问题