Hi,
Das mit den Signalverdoppelungen sieht verdächtig aus, und ich würde das nicht sofort aufs Oszi schieben. Vielleicht lohtn es sich den Code nochmal genauer anzuschauen. In der aktuellen Firmware wird das Servosignal mit dem Empfängersignal "synchronisiert".
Im Empfänger IRQ steht:
If Channel = 5 Then 'when all relevant channels were read, enable the servo interrupt
Enable Timer1
End If
im servo IRQ steht:
If Portd.6 = 0 Then
Timer1 = Servopwm
Portd.6 = 1
Else
Portd.6 = 0
Disable Timer1
Timer1 = 65400
End If
Du könntest also mal die disable/enable Zeilen rausnehmen, und im ServoIRQ den Wert für Timer1 auf 31535 setzen (=17ms pause). Vielleicht löst das dein problem.
Außerdem könntest du mal versuchen das Servo abzuschrauben. Dein motor hat ne ziemlich hohe masse, dadurch könnte sich die Regelung innerhalb des
Servos aufschwingen. Das ist bei günstigeren
Servos relativ schnell mal der Fall.
Danke auch für die Glückwünsche!
Ich habe das gleiche Problem bei einem Nackten servo der auf dem Tisch steht - der zappelt auch die ganze Zeit.
Ich habe auch vermutet das irgendwas in der Software schief läuft, aber ich kann mir nicht erklären warum das auf einmal auffällt, ich hatte zwar das Failsave und die Signalglättung auf 6 Kanäle geändert aber auch ohne diese Sache geht es nicht, zumal das ja mit meiner 40MHz funke auch passiert. Das schließt ja aus, dass es am Code liegt, ich habe es schiesslich auch mit der Original Firmware geprüft.
Der servo bewegt sich ja auch sehr hackelig, lediglich wenn er an die Grenzen fährt und die Min/Max Abfrage greift ist er ruhig, oder wenn du ihm ein konstantes Signal (wie zB im Idle Mode) gibst. Sobald er (auch ohne Motoren) in Hover oder Acro kommt zuckt er...
Ich wollte heute mal eine Rampe zum rauf und runter fahren Probieren, wenn er da immer noch zittert dann ist das mal ne Aussage.
Ausserdem werde ich noch einmal dein Servoprogramm aus dem RN Wissen ohne Funke probieren.
Aber ich werde trotzdem eine neue Platine Löten und mir einen neuen Arduino bestellen.
Ich vermute ganz stark einen Hardwaredefekt an der Platine oder dem Arduino - alles andere hab ich gewechselt oder das Problem ohne diese Komponenten auch gehabt.
Und wenn der Mist dann endlich wieder fliegt, dann können wir hier auch wieder über was anderes Reden :-/
Nils
EDIT: Ich habe diese Disable Zeile garnicht mehr drin (seltsam). Das sieht bei mir so aus:
Code:
Servoirq: 'generate servo PWM pulseIf Servo_nr_by = 0 Then
If Portd.6 = 0 Then 'wenn port low
Timer1 = Servopwm 'dann timer auf entsprechende verzögerung
Portd.6 = 1 'und port anschalten
Else 'das hier passiert erst bei dem darauf folgenden interrupt
Portd.6 = 0 'dann port wieder ausschalten
Incr Servo_nr_by 'und den nächsten kanal bearbeiten
End If
End If
If Servo_nr_by = 1 Then
If Portb.2 = 0 Then
Timer1 = Servo_roll_pwm
Portb.2 = 1
Else
Portb.2 = 0
Incr Servo_nr_by
End If
End If
If Servo_nr_by = 2 Then
If Portb.3 = 0 Then
Timer1 = Servo_nick_pwm
Portb.3 = 1
Else
Portb.3 = 0
Incr Servo_nr_by
End If
End If
If Servo_nr_by = 3 Then
Timer1 = 40000 'eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==> ansteuerfrequenz von ~ 200Hz
Servo_nr_by = 0
End If
Lesezeichen