Hallo Holger,
ich habe gestern Deinen Code auf einen 328er geladen, er funktioniert prima, meinen großen Respekt !
Ich möchte eine Schaumwaffel mit E-Motor an einer analogen 35 Mhz Anlage betreiben, die noch mit PPM läuft. An der Reichweitengrenze spinnt der BEC-Regler und lässt den Motor sogar manchmal für 2 Sek mit Vollgas laufen, bevor er einsieht, dass das PWM Signal Unsinn geworden ist. Ein Torcster als auch ein Wasbi-Regler zeigen dasselbe Verhalten. Dummerweise passiert das auch gelegentlich, wenn man den Sender vor dem Empfänger ausschaltet, weil der BEC auch einen plötzlichen einzelnen langezogenen PWM-Puls (durch Ausschalten zufällig erzeugt) als gültiges Signal erkennt, auch wenn danach nichts mehr kommt und er fatalerweise den Unsinn noch 2 Sek. lang ausführt. Ist also auch ein Sicherheitsproblem. Auch das Flattern der Drehzahl bei sehr kleiner Feldstärke nervt, man kann die Reichweite der Anlage so nicht ausnutzen.
Die BECs filtern sowas leider nicht raus.
Ich habe noch zwei Failsafe Module auftreiben können, einen von Simprop und einen aus China. Beide funktionieren grundsätzlich.
Dummerweise laufen beide synchron mit dem PWM, was aus dem Servousgang des Empfängers kommt. D.h. den Jitter des PWM geben sie an den BEC weiter. Und falls das PWM vom Empfänger ausfällt, oder wieder dazu kommt, gibt es beim Aus- bzw Einschwingen auch kurze starke Verfälschungen des PWM zum Motor.
Die Idee: Das PWM-Signal mit einem Arduino auslesen, Unsinn ausfiltern (inkl. abssurde Sprünge), puffern, glätten, ausgeben und bei zu hoher Fehlerrate ein PWM mit 1 ms ausgeben. Die Ausgabe soll dabei dauerhaft asynchron erfolgen, egal was am Eingang los ist.
Auf der Suche nach Routinen, die schnell genug sind und wenig Jitter verursachen, bin ich auf Dein Projekt gestossen. Ein par Dinge habe ich noch nicht verstanden:
In der Sektion "MODE 2 + 3 PPM-analog einlesen" steht:
PORTB |= 0b00000010;
Das setzt den Pin 1 von Port B (also D9) auf High, oder ? Wenn ja, warum ? D9 soll ja zum Lesen von PWM bzw PPM ein Eingang sein.
Es fehlt in dieser Sektion das dedizierte Setzen von D9 als Eingang (zB mit DDRB = 0b00000000).
Oder sind die Ports per Default Eingänge, und mit PORTB |= 0b00000010 wurde nur der Pull-Up-Widerstand gesetzt ?
In derselben Sektion findet man:
delay(200);
Die ISR wird durch einen Transienten auf D9 ausgelöst, und auch der Zähler wird durch einen weiteren Transienten auf D9 gestoppt, und in der Serialausgabe steht schon ein (anderes) Delay.
Daher: Wozu ist dieses delay(200); gut ?
Zuletzt noch die Schleife:
while(1){
if (MODE==2)SerialViewCHannels(1); //read single
if (MODE==3)SerialViewCHannels(8); //read stream
Was bedeutet die 1 im Argument von while(1) ?
Läuft die Schleife nur genau einmal ?
Viele Gruesse
Andreas