www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer/PWM für kurze Impulslänge auf lange Periodendauer


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

sorry für den etwas langen Betreff, wußte aber nicht,wie ich's besser 
umschreiben könnte. MeinProblem ist folgendes:
Ich möchte bei einem ATTiny26 die beiden PWM Ausgänge nutzen. Das zu 
erzeugende Signal soll eine Periodendauer von 20ms haben und von 0,8ms 
bis 2,2ms high Pegel liefern.
Ich wollte nun mit möglichst hoher Präzision (Auflösung ca. 0,02ms) die 
Pulsdauer variieren. Bisher habe ich das Problem, dass die integrierten 
Timer nur 8bitter sind, ich also bei 20ms Gesamtlänge eine Auflösung von 
bestenfalls ~0,08ms erreichen kann. Gibt es eine Möglichkeit, die 
Hardware PWM etwas aufzubohren oder hilft da nur die Lösung per 
Software?
Frohes Fest

Thomas

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was soll nach den 20 ms passieren? Das von Dir beschriebene Signal 
ist ja nicht periodisch...

H     -------------
      |           |
      |           |
      |           |
      |           |
L ---0,8 
2,2----------------------------------------------------20

...und dann? Wenn das selbe Signal dann direkt wiederholt werden soll, 
dann kannst Du den H-Impuls auch nach links bis auf Null schieben...

H -------------
  |           |
  |           |
  |           |
  |           |
L 0 
1,4--------------------------------------------------------20

...weil da sonst eh keine Flanke ist und einfach einen 1,4 ms langen 
Impuls erzeugen. Das ganze dann nach 20 ms wiederholen. Aber ich vermute 
mal, Du willst was anderes...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Upps, da hats die Zeilen umgebrochen...

Sollte eigentlich so aussehen:
H     -------------
      |           |
      |           |
      |           |
      |           |
L ---0,8         2,2---------------------------------------------20

bzw.

H -------------
  |           |
  |           |
  |           |
  |           |
L 0          1,4-------------------------------------------------20

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gewünschte Timing stinkt schon sehr verdächtig
nach einem Servo-Timing :-)

Durchsuche mal das Forum. Servo Ansteuerungen sind
ein Dauerbrenner.

Autor: Stefan Gemmel (steg13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich möchte bei einem ATTiny26 die beiden PWM Ausgänge nutzen.

ist damit gemeint
A. Ausgang OC1A und OC1A\
B. Ausgang OC1A,OC1A\,OC1B,OC1B\

Im Fall A hätte man ja einen Timer übrig.
Lässt sich eigentlich der Ausgang Timer1 als externer Takt Timer0 
zuführen?

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und was soll nach den 20 ms passieren? Das von Dir beschriebene Signal
>ist ja nicht periodisch...

Er will eine PWM mit folgenden Eigenschaften:

● Alle 20 ms soll der Pegel für eine kurze Zeit t auf High gehen
  --> Periodendauer = 20 ms

● t ist variabel und soll Werte zwischen 0.8 ms und 2.2 ms annehmen 
können
  --> 0.8 ms <= Pulsdauer <= 2.2 ms

● die Wahl von t soll in Schritten von 0.02 ms erfolgen können
  --> Pulsdauer-Auflösung = 0.02 ms

Wegen der 8-Bittigkeit der Hardware-Timer wird er um eine 
Software-Lösung wohl nicht herumkommen.  Aber da ein mit 8 MHz 
getakteter AVR während 0.02 ms immerhin noch ca. 100 Instruktionen 
abarbeiten kann, sollte das machbar sein.  Zeitverschwendender Code ist 
da (= im Interrupthandler) dann allerdings fehl am Platz.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vegiß die PMW, nimm die set or clear Pin on compare Funktion.

Alles, was über 256 ist, zählst Du dann im Interrupt runter, bis dann 
der Pin im nächsten Compare gesetzt werden darf.


Etwas tricky wirds, wenn das Compare knapp nach dem vorherigen Interrupt 
kommen soll, da muß man dann schon vorher den Comparewert verkürzen, so 
daß noch Zeit für den Interrupthandler übrig bleibt, um die Pinrichtung 
fürs nächste Compare umzusschalten.

Z.B. 257 = 256 + 1 wäre zu knapp, also dann einfach auf 129 + 128 
aufteilen.


Peter

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

danke erstmal für die zahlreichen Antworten. Die Fragestellung war wohl 
ein bischen konfus. So wie's der AVRFan erkannt hat stimmt's. Und ja, 
das Signal ist im Prinzip genau wie das für Servos, soll aber einem 
anderen Zweck dienen.
Naja, und so wie's aussieht werde ich dann wohl doch ein paar Zeilen 
Code mehr schreiben.
Euch allen ein frohes Fest

Thomas

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.