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


von Wolfram Hubert (Gast)


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

von Florian Pfanner (Gast)


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

von Wolfram Hubert (Gast)


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

von Florian Pfanner (Gast)


Lesenswert?

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

Gruß, Florian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.