www.mikrocontroller.net

Forum: Compiler & IDEs Einlesen einer Periodendauer eines PWM Signals


Autor: Sören (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Sören (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sören (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sören (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sören (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lass uns das lieber per mail machen...gib mal kurz deine Adresse

Autor: Sören (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
kann es auch etwas mit den fuses zu haben?
Hab von fuses absolt null Ahnung

Autor: Sören (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die variable ist übrigens uint16_t.

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...
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...

Autor: Sören (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sören (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.