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