Hallo zusammen,
Ich bin auf dem Gebiet der Timer ganz neu und bin gerade dabei, mit einem Arduino due und einem raspi eine Drohne inklusive Flugregelung zu basteln.
Hier stecke ich bereits bei dem Ansteuern der Motoren fest.
Und zwar will ich die 4 Motoren zuerst per Fernbedienung ansteuern.
Das Signal der Fernbedienung kann ich bereits einlesen (also wie lange das PWM signal auf High steht).
Die Periode für ein PWM signal für die Motoren sind 2500 µS (400Hz), das Signal befindet sich dann je nach Stellung des Hebels ca. zwischen 1500 und 2400µS auf High.
Für Jeden der 4 Motoren gibt es ein anderes PWM signal (sie stehen also alle unterschiedlich lange auf HIGH). Diese unterschiedlichen PWM signale will ich nun per Timer (mit der DueTimer bibliothek) an die einzelnen Motoren übergeben.
Hierzu ist die Frage, wie ich am besten die Timer inklusive interrupts verwende, um die PWMs zu erzeugen.
Hier mal ein Code-Ausschnitt (mit 8 Timer), damit ihr versteht wie ich das angehen wollte.
#include <DueTimer.h>
int mot4 = 9;
int mot3 = 8;
int mot2 = 7;
int mot1 = 6;
int power1;
int power2;
int power3;
int power4;
int CH3 = 12; //CH3_THROTTLE_PIN12
unsigned long throttle = 1550;
volatile int x;
void setup(){
Serial.begin(9600);
// zum einlesen der Fernbedienung
// pinMode(CH3, INPUT);
// pinMode(mot4, OUTPUT);
// pinMode(mot3, OUTPUT);
// pinMode(mot2, OUTPUT);
// pinMode(mot1, OUTPUT);
Timer0.start(2500); //400Hz
Timer0.attachInterrupt(ISR_mot1);
Timer5.start(2500);
Timer5.attachInterrupt(ISR_mot2);
Timer6.start(2500);
Timer6.attachInterrupt(ISR_mot3);
Timer7.start(2500);
Timer7.attachInterrupt(ISR_mot4);
}
// MOTOR 1
void ISR_mot1(){
Timer1.start(2000);
Timer1.attachInterrupt(ISR_low1);
digitalWrite(mot1, HIGH);
}
void ISR_low1(){
Timer1.stop();
digitalWrite(mot1, LOW);
}
// MOTOR 2
void ISR_mot2(){
Timer2.start(2000);
Timer2.attachInterrupt(ISR_low2);
digitalWrite(mot2, HIGH);
}
void ISR_low2(){
Timer2.stop();
digitalWrite(mot2, LOW);
}
// MOTOR 3
void ISR_mot3(){
Timer3.start(2000); //400Hz
Timer3.attachInterrupt(ISR_low3);
digitalWrite(mot3, HIGH);
}
void ISR_low3(){
Timer3.stop();
digitalWrite(mot3, LOW);
}
// MOTOR 4
void ISR_mot4(){
Timer4.start(2000);
Timer4.attachInterrupt(ISR_low4);
digitalWrite(mot4, HIGH);
}
void ISR_low4(){
Timer4.stop();
digitalWrite(mot4, LOW);
}
void loop(){
}
Dieses Code Beispiel funktioniert nur ohne einlesen der Fernbedienung.
Sobald die Werte für Timer 1-4 nichtmehr Konstant (2000µs auf HIGH) sind, sondern "throttle1 - throttle4" eingelesen wird, funktioniert der Code nicht mehr.
Mit weniger Timern habe ich es nicht hinbekommen und mit variablen PWMs erst recht nicht.
Hättet ihr eine Idee, wie das mit meinem Ansatz funktionieren könnte?
Gerne lass ich mich auch auf komplett neue Ansätze ein.
Danke schonmal im Voraus für die Mühe