Einlesen einer Periodendauer eines PWM Signals

Gast #659483
Lesenswert?
• ▲
▼
Hallo,
ich habe Schwierigkeiten beim einlesen einer Periodendauer eines PWM 
Signals mit dem AT Mega16.
Ich benutze den PD6 Capture Pin den µC.
An diesen Pin möchte ich eine externes PWM Signal anlegen und die 
Periodendauer in eine Variable speichern.

Vielen Dank für die Hilfe
Gast #659550
Lesenswert?
• ▲
▼
Hallo,
also ich mache folgendes:
{
TCCR1B = (1<<ICES1)  | (1<<CS10); // Input Capture Edge, kein PreScale
TIMSK = (1<<TICIE1) | (1<<TOIE1); // Interrupts akivieren, Capture + 
Overflow

  WertPWM = (Overflows * 65536) + WertPWM;
  WertPWM = Wertberichtigung_capture(WertPWM);
  lcd_cls();
  lcd_zeichenkette("PWM=");
  lcd_varout(WertPWM);
  lcd_zeichenkette("Hz");
  lcd_zeile(2);
  lcd_varout(Overflows);

}

Also wenn auf Menüpunkt 1, der Taster gedrückt wird springt er in die 
Schleife, initialisiert den Capture input.
Dann erfolgt interrupt (meinem Verständnis nach).

ISR(TIMER1_CAPT_vect)
{
WertPWM = ICR1; //variable füllen
TCNT1=0; //register leeren
}

Wärend er da rumzählt kann er natürlich auch überlaufen:
ISR(TIMER1_OVF_vect)
{
  Overflows++;
}

1.Problem: Ich will ja die Signallänge von High Flanke nach High Flanke. 
Wie bring ich Ihm bei das Register zu stoppen, wenn dieser Fall 
eintritt?

Danke für die Hilfe
#659556
Lesenswert?
• ▲
▼
Bei Input Capture wird nichts "gestoppt"! Man speichert bei der ersten 
Flanke den Wert in ICR1 und bei der nächsten Flanke wieder und bildet 
zum Schluss die Differenz der Werte. Wenn zwischen zwei Flanken 
Timer-Überläufe stattfinden, müssen die entsprechend berücksichtigt 
werden, was aber nicht erforderlich ist, wenn sichergestellt ist, dass 
der zeitliche Abstand zwischen zwei Flanken immer kleiner ist als die 
Zeit, die der Timer braucht, um einmal komplett durchzulaufen.
Gast #659564
Lesenswert?
• ▲
▼
Man speichert bei der ersten Flanke den Wert in ICR1 und bei der 
nächsten Flanke wieder und bildet zum Schluss die Differenz der Werte.

den Wert??? Du meinst die Zeit, die der Mega16 (bei mir mit 8MHZ ohne 
Vorteiler) benötigt um vom einen zum nächsten Signal zu gelangen.

Jap - das hört sich sehr gut an, nach dem Wissensstand operiere ich ja 
auch die ganze Zeit.
Allerdings habe ich Probleme mit der Aufösung.

Frequenzen von 0-3kHz kann ich Problemlos mit meinem Dezimalzahlen 
darstellen (das macht die funktion varout() für das LCD Display).
Allerdings ist der für mich interessante Bereich zw. 10 und 20kHz.
Dort wird aber längst eine 0 im Register angezeigt.
Das lässt darauf schließen, dass die Abtastung zu klein ist - aber wie 
kann das bei 8MHZ sein?

Danke nochmals für die Hilfe bei meinem Problem
Gast #659565
Lesenswert?
• ▲
▼
den Wert??? Du meinst die Zeit, die der Mega16 (bei mir mit 8MHZ ohne
Vorteiler) benötigt um vom einen zum nächsten Signal zu gelangen.

meine natürlich nicht das nächste Signal (benutze ein absolut 
periodisches Signal). ich meine natürlich die nä. Periode.
#659575
Lesenswert?
• ▲
▼
Wenn Du das TCNT1 löschst, bekommst Du irgendwas, nur nicht den 
richtigen Wert. Lass die Finger vom TCNT1.

Welchen Typ haben Deine Variablen? Und könntest Du vielleicht mal den 
kompletten Code hier reinstellen? Ich vermute nämlich, dass bei 
irgendwelchen Berechnungen was schiefgeht. Mit Capture und 8 MHz 
Timertakt sollten sich 20 kHz noch mit brauchbarer Auflösung messen 
lassen.
#659591
Lesenswert?
• ▲
▼
Sören wrote:
> lass uns das lieber per mail machen...gib mal kurz deine Adresse
Wenn Du Dich im Forum anmeldest, dann kannst Du mir ne Nachricht 
schicken...

> kann es auch etwas mit den fuses zu haben?
Klar, wenn das Ding auf "interner RC-Oszillator 1 MHz" läuft, dann läuft 
es eben mit 1 MHz und nicht mit 8...

> Hab von fuses absolt null Ahnung
Dann solltest Du Dich damit mal befassen. Ohne wenigstens ein bisschen 
Ahnung von Fuses kommst Du bei der µC-Programmierung nämlich nicht weit.
#659611
Lesenswert?
• ▲
▼
Sören wrote:
> die variable ist übrigens uint16_t.
WertPWM ist uint16_t? Schau Dir bitte mal an, welchen Wertebereich
uint16_t hat, und überlege dann mal, was passiert, wenn in dieser
Zeile...
1
WertPWM = (Overflows * 65536) + WertPWM;
"Overflows" und/oder "WertPWM" vor der Zuweisung größer
als Null ist...

Kleiner Tip: 65536 passt in einen uint16 schon mal gar nicht rein...

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