Was meinst du genau mit Verzögerungsglieder? Die Drehgeschwindigkeit verändern?
Die Impulsaufbereitung findet komplett in der Hardware statt, soweit ich das kapiert habe.
Die verzögerung kann also nur auf der Eingabeseite für die Servoimpulslänge erfolgen.
Am einfachsten wäre es einfach vor die if Abfrage ein delay_ms einzufügen und zusätzlich die geänderten Werte nur um wenige Werte zu erhöhen bzw. zu erniedrigen.
Über die Anzahl der maximalen änderbaren Schrittweite und der delayzeit kann man die maximale Geschwindigkeit des Servos dann einstellen.
delay_ms hat aber leider den fiesen Nachteil, das dadurch das komplette Hauptprogramm verzögert wird.
Ich benutze dazu dann lieber einen zusätzlichen Timer, der in seinen Overflow Interrupts eine Variable runterzählt.
Wenn die Variable den Wert 0 hat wird die if abfrage durchlaufen, die Variable wieder auf den Initialwert gesetzt und die Impulsweite eingestellt.
Den Grad der Servoverzögerung kann man dabei über den Initialwert der Variable verändern.
Dann wird die if abfrage nicht mehr durchlaufen, bis die Variable wieder den Wert 0 hat.
Will man weitere zeitabhängige Vorgänge Triggern kann man das mit zusätzlichen Variablen in diesem Timer Overflow Interrupt realisieren.
Die Variablen sollten aber als volatile definiert werden, da sie sich ja in einem Interrupt ändern können ( und sollen ).
Diese Methode hat den Vorteil, das das restliche Hauptprogramm nicht ausgebremst wird, wie das bei delay_ms der Fall wäre.
Code:
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (uc_sectimer>0)
{
uc_sectimer--;
}
}
...
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
TCCR0=0x05;
TCNT0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
while (1)
{
if (uc_sectimer==0)
{
uc_sectimer=10;
if(....//Dein Code
}....
Die konkreten Werte für die Timer Register müsstest Du selber mal imDatenblatt nachschauen.
Die Aufrufe für die Interrupts sind bei AVR GCC anders, das Beispiel ist für CodeVision AVR.
Für das Hauptprogramm "sieht" es so aus, als ob sich diese Variablen wie von Geisterhand in festen Zeitabständen verringern würden.
Ich würde in deinem System auch ne Realtime Clock ( als externer Chip ) einsetzten um bei ungünstigen Witterungsverhältnissen ( bewölkter Himmel ) eine Position aus einer Tabelle ansteuern zu können.
Die Tabelle kann auch bei gutem Wetter dafür genutzt werden die Werte der Lichtsensoren zu verifizieren und das System am Morgen in eine definierte Startposition zu bringen.
Das hört sich vieleicht ein wenig "Oversized" an aber zumindest im Platinenlayout würd ich diese Option mal vorsehen.
Zudem würde ich mir überlegen einen Getriebemotor mit Spindelantrieb vorzusehen.
Dieser braucht im Ruhezustand keinen Strom und hat dann auch ein relativ gutes Haltemoment.
Als Ansteuerung könnte dann eine H-Brücke dienen.
Servos brauchen auch wenn sie sich nicht bewegen einen Strom für das Haltemoment und die interne Elektronik.
Lesezeichen