Forum: Mikrocontroller und Digitale Elektronik Takterkennung an einem µController-Eingang


von DamBedEi (Gast)


Lesenswert?

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.

von Thomas W. (thomas0906)


Lesenswert?

Bei positiver Flanke Interrupt auslösen.
Timer starten.
Bei nächster positiver Flanke Timer anhalten.
Gemessene Zeit mit gewünschter Frequenz vergleichen.

Gruß
Thomas

von Helmut (Gast)


Lesenswert?

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.

von Klaus D. (kolisson)


Lesenswert?

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

von DamBedEi (Gast)


Lesenswert?

@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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Helmut (Gast)


Lesenswert?

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.

von DamBedEi (Gast)


Lesenswert?

Ja, genau so ist das gedacht.

von DamBedEi (Gast)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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ß

von DamBedEi (Gast)


Lesenswert?

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.

von Klaus D. (kolisson)


Lesenswert?

Dann nimm einen 8Mhz Quarz.

klaus

von Uwe (Gast)


Lesenswert?

Hä (wie jetzt) 8%  Hää??? fürn SUMMER ??  ist doch egal !?!???
versteh ich nicht!!!

von Helmut (Gast)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.