Есть магнитный энкодер подключенный к арду НАНО по 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);} }
У тебя в программе задержка delay(200)- это остановка программы, возможно если избавишься от delay , что то изменится.