Hi Erik.
... ähnliche Methode ... verwendet ... Servosteuerzeiten ... aneinander gereiht ...
Das Aneinanderreihen geht offensichtlich auch, obwohl da die Pausen zwischen den Pulsen z.T. ziemlich variieren. So stehts jedenfalls in vielen Beiträgen hier und in anderen Foren. Ich wollte bei meiner Lösung einfach, soweit es möglich ist, zweifelsfrei reproduzierbar genau sein, ob es nun nötig ist oder nicht.
... großes Problem nebenbei ist, dass ich sehr billige
Servos verwende ...
Gibts damit Probleme? (kopfschüttel) Ich verwende die Carson CM-1 (ganz offensichtlich dasselbe wie früher Conrads ES-2) - hatte ich für 395 als Auslaufmodell noch schnell gekauft. Ausserdem laufen noch zwei RS-2 mit - schauderhafte Langsamkeit und SEHR weicher P-Regler :-/. Die Carsons laufen bei mir prächtig. Bauteilunterschiede werden durch einen Offset in der "finalen" Ansteuerung ausgeblendet, siehe Code
Code:
// - - - - - - - - - - - - - - -
Svpt ++; // Pointer eins rauf für nächsten, aktuellen Servo
if ( (Svpt < 1) || (Svpt > Svmx)) Svpt = 1; // Definierten Wert eingrenzen
// - - - - - - - - - - - - - - -
// Für den aktuellen Servopointer liegt ein korrekter Wert vor
// Jetzt wird der aktuelle Srv_tm-Wert in zulässige Schranken eingegrenzt
// und vor dem Setzen geoffsettet.
if ( Srv_tm[Svpt] < SerMin [Svpt] ) Srv_tm[Svpt] = SerMin [Svpt];
if ( Srv_tm[Svpt] > SerMax [Svpt] ) Srv_tm[Svpt] = SerMax [Svpt];
// - - - - - - - - - - - - - - -
if (Svpt == 1) PORTB |= (1<<1); //
if (Svpt == 2) PORTB |= (1<<2); //
if (Svpt == 3) PORTD |= (1<<3); //
if (Svpt == 4) PORTD |= (1<<4); //
if (Svpt == 5) PORTD |= (1<<5); //
if (Svpt == 6) PORTD |= (1<<6); //
if (Svpt == 7) PORTD |= (1<<7); //
if (Svpt == 8) PORTB |= (1<<0); //
if (Svpt == 9) PORTC |= (1<<0); //
if (Svpt == 10) PORTC |= (1<<1); //
// - - - - - - - - - - - - - - -
// OCR1B = Srv_tm[Svpt]; // Rampe ist durch Stellwert Srv_tm definiert
OCR1B = Srv_tm[Svpt] + Seroff [Svpt]; // Stellwert evtl. korrigieren
TIFR1 |= (1<<OCF1B); // Klappt nur wenn dies gesetzt wird
TIMSK1 |= (1<<OCIE1B); // Tmr/Cntr1 CompB Match interrupt enabled
// - - - - - - - - - - - - - - -
... komme ich auf eine Periodenzeit von 21 Sekunden, im Schlimmsten Fall 24 Sekunden ...
Ähhh - Schreibfehler, gelle! Das sind drei Zehnerpotenzen weniger - ist schon klar.
... Versatz berücksichtigen ...
Servos im 1,75 / 2 ms Takt ... anstatt sie aneinander zu reihen ...
Nochmal - ich bin nicht der Meinung, dass es notwendig ist diesen Versatz zu vermeiden, dazu kenne ich zu viele Aussagen, dass dies keine Rolle spielt. Aber bei mir klappts bestens, die Routine steht, was soll ich also ändern. Nebenbei bemerkt: von restlichen Timern ist nur mein traditioneller 50µs-heartbeat belegt. ABER - mit dem 16bitter kann ich eben so präzise unterteilte Signalpulse ausgeben, dass von daher kein Störungseinfluss zu erwarten ist.
Wenn Du den kompletten Code für die Timer brauchst, kriegste auch. Aber ohne Garantie 
Nachbemerkung: ein paar ES-2er und die Carsons waren mir vor Jahren ziemlich schnell über den Jordan gegangen, deswegen hatte ich die gehackt (siehe mein Getriebemotorthread und meine autonomen Dosen) - seither laufen die STUN DEN LANG
Lesezeichen