Lesen eines PWM-Signals mit einem AVR

Gast #44026
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
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.