PWM Signal auswerten

Gast #1681728
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
Moderator (Firma: Titel) Persönliche Seite #1681793
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.
Gast #1681814
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren