Помогите с энкодером AS5048

Тема в разделе "Arduino & Shields", создана пользователем ДмитрийД, 28 июл 2015.

  1. ДмитрийД

    ДмитрийД Нерд

    Есть магнитный энкодер подключенный к арду НАНО по SPI.
    Проблема - на маленьких оборотах все ок, обороты считает как надо, начинаешь крутить быстрее и данные слетают. В чем может быть проблема?

    Общее описание проги для понимания смысла - энкодер стоит на бесколлекторном моторе. К арду подключены буззер, регулятор оборотов и 3 канала с рц пульта
    С пульта задается начальная и конечная точки. Допустим 0 и 100 оборотов и мотор должен крутиться в этом диапазаоне, как только за этот дипазон выходим, включаем пищалку и запрещаем ехать.

    Код (Text):
    #include <Servo.h>
    #include <SmallSPI.h>
    #include <AS5048.h>
    Servo myservo;
    AS5048 Sen1(4);
    int tormoz=1469;
    double speed2;
    const int SENSOR_FULL_ROTATION = 16384;
    const int SENSOR_HALF_ROTATION = 8192;
    int gr,pult,translate,ch3,ch9,previousAngle;
    int buzz=7;
    int rotationAngle = 0;
    int rotations = 0;
    int firstrotations,totalrotations=30000;
    boolean pp,calibration,right=false;
    boolean left=false;
    boolean fp=false;
    boolean cruiseon=false;
    boolean cflag=false;
    boolean endp=false;
    unsigned int dat;
    byte lb, hb, low, hi, OCF, COF;



    //ss
    boolean upPinCurentState, upPinLastState;
    int Count = 0;
    //ss
    void setup()
    {

    gr=1;
    //ss
    upPinCurentState == false;
    upPinLastState = false;
    //ss
    pinMode(buzz,OUTPUT);
    pinMode(5,INPUT);
    pinMode(6,INPUT);
    pinMode(8,INPUT);
    pinMode(9,INPUT);
    myservo.attach(6);
    Serial.begin(9600);
    mySPI.begin(1);
    dat = Sen1.getDiagnostics();
    hb = (dat >> 8);
    lb = dat & 0xFF;
    OCF = (dat >> 0) & 0x1;
    COF = (dat >> 0) & 0x1;
    low = (dat >> 2) & 0x1;
    hi =  (dat >> 3) & 0x1;
    int previousAngle = Sen1.getAngle();
    }



    void refreshpoint()
    {
    digitalWrite(buzz,HIGH);
    delay(3000);
    digitalWrite(buzz,LOW);
    delay(1000);
    }

    void firstpoint()
    {
    digitalWrite(buzz,HIGH);
    delay(500);
    digitalWrite(buzz,LOW);

    }

    void secondpoint()
    {
    digitalWrite(buzz,HIGH);
    delay(500);
    digitalWrite(buzz,LOW);
    delay(500);
    digitalWrite(buzz,HIGH);
    delay(500);
    digitalWrite(buzz,LOW);

    }

    void loop()
    {




          int currentAngle = Sen1.getAngle();
          int difference = currentAngle - previousAngle;
        if (abs(difference)>500) {
         
        if (difference < -SENSOR_HALF_ROTATION)
                  difference += SENSOR_FULL_ROTATION;
          else if(difference > SENSOR_HALF_ROTATION)
                  difference -= SENSOR_FULL_ROTATION;
          rotationAngle += difference;
            if (rotationAngle > SENSOR_FULL_ROTATION)
          {
                  rotationAngle -= SENSOR_FULL_ROTATION;
                    rotations++;
               
                 
          }
          else if(rotationAngle < 0)
            {
                    rotationAngle += SENSOR_FULL_ROTATION;
                  rotations--;
                   
          }
          previousAngle = currentAngle;
     
      }
    pult=pulseIn(3,HIGH);
    //Serial.println(rotations);

    //ss
    if (pult>1500) upPinCurentState = true; else upPinCurentState = false;
     
      //upPinCurentState = digitalRead(upPin);
     
      // избавляемся от дребезга если нажата кнопка up
      if (upPinCurentState == true && (upPinLastState == false))    {
        if (upPinCurentState =! upPinLastState) delay (50);
        upPinCurentState = true;
        upPinLastState = true;
        Count++;
      //  Serial.println(Count);
      }else {
          if (upPinCurentState == false) upPinLastState = false;
      }
    //ss
     
    if (Count == 1) {firstpoint(); Count = 2;firstrotations=rotations;}
    if (Count == 4) {secondpoint(); Count = 5;totalrotations=rotations;calibration=true;}

    while ((pult>1500)&&(gr<10)&&(Count>=5))
    {
    pult=pulseIn(3,HIGH);
    gr=gr+1;
    delay(200);
    }
    if (gr>=9) {refreshpoint();rotations=0;gr=1; Count = 0;firstrotations=0;totalrotations=30000;calibration=false;right=false;left=false;}
    if (calibration)
    {
      if (firstrotations>totalrotations) { translate=firstrotations;firstrotations=totalrotations;totalrotations=translate; }
      if ((rotations<firstrotations)||(rotations>totalrotations)) { digitalWrite(7,HIGH); } else { digitalWrite(7,LOW);  right=false;left=false;}
      if ((rotations<firstrotations)) {left=true;}
      if (rotations>totalrotations) {right=true;}
    }



    if ((calibration==false)) myservo.write(ch3);
    else
      if (left) { if (ch3>1500) myservo.write(ch3) ; else myservo.write(1469);}
        if (right) { if (ch3<1450) myservo.write(ch3); else myservo.write(1469);}
        if ((left==false)&&(right==false)) { myservo.write(ch3);}
    }
     
     
  2. 9xA59kK

    9xA59kK Гик

    У тебя в программе задержка delay(200)- это остановка программы, возможно если избавишься от delay , что то изменится.