Hallo. Ich habe ein Problem mit meinem µController-Projekt. Ich benutze einen ATMega128. Meine Aufgabe besteht darin, zu erkennen, ob an einem Eingang (PIND1) ein externer Takt von zB 50Hz anliegt. Falls dies der Fall ist, möchte ich diesen Takt verwenden um einen Summer anzusteuern. Falls nicht, soll ein eigen generierter Takt (aus einem 8MHz externen Oszillator) verwendet werden. Die gewünschte Frequenz aus 8MHz zu erzeugen habe ich geschafft, nur bei der Takterkennung komme ich nicht voran. Wäre nett, wenn mir jemand ein paar Tipps, Anregungen, Lösungsvorschläge geben könnte. Danke.
Bei positiver Flanke Interrupt auslösen. Timer starten. Bei nächster positiver Flanke Timer anhalten. Gemessene Zeit mit gewünschter Frequenz vergleichen. Gruß Thomas
In welcher Form liegt denn dein externer Takt an? Sinus, Rechteck, Impuls? Welche Spannung? Skope vorhanden? Denkanstoss: Wie wäre es per ADC abzutasten und bei erreichen von 3/4 der Spannung per Merker einen Ausgang setzen. Wenn Merker gesetzt und Sinusspannung auf 1/4 Niveau gefallen ist Ausgang rücksetzen. Wenn Eingangsspannung Sinusform hat. Ansonsten bietet sich an, per Levelinterupt eines entsprechenden Eingangs die Sache in den Griff zu bekommen. Einen Timer mit 20-22 ms laufen lassen. Den per Merker synchronisieren, bzw wenn kein Merker nach Ablauf der Zeit gesetzt wurde, den Ausgang toggeln.
DamBedEi schrieb: > Meine Aufgabe besteht darin, zu erkennen, ob an einem Eingang (PIND1) > ein externer Takt von zB 50Hz anliegt. Geht es denn darum zu erkennen dass der externe Takt 50Hz ist oder nur darum festzustellen on irgendein externer Takt anliegt ? Klaus
@Klaus: Beides eigentlich. Primär geht es darum zu erkennen, ob ein Takt anliegt. Danach soll entschieden werden, ob dieser Takt geeignet ist ob verwendet zu werden. @Helmut: Der Takt würde als Rechtecksignal anliegen. Das mit dem "Merker-Ansatz" leuchtet mir nicht so ganz ein. Was meinst du mit einem Merker?
DamBedEi schrieb: > @Klaus: > Beides eigentlich. Primär geht es darum zu erkennen, ob ein Takt > anliegt. In welchen Grenzen? Wenn der Pin jede volle Stunde den Pegel wechselt, ist das auch ein Takt. Er ist zu langsam um damit bei dir was sinnvolles zu machen, aber es ist ein Takt. Im Grunde geht es bei deinem Problem darum: Ist in einem bestimmten Zeitraum (eben die minimale Frequenz) ein Flankenwechsel an einem Port passiert. Wenn ja, dann hast du einen Takt, wenn nein dann generierst du einen.
Okay, das mit dem Merker ist ein geläufiger Begriff bei SPS. (Speicherprogramm.Steuerungen) Ist nicht mehr als eine Bitvariabele oder Variable setzen. Wenn Rechtecksignal vorhanden liegt die Nutzung vom Timer in Verbindung mit einem levelgesteuerten Eingang nahe. Der "Merker, die Variable" dient innerhalb der Timerzeit als Mittel, festzustellen ob ein Eingangsimpuls vorhanden war, ---> dann Ausgang setzen, oder nicht vorhanden war. --> Dann -nach Ablauf der Timerzeit- Ausgang setzen. So hast du immer einen Ausgangstakt von 21 ms. Wenn Eingang vorhanden direkte Weitergabe, wenn nicht vorhanden per Timer.
Also es ist so wie du gesagt hast, Karl Heinz. Wenn der Takt nicht geeignet ist (schneller oder langsamer wie 50Hz mit einer bestimmten Toleranz) soll er den eigen generierten Takt verwenden. Helmut, dir kann ich leider nicht folgen, da ich keine Ahnung von SPS habe. Ich programmiere den µController mit C.
Nur zur info : Du brauchst irgendwo immer 50HZ Takt egal ob er produziert wurde oder nicht ? Das würde heißen es wäre kein unterschied ob du immer 50Hz generieren würdest, egal ob schon ein Takt da ist. Oder ? Ich stell mir das so vor 1. Ich Habe 50Hz also route ich das durch also ich mache 50Hz am ausgang. 2. Ich habe keine 50Hz also mache ich auch 50Hz am Ausgang. Also warum nicht immer 50Hz am Augang. Gibt es dafür einen Grund ? Was wills du Erreichen, oder wofür brauchst du das ??? schönen Gruß
Das liegt einfach daran, dass ich bei meinen 50Hz, die ich aus den 8MHz erzeuge eine kleine Abweichung drin habe (bzw eine relativ große von 8%). Deshalb wäre es besser exakte 50Hz zu benutzen, die zB von einem Frequenzgenerator kommen. Jedoch ist nicht garantiert, ob ein Frequenzgenerator anliegt oder nicht. Somit muss ich erstmal entscheiden ob ich jetzt die Frequenz nehme, die an PIND1 anliegt, oder eben nicht. Ein High- oder Low- Signal am Eingang zu erkennen ist ja nicht das Problem, aber ein wechselndes zu erkennen und dann auch noch zu überprüfen ob dies nun 50Hz sind oder nicht, das übersteigt (noch) ein wenig mein Horizont.
Hä (wie jetzt) 8% Hää??? fürn SUMMER ?? ist doch egal !?!??? versteh ich nicht!!!
Wie gesagt, Timer mit 20 ms laufen lassen. Eingang levelmäßig abfragen -Int0, Int1 o.ä-. Wenn Eingangsimpuls vorhanden, Bitvariable (Externimpuls [Merker] setzen, Ausgang setzen und Timerwert auf Null setzen. -Timer auf Flanke sychronisieren- Externimpuls Merker, sprich Bitvariable wird in der Timerroutine -zeitlicher Überlauf- abgefragt. Wenn gesetzt, Ausgang und Bitvariable rücksetzen. Wenn nicht gesetzt, Internimpuls-merker abfragen. Wenn gesetzt Ausgang setzen, Internimpuls-Merker rücksetzen. Wenn nicht gesetzt, Ausgang zurücksetzen. Zwei Variablen werden beim Timerüberlauf abgefragt. Die Externvariable zeigt an, es gab einen Impuls an dem Eingang. Ausgang wird gleich gesetzt und nach Überlauf und Variablentest zurück gesetzt. War kein Impuls am Eingang vorhanden, wird Hilfsvariable Intern gesetzt und entsprechend der Ausgang bearbeitet. Dann wurde Impuls intern vom Timer generiert. *Merker ist wie der Name schon sagt, eine Hilfsvariable die einen Zustand (Level high oder low, oder Flanke positiv oder negativ) zur Programmbearbeitung beinhaltet.
Man kann Frequenzmessungen mit Input Capture machen. Das heißt man konfiguriert einen der timer auf input capture und nen passenden vorteiler (prescaler).Das heißt man muß überlegen das der wert möglichst (der einfachheit halber) 16 bit nicht überschreitet wenn mit Grundtakt geteilt durch prescaler gezält wird. Dabei wird auf eine Flanke des angeblichen 50Hz signal getriggert (triggeroptionen richtig setzen 0 1 oder beide flanken) dann Zählt der Counter los mit Haupttakt/Prescaler also 8Mhz/1024 bis zur nächsten Flanke : das sind 7812.5 counts also da 1 count (8Mhz^-1)*1024=0,128ms entspricht muss ich (50Hz^-1)/0,128ms=156,25 zählen. Mit kleinerem prescaler wirds genauer. Aber ist eigentlich nicht so schlimm da die 8MHz ja auch 8% abweichung haben. Das bedeutet : Ich kann die 50Hz nur so gut Messen Wie der Referenstakt genau ist also 8% also 50Hz mit 8% abweichung. Also Quarz benutzen. schöne Grüße
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.