サーボ ライブラリと外部割り込みルーチンを使用するプログラムがあります。私の理解では、サーボ ライブラリは Timer1 割り込みを使用してパルスをサーボに送信し、位置を維持します。割り込み中に増加しないため、micros() カウントにどのような影響があるのか 疑問に思っています。
私のコードの外部割り込みルーチンはタコメーター用です。これは、micros() を使用してパルス間の時間を決定します。Servo ライブラリが millis() および micros() カウンターのドリフトを引き起こし、速度が不正確になることが懸念されます。タコメーターは、10,000 RPM の速度を感知する必要がある場合があるため、約 167 Hz になります。最終的にはサーボとタコメーターを使ったPID制御を実装します。
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();
}