mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lesen eines PWM-Signals mit einem AVR


Autor: Wolfram Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bekomme ein PWM-Signal an einem PORT geliefert, der gelesen werden
soll. Highs und Lows des PWM-Signals unterscheiden sich in der Länge
der Highpegel. Das Erkennen der Low-High-Flanke kann ich in einer
Schleife realisieren. Wie ermittle ich die Länge der Highpegel?
--------------------------------------------------------------
.def  timer1    =r17

;*** Programm MAIN
MAIN:
MAIN_LOOP:
   sbis  PINA, 0x00 ;Springe, wenn 0. Bit des PORTA 1 ist
   rjmp  MAIN_LOOP ;Endloschleife
   rcall PAKET
   rjmp  MAIN_LOOP ;Endloschleife

;*** Unterprogramm PAKET
PAKET:
   ;Start der Zeitmessg
   clr   timer1 ;Register clr auf 0 setzen
PAKET_LOOP:
   inc  timer1
   sbis PINA, 0x00 ;Springe, wenn 0. Bit des PORTA 1 ist
   ;Stop der Zeitmessg, Laenge des Highpegels ermitteln
   ...
   rjmp PAKET_LOOP
--------------------------------------------------------------

MfG

Wolfram Hubert

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so wie du das Programmiert hast, komme ich nicht ganz mit. Ich würde das
so machen:

PAKET_LOOP:
  inc timer1
  sbic PINA,0x00;  ;skip, if bit is clear
  rjmp PAKET_LOOP
  ;hier dann die Auswertung!!!
  ;
  ret

Das heißt, du erhöst den timer 1 solange, bis das Signal wieder weg
ist. (Ist zwar nicht so ganz elegeant müsste aber funktionieren.)
Das auswerten ist ganz einfach: du rechnest einfach aus, wie lange der
Controller braucht, bis er den Timer 1 erhöht hat. Diese Zeit mal den
inhalt von Timer1 und du hast die High-Zeit von deinem Signal.
Beachte aber dass die Controller verdammt schnell sind und die Variable
timer1 nur ein 8-Bit register ist, also nur bis 255 gezählt wird und
dann wieder bei 0 angefangen wird. Wenn dein Controller einen
Befehlszyklus von 1Mhz hat, dann muss dein Signal mindestens eine
High-Zeit von 255µs haben.

Gruß, Florian

Autor: Wolfram Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Florian,

ich verwende 4 MHz. Statt sbis will ich brne verwenden.

Zeit für 1 Durchlauf:

inc  250 ns
brne 500 ns (bei Sprung)
-----------------------
     750 ns


Zeit für 255 Durchläufe:

255 * 750 ns = 191250 ns

Zeit für Durchlauf, wenn timer1=255:

inc  250 ns
brne 250 ns (kein Sprung)
-----------------------

191250 ns + 500 ns = 191750 ns

191750 ns = 191,750 µs maximal erfassbare Zeitspanne. Die Highzeiten
bewegen sich zwischen > 2 ms und < 7 ms. Daher müßte ich mehrere
Variablen verwenden. Komfortabler müßte aber das Verwenden eines Timers
gehen.
Aber wie geht das?

MfG

Wolfram Hubert

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal unter http://www.mikrocontroller.net/forum/read-1-40705.html
hier ist wird das gleiche diskutiert.

Gruß, Florian

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.