Forum: Mikrocontroller und Digitale Elektronik PWM Signal auswerten


von Gertrud_H (Gast)


Lesenswert?

Hallo,

steh gerade voll auf dem Schlauch bei einem PWM Eingangssignal.

Ich habe einen C164 und mache das über die CAPCOM Einheit.

Die Frequenz des PWM Signals liegt bei ca. 5KHz.

Es läuft ein Timer 8 (einfach von 0x0000 bis 0xFFFF).

Mein Signal ist so aufgelegt, daß die positive Flanke am CC18 liegt und 
somit einen Interrupt auslösen kann wenn diese kommt.

Die negative liegt am CC19.

Ich muß die Impuls/Pausenzeit bestimmen und mache das letztlich damit, 
daß ich die Zählerstände vergleiche, bzw. voneinander abziehe.

Soweit so gut, aber das Problem ist das Synchronisationsproblem am 
Anfang.

Ich berechne alles bei der negativen Flanke und somit im CC19 Interrupt.

Hier besorg ich mir den Zählwert (CC19_Altwert) um beim nächsten CC19 
Interrupt die Periodendauer zu bestimmen.

Allerdings spielt es ja nun eine Rolle, ob das Signal vor dem CC19 "0" 
war oder "1" war. Ich krieg es einfach nicht gebacken diese 
Synchronisierung zu programmieren.

Wäre toll wenn mir jemand ein paar Denkanstöße liefern könnte. 
Herzlichen Dank an euch schon mal.

Gruß
Gertrud

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Mein Signal ist so aufgelegt, daß die positive Flanke am CC18 liegt und
> somit einen Interrupt auslösen kann wenn diese kommt.
> Die negative liegt am CC19.
Cool, du kannst von 1 Signal die Flanken trennen?  ;-)

> ob das Signal vor dem CC19 "0" war oder "1" war.
Wenn CC19 auf die fallende Flanke trggert, dann wird das Signal vorher 
wohl oder übel '1' gewesen und jetzt '0' sein . Denn eine fallende 
Flanke zeichnet sich ja durch einen Übergang von 1 nach 0 aus...   :-o

Und was funktioniert jetzt nicht?
Die Synchronisation ist auf jeden Fall totsimpel: einfach im ersten CC19 
Interrupt den alten CC19 Wert nicht auswerten, sondern erst ab dem 
zweiten CC19 Int.

Zieg doch einfach mal deinen Code, dann kann dir besser geholfen werden.

von Gertrud_H (Gast)


Lesenswert?

Ich schnalls nicht....

Hier mein CC18 und CC19

1
void CC2_viIsrCC18(void) interrupt CC18INT
2
{
3
  
4
if(z==0)
5
sync++;
6
7
}

1
void CC2_viIsrCC19(void) interrupt CC19INT
2
{
3
  
4
5
if (sync==1) 
6
  
7
  {
8
  CC19Alt=CC19;
9
  z=1;
10
  sync++;
11
  }
12
13
else
14
{
15
Impulsdauer=CC19-CC18;
16
Periodendauer=CC19-CC19Alt;
17
CC19Alt=CC19;
18
}

Das funktioniert zumindest fuer den Fall, daß die positive Flanke zuerst 
kommt. Wenn jetzt allerdings die negative zuerst kommt, dann Habe ich 
keinen CC18 Wert und auch keinen CC19Alt wert...

von holger (Gast)


Lesenswert?

>Wenn jetzt allerdings die negative zuerst kommt, dann Habe ich
>keinen CC18 Wert und auch keinen CC19Alt wert...

Solche Fälle muss man halt durch geeignete Massnahmen im Programm
abfangen;)

von Gertrud_H (Gast)


Lesenswert?

Achso ja klar....!!!! Man muß natürlich eine Maßnahme treffen...Daß ich 
da nicht gleich darauf gekommen bin

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.