Ok, hier also der Ansatz in Bascom. Basis ist die klassische Ansteuerung in C aus dem RN-W iki, das Beispiel ist für einen 8MHz-Mega8:
Code:
$regfile = "m8def.dat" ' asuro mit Mega8
$crystal = 8000000 ' taktet mit 8MHz
Config Timer0 = Timer , Prescale = 1 ' 100kHz für Servos
Timer0 = 256 - 80
On Ovf0 Isr_timer0_ovl
Enable Ovf0
Enable Interrupts
Do
Loop
End
Isr_timer0_ovl:
Timer0 = 256 - 80
If Servocount > Servo1 Then Portb.1 = 0 Else Portb.1 = 1
'If Servocount > Servo2 Then Portb.2 = 0 Else Portb.2 = 1
'If Servocount > Servo3 Then Portb.4 = 0 Else Portb.4 = 1
If Servocount < 2000 Then Incr Servocount Else Servocount = 1
If Delay_10us > 0 Then Decr Delay_10us
Return
Wie funktioniert das? Bei jedem Timerüberlauf wird die ISR aufgerufen und in dieser die Anzahl der Aufrufe in Servocount mitgezählt. Wenn die Anzahl der Dauer von 20ms entspricht wird der Zähler auf eins zurückgesetzt. Das entspricht der Wiederholrate eines Servosignals.
Die Impulslänge für das Servo wird nun ebenfalls in diesen Überlauf-Zeiteinheiten angegeben. Der Zählerstand wird bei jedem Aufruf der ISR mit der Impulslänge verglichen und der Ausgang während des Impulses gesetzt und nach dem Impuls gelöscht. Ein kleines Rechenbeispiel für 8MHz und Prescaler=0:
Timertakt 8MHz, Vorladung des TCNT-Register ist 256-80, es wird nach 8MHz/80Timertakte bis zum Überlauf der Interrupt ausgelöst. Die ISR wird so alle 0,00001sek aufgerufen (100kHz). Nach 100 Aufrufen ist eine Millisekunde vergangen, nach 2000 Aufrufen sind es 20ms.
Jetzt muss man dies eigentlich nur noch an die vorgegeben Motoren-PWMs anhängen und die Zählerwerte an die geringere Auflösung des Timers anpassen. Z.B. für einen 16MHz-Kontroller mit 8bit PWM und Prescaler /8: 16000000/256/8 ergibt eine PWM-Frequenz von 7812,5Hz (wird schön pfeifen) und ein Interruptabstand von 1sek/7812,5 oder 0,000128sek. Ein Servosignalzyklus dauert dann 0,02sek/0,000128sek oder 156 ISR-Aufrufe. Oje, eine Millisekunde dauert dann 8 Aufrufe, deutlich geringe Auflösung.
Naja, sollte ja nur ein Beispiel sein. Für eine höhere Auflösung muss man die PWM-Frequenz erhöhen (kein Prescaler und mehr als 8 Bit -> Timer1).
Ist es nötig die Antriebe einer Seite getrennt anzusteuern?
Gruß
mic
Lesezeichen