Forum: Compiler & IDEs Einlesen einer Periodendauer eines PWM Signals


von Sören (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

Wo genau liegt bitte Dein Problem? Du beschreibst, was Du machen 
möchtest, aber nicht, woran es scheitert bzw. wo Du nicht 
weiterkommst...

von Sören (Gast)


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

von Johannes M. (johnny-m)


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.

von Sören (Gast)


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

von Sören (Gast)


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.

von Johannes M. (johnny-m)


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.

von Sören (Gast)


Lesenswert?

lass uns das lieber per mail machen...gib mal kurz deine Adresse

von Sören (Gast)


Angehängte Dateien:

Lesenswert?

kann es auch etwas mit den fuses zu haben?
Hab von fuses absolt null Ahnung

von Sören (Gast)


Lesenswert?

die variable ist übrigens uint16_t.

Meine Baustelle kann ich hier nicht posten - damit sprenge ich nur die 
Projekte anderer:-)

von Johannes M. (johnny-m)


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.

von Johannes M. (johnny-m)


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...

von Sören (Gast)


Lesenswert?

Now i got it!!!
Relativ dämlich da nicht draufgekommen zu sein...
...Hab dir zu danken....super, dass Du Dir die Mühe gemacht hast.

von Sören (Gast)


Lesenswert?

Hehe, recht haste...aber ich sag ja - eine Baustelle der besonderen 
Art:-)

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.