wuminhdu 发表于 2012-4-2 16:11:24

用avr的mega32来控制电机,闭环控制

我用mega32来控制无刷直流电机,没有用t1定时器的输入捕捉功能,而是用了一个普通口来测电机的速度,但是速度读的不准,不知道什么问题,代码如下
void sys_readspeed(void)
{
    u16 sum = 0;
   u8 err = 0;

    do{
      sum = speedonce();
      if(sum == 0)
      {
            err++;
            if(err >= 3){
               sys_write_AD5320(0);
               MC30335_CS = 1;
               sys_write_AD5320(1500);
               DogFeed();
               sys_delay(30000);
               MC30335_CS = 0;
               DogFeed();
               sys_delay(30000);
               err = 0;
            }
      }
      else
      {
            err = 0;
      }
    }while(sum == 0);
    system.speed_current = sum;
}
u16 speedonce(void)
{
    u8 i;
    u32 result = 0;
    u8 flag = TRUE;
    union {
      u16 data;
      u8 regsiter;
    }time;

    if(testrun())
    {
      TIMSK |= 1<<TOIE1;
      TCNT1H = 0;
      TCNT1L = 0;
      for(i=0;i<4;i++){
            if(!testrun());
               flag = FALSE;
      }
      if(flag == TRUE){
            time.regsiter = TCNT1L;
            time.regsiter = TCNT1H;
            TIMSK &= ~(1<<TOIE1);
            if(system.timer1cnt >= 200)
                result = 0;
            else{
                result = time.data+system.timer1cnt*65535;
                result = 1920000000/result;
            }
      }
    }   
    return result;
}
u8 testrun(void)
{
    u16 max_time = 50000;
    u16 i,j,k;
    u8 result = 0;

   DogFeed();
    for(i = 0;i< max_time;i++){
      if(PIC_SA){
            for(j = 0;j<max_time;j++){
                if(!PIC_SA){
                  for(k = 0;k<max_time;k++){
                        if(PIC_SA){
                            result = 1;
                            break;
                        }
                        else{
                            if(TIFR&0x04 != 0){
                              TIFR &= (~(0x04));
                              system.timer1cnt++;
                            }
                        }
                  }
                }
                else{
                  if(TIFR&0x04 != 0){
                        TIFR&=(~(0x04));
                        system.timer1cnt++;
                  }
                }
             }
      }
      else{
            if(TIFR&0x04 != 0){
                TIFR&=(~(0x04));
                system.timer1cnt++;
            }
      }
    }
    DogFeed();
    return result;
}

UNIFAN 发表于 2012-4-2 16:12:39

你这个检测速度的原理是什么?

wuminhdu 发表于 2012-4-5 18:44:17

UNIFAN 发表于 2012-4-2 16:12 static/image/common/back.gif
你这个检测速度的原理是什么?

通过直流电机霍尔传感器传回来的高低电平

usingavr 发表于 2012-4-6 10:33:31

微观的看电机的速度实际上是很不稳定的,会在平均速度上下一定范围类振动,可以考虑多次测量取平均值的方法来获得比较准确的数值

1181zjf 发表于 2012-4-6 10:44:23

最好用中断!

wuminhdu 发表于 2012-4-6 12:28:34

1181zjf 发表于 2012-4-6 10:44 static/image/common/back.gif
最好用中断!

我现在改用T1的输入捕捉来测电机速度了,但是测得不准,速度乱跳,跟实际速度相差很大
页: [1]
查看完整版本: 用avr的mega32来控制电机,闭环控制