Aufgabenstellung
MIttels eines ATtiny2313 soll ein Modellbauservo angesteuert werden. Dazu wird zunächst der 16-bit Timer/Counter1 with PWM verwendet.
[ ATtiny2313] Seite 88ff.
Ansteuerung von Modellbau Servos


Die erste Überlegung betrifft das Timing zur Erzeugung des PWM-Signals.
Der Timer wird mit einem vorgeteilten von der CPU-Frequenz abgeleiteten Signal betrieben. Mögliche Teilverhältnisse sind: 1,8,64,256,1024. Der Controller hat einen internen Oszillator mit folgenden wählbaren Frequenzen: 1,2,4,8 MHz.
Timer und Pulsweitenmodulation
Der Servo erhält alle 20ms einen Impuls zwischen 1.0ms und 2.0ms Dauer. Der Timer wird daher mit 1 MHz, dem Systemtakt getaktet.
Gewählt 1 MHz mit Vorteiler 1:1.
Betriebsart Fast PWM Mode siehe Seite 98ff. Der Timer zählt von 0 bis zu einem einstellbaren TOP Wert und springt dann wieder auf 0. Ein Ausgang kann beim Sprung von TOP auf 0 gesetzt und bei Erreichen eines einstellbaren Wertes OCR1A wieder rückgesetzt werden.
OCR1A als TOP. OCR1B als Pulsweite. Ausgang ist PB4 (OC1B).
Einstellungen bei Initialisierung
Register | Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Beschreibung |
---|---|---|---|---|---|---|---|---|---|---|
TCCR1A | Bedeutung | COM1A1 | COM1A0 | COM1B1 | COM1B0 | FOC1A | FOC1B | WGM11 | WGM10 | Ausgang OC1B bei 0 setzen und bei OCR1B löschen |
Wert | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
Waveform Generation Mode: Fast PWM mit OCR1A als TOP |
|
TCCR1B | Bedeutung | ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 | |
Wert | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | Keine Vorteilung Timer mit CPU-CLK (No prescaling) | |
TIMSK | Bedeutung | TOIE1 | OCIE1A | OCIE1B | - | ICIE1 | OCIE0B | TOIE0 | OCIE0A | Keine Interrups notwendig |
Wert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Anschluß des Servos
![]() |
|
||||||||||||||||||||||||||||||
ATtiny2313 | STK200 I/O Port B |
---|
Initialisierung 1,5ms Impuls
#include <avr/io.h> int main(){ DDRB = 0b00010000; // PB4 als Ausgang TCCR1A = 0b00100011; // Ausgang OC1B bei 0 setzen und bei OCR1B loeschen TCCR1B = 0b00011001; // Waveform Generation Mode: Fast PWM it OCR1A als Top, Timer mit CPU-CLK OCR1A = 19999; // alle 20ms OCR1B = 1500; // Impulslaenge 1,5ms while (1); // Endlosschleife }
Initialisierung und Anfahren der Endpositionen
// *** Servo 1.0 (c) Oliver Mezger 30.11.2010 #include <avr/io.h> #include <util/delay.h> unsigned char keyOld= 0,keyEnter,keyExit; // Tastaturereignisse void keyCheck(){ // Abfragen der Tasten unsigned char keyTest,tmp; keyEnter = 0, keyExit = 0; keyTest = ~PIND & 0b01111111; // Einlesen und zurechtschieben if (keyOld != keyTest){ // hat sich was getan _delay_ms(10); // Prellen abwarten tmp = ~PIND & 0b01111111; // nochmal Einlesen und zurechtschieben if (tmp == keyTest){ // ist es stabil? keyEnter = (~keyOld) & keyTest; // steigende Flanke !alt und neu keyExit = keyOld & (~keyTest); // fallende Flanke alt und !neu keyOld = keyTest; } } } unsigned int tasteInWert(unsigned char n){ // Umwandeln in Wert switch (n){ case 4: return 2000; case 2: return 1500; case 1: return 1000; default: return 1500; } } int main(){ unsigned char i; DDRB = 0b00010000; // PB4 als Ausgang TCCR1A = 0b00100011; // Ausgang OC1B bei 0 setzen und bei OCR1B loeschen TCCR1B = 0b00011001; // Waveform Generation Mode: Fast PWM it OCR1A als Top, Timer mit CPU-CLK OCR1A = 19999; // Impulsabstand 20ms OCR1B = 1500; // Impulslaenge 1,5ms while (1){ // stetiges Abfragen der Tasten keyCheck(); if (keyEnter){ OCR1B= tasteInWert(keyEnter); } } }
Aufgaben
Erstellen Sie eine Lösung, die ohne PWM auskommt.
Erstellen Sie eine Lösung mit 8Bit Timer.
Das Servo soll folgenden Weg immer abfahren: 1000ms, 2s; 1200ms, 2s; 1800ms, 3s; zurück zu 1000ms.