www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zum TIMER2 des ATMEGA


Autor: Daniel B. (scheinleistung)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte mit dem Timer2 des ATMEGA16 ein Servo Signal erzeugen, d.h. 
ich benötige eine High Phase von 0,8 ... 2,2ms aber nur alle 20ms.

Ich grübel gerade wie man das am besten realisieren kann. Mein Timer2 
benötigt 4,6ms um einmal hoch und wieder runter zu laufen, wenn er das 
einmal gemacht hat würd eich ihn gerne dazu benutzen die Pause von 
15,34ms zu timen. Das Problem ist wie erkenne ich dass er genau einmal 
hoch und wieder runter gelaufen ist? Overflow und Compare Match 
Interrupt helfen mir hier nicht. Mir fällt dazu keine Lösung ein... Hat 
jemand einen Tipp? Geh ich die Sache vielleicht komplett falsch / zu 
kompliziert an?

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum hoch und runter? Es genügt die Fast-PWM und die läuft nur hoch. 
Das Problem ist der geringe Zählumfang des Timer2, da dies nur ein 
8-Bit-Timer ist. Du wirst damit also nicht gleichzeitig die Impulsdauer 
von 1..2 ms und die Periodendauer von 20 ms abbilden können, zumindest 
nicht halbwegs feinstufig aufgelöst.

Servoimpulse sind aber aus Sicht des AVRs dermaßen schnarchlangsam, dass 
man sie ohne Weiteres per Software im OCR-Interrupt generieren kann. 
Siehe z.B. hier: http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html

...

Autor: Oliver Dippel (unixconf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
5*HW-Servo-PWM auf mega1281 (3xtimer1 & 2xtimer3)

void PWM_Init (void) {
  DDRB |= (1<<PB5) | (1<<PB6) | (1<<PB7);
  DDRE |= (1<<PE3) | (1<<PE4);

  // Reset
  TCCR1A = 0;
  TCCR1B = 0;
  ICR1 = 0;
  // Mode (Fast-PWM TOP=ICRn)
  TCCR1A |= (1<<WGM11);
  TCCR1B |= (1<<WGM13) | (1<<WGM12);
  // Output-Pins
  TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<COM1C1);
  // Prescaler
  TCCR1B |= (1<<CS11);
  // Top (Overflow)
  ICR1 = 10000;

  OCR1A = 500 + 255;
  OCR1B = 500 + 255;
  OCR1C = 500 + 255;

  // Reset
  TCCR3A = 0;
  TCCR3B = 0;
  ICR3 = 0;
  // Mode (Fast-PWM TOP=ICRn)
  TCCR3A |= (1<<WGM31);
  TCCR3B |= (1<<WGM33) | (1<<WGM32);
  // Output-Pins
  TCCR3A |= (1<<COM3A1) | (1<<COM3B1);
  // Prescaler
  TCCR3B |= (1<<CS31);
  // Top (Overflow)
  ICR3 = 10000;

  OCR3A = 500 + 255;
  OCR3B = 500 + 255;

  sei();
}

Mit Software-PWM währe ich Vorsichtig, je nach dem wie viel die MCU noch 
zu tun hat (IRQ's) kann es ekelhafte Zuckungen in den Servos kommen !!!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 5*HW-Servo-PWM auf mega1281 (3xtimer1 & 2xtimer3)

Und wie soll das jetzt dem OP mit seinem 8-Bit-Timer helfen?

Autor: Oliver Dippel (unixconf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
garnett,
8bit ist mist,
wollte nur zeigen wie ich das mache !
Wobei der Prescaler nochmal geändert werden könnte.

DBD
 Olli

PS: kannst ja auch mal was nützliches Beitragen ;-)

Autor: Daniel B. (scheinleistung)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm ja das hilft mir noch nicht weiter, mir steht nunmal nur der TIMER 2 
mit seinen 8Bit zur Verfügung... Gibt es denn keine Möglichkeit zu 
erkennen ob er einmal hoch und wieder runter gelaufen ist? Das wäre eine 
Lösung.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Gibt es denn keine Möglichkeit zu
>erkennen ob er einmal hoch und wieder runter gelaufen ist?

Jein, es kommt auf den PWM-Mode an. Das, was du schreibst, klingt nach 
dem Phase-Correct-PWM-Mode. Ungünstige Wahl, wobei man da den oberen 
"Umschaltpunkt" erkennen kann.
Man sollte aber (wie Hannes es schon ansprach), den Timer nur in einer 
Richtung laufen lassen z.B. FastPWM-Mode
Da kann man dann für den Impuls eine obere Grenze setzen, bei der der 
zugehörige Pin ausgeschaltet wird. Eingeschaltet wird der Pin bei 0.
Beim Erreichen der oberen Impulsgrenze wird ein Interrupt ausgelöst, in 
dessen ServiceRoutine dann der Pinschaltautomatismus wieder abgeschaltet 
wird.
Jetzt zählt man noch die Anzahl der Timerüberlaufe und kann so die 20ms 
abschätzen. Die müssen nämlich nicht hoch genau eingehalten werden.

Autor: Daniel B. (scheinleistung)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, das klingt sehr gut :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.