У меня есть программа, которая использует библиотеку Servo и внешнюю процедуру прерывания. Насколько я понимаю, библиотека Servo использует прерывание Timer1 для отправки импульсов сервоприводу для поддержания положения. Мне интересно, как это влияет на счетчик micros(), поскольку он не увеличивается во время прерывания.
Процедура внешнего прерывания в моем коде предназначена для тахометра. Он определяет время между импульсами с помощью micros(). Я обеспокоен тем, что библиотека Servo вызовет дрейф счетчиков millis() и micros() и сделает скорость неточной. Тахометру, возможно, придется определять скорость 10 000 об/мин, то есть около 167 Гц. Со временем я реализую ПИД-управление с помощью сервоприводов и тахометра.
volatile unsigned long period;
unsigned long microseconds;
void setup(){
Serial.begin(9600);
pinMode(tachometerPin, INPUT);
pinMode(led, OUTPUT);
attachInterrupt(0, tachometer, RISING); // set external interrupt
throttle.attach(throttlePin); // attach servo objects to pins
fuel.attach(fuelPin);
throttle.writeMicroseconds(throttle_idle); // set servo positions
fuel.writeMicroseconds(fuel_neutral);
}
void loop(){
Serial.println(calculateSpeed());
}
float calculateSpeed(){
/* Calculate speed of engine in RPM */
float s = 60.0/(period*0.000001);
return(s);
}
void tachometer() {
/* Determine time between rotations of engine (pulses from tachometer) */
period = micros() - microseconds;
microseconds = micros();
}