Autor |
Mit Microkontroller Frequenz Messen Suche nach: frequenz (6276) |
|
|
|
|
BID = 145818
wellenbrecher247 Gerade angekommen
Beiträge: 8
|
|
Hallo... hab schon viele Foren durchgestöbert und noch keine Hilfe gefunden!
Ich möchte ein Gitarrenstimmgerät bauen, mit einem Microcontroller (AT89S8252).
Über ein microfon und einen OP und Schmitttrigger hab ich ein Rechtecksignal... welches ich an PortPin 3.2 lege (Timer 0 zählt dann also wenn eine 5V anliegen (log 1)), bei negativer Flanke wird der externe Interrupt 0 ausgelöst. In der Interrupt Service Routine wird dann der aktuelle ´Timerwert ausgelsen...
soweit bin ich in meinem Denkansatz... aber da habe ich ja erst die halbe Periode... wie bekomme ich die andere Hälfte, kann der AVR das signal invertieren?
Wäre stark wenn ihr mir helft, für jeden Vorschlag bin ich dankbar.
mfg Wellenbrecher247
|
|
BID = 145835
Her Masters Voice Inventar
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5308 Wohnort: irgendwo südlich von Berlin
|
|
wie wärs einfach mit verdoppeln?
Aber du kannst dir natürlich auch mal ansehen wie Andere es gemacht haben. Http://www.sprut.de wäre da ne Möglichkeit. Der Frequenzzähler ist dort in mehreren Beispielen erklärt und kann mit etwas Abstraktionsvermögen auch auf nem AVR umgesetzt werden.
_________________
Tschüüüüüüüs
Her Masters Voice
aka
Frank
***********************************
Der optimale Arbeitspunkt stellt sich bei minimaler Rauchentwicklung ein...
*********************************** |
|
BID = 145836
Her Masters Voice Inventar
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5308 Wohnort: irgendwo südlich von Berlin
|
wie wärs einfach mit verdoppeln?
Aber du kannst dir natürlich auch mal ansehen wie Andere es gemacht haben. Http://www.sprut.de wäre da ne Möglichkeit. Der Frequenzzähler ist dort in mehreren Beispielen erklärt und kann mit etwas Abstraktionsvermögen auch auf nem AVR umgesetzt werden.
_________________
Tschüüüüüüüs
Her Masters Voice
aka
Frank
***********************************
Der optimale Arbeitspunkt stellt sich bei minimaler Rauchentwicklung ein...
***********************************
|
BID = 145870
HarryGr Gerade angekommen
Beiträge: 5
|
Ich hab einfach gewartet bis der Eingang 0 ist,
dann gewartet bis der Eingang 1 ist,
Timer auf NULL gesetzt,
gewartet bis Eingang wieder 0 ist,
gewartet bis wieder 1 ist,
und Timer Ausgelesen.
Dieses Verfahren ist recht unwirtschaftlich, da der µC die gesamte Periode nur am Warten ist. Ich brauchte damals aber auch nur einen Frequenzmesser und da war das ausreichend. Nach jeder Messung noch schön das Ergebniss ausgeben und neu messen.
|
BID = 145891
alpha-ranger Schreibmaschine
Beiträge: 1517 Wohnort: Harz / Heide
|
Zitat :
wellenbrecher247 hat am 4 Jan 2005 16:11 geschrieben :
|
bei negativer Flanke wird der externe Interrupt 0 ausgelöst. In der Interrupt Service Routine wird dann der aktuelle ´Timerwert ausgelsen...
mfg Wellenbrecher247
|
Hallo,
ist doch alles richtig soweit. In einer vollständigen Periode gibt es nur eine negative Flanke. Es wird also Periodendauer t gemessen. Sowas habe ich schon mal als Drehzahlmesser realisiert, aber mit einem AT90S1200.
Um die Resourcen des Prozessors am besten auszunutzen, mach Dir ein Exel-Sheet, wodrin Du alle Varianten die sich aus der Clockfrequenz und dem Vorteiler des Counters ergeben testen kannst.
Wenn es mit einer Saite klappt, kann man ja die anderen 5 auch implememntieren. E-A-D-G-H-E oder wie war das ?
Mathematischer Zusammenhang: A ist 440 Hz, eine Oktave ist eine Frequenzverdopplung und der Abstand zwischen zwei (Halb)-Tönen ist der Faktor 12te Wurzel aus 2.
Und autotuning ist die Eigenschaft, das das Gerät selbstständig die Saite erkennt.
mfG.
_________________
Wie der alte Meister schon wußte: Der Fehler liegt meist zwischen Plus und Minus. :-)
Und wenn ich mir nicht mehr helfen kann, schließ ich Plus an Minus an.
|
BID = 145949
MinceR Stammposter
Beiträge: 277
|
also sobald der eingang H ist zählt er bis es ne negative flanke gibt. da haste genau die halbe periode.
mal 2 rechnen ist einfach alle binären zahlen im register um 1 nach links schieben. dann haste das richtige ergebniss. aber wie alpha ranger schon sagt du musst dir ja eh vorher ne umrechnung ausdenken. und dann kannste ja auch mit der halben zeit rechnen. also 1/440*2 usw usw...
aber wie wäre es mit folgendem:
weiss ja nicht ob dein micro und op usw genau richtig aufgebaut ist, also die zeit die er low bleibt genausolang ist wie die zeit der er H ist..
du kannst die ganze periode ja auch einfach von fallender flanke bis zur fallenden flanke messen.
also wert aus timer lesen -> timer löschen(und natürlich weiterlaufen lassen) -> ausgeben und das alles im interrupt der ausgelöst wird wenn eine fallende flanke kommt. und dann als hauptprogramm einfach nix oder da halt die
|
BID = 146150
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| da haste genau die halbe periode. |
Wie kommst du denn darauf ?
Hast du schon einnmal die Kurvenform eines solchen NF-Signals gesehen ?
Außerdem sorgt die meist an den Portpins vorhandene Hysterese dafür, daß Ein- und Ausschaltschwelle nicht gleich hoch liegen.
Ich würde aber die Zeit nicht nur einer sondern die mehrerer voller Perioden messen.
Das ist inmmer noch schnell genug, verbessert aber die Genauigkeit erheblich, weil Unsicherheiten bei der Interrupt-Latency eine geringere Rolle spielen, der relative Quantisierungsfehler der Zeitmessung geringer wird, und auch die Rundungsfehler bei der Division f=k/t abnehmen.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
|
BID = 146186
wellenbrecher247 Gerade angekommen
Beiträge: 8
|
Zitat :
| alpha-ranger schrieb:
Um die Resourcen des Prozessors am besten auszunutzen, mach Dir ein Exel-Sheet, wodrin Du alle Varianten die sich aus der Clockfrequenz und dem Vorteiler des Counters ergeben testen kannst |
wie ist das gemeint?
Ich habe mir eine Schaltung gebaut, leider bin ich nicht so der Profi...und der H Pegel ist nur bei hoher Lautstärke die halbe Periodendauer.
Ich werde meine Schaltung mal als BIld uploaden...könnt mir ja mal sagen, was ich besser machen kann.
Die Idee mit den fallenden Flanken mehrmals messen ist gut...werd sie mal probieren.
Danke an alle die bisher geholfen haben
|
BID = 146225
wellenbrecher247 Gerade angekommen
Beiträge: 8
|
Bin auf nochein Problem gestoßen...
wollte von Flanke zu Flanke messen... aber...
Meine Gedanken:
- Bei fallender Flanke -> Interrupt wird ausgelöst
- in der Interrupt Service Routine muss ich den Timer-
Wert auslesen und den Timer zurückstzen. der Timer soll
aber schon die nächste Zeit Messen...
--> Das auslesen und zurücksetzen braucht Zeit und
verfälscht doch somit das Ergebnis... ODER?????
|
BID = 146256
alpha-ranger Schreibmaschine
Beiträge: 1517 Wohnort: Harz / Heide
|
Hallo,
der µC hat 3 16-Bit Timer/Counter.
Aber wenn Du das Interruptverhalten auf Flankengesteuert setzt, und sofort den Counter ausliest und den Counter auf Null setzt, sind die Bedingungen immer gleich.
Der Counter wird entsprechend dem Teilerverhältnis stets incrementiert. Egal was Dein Programm macht.
Aber Du mißt eine Zeit, und keine Frequenz. Wenn der Timer eine Breite von 16 bit hat, wäre es sinnlos, diesen nicht in voller Breite auszunutzen. Wertebereich hier 0 bis 65536.
Bsp. : Um 10 ms zu messen, werde ich die Clockfrequ. und den Vorteiler so einstellen, das ich auf 50 000 Counterincrements komme.
Und nicht auf 100. Die Meßunsicherheit wäre dann zu groß.
Um ungültige Ergebnisse auszuschließen,wäre es sinnvoll den TimerOverflowInterrupt auch zu benutzen.
Ein Excel-Sheet dewegen, weil Excel auch durch Eingabe von Formeln rechnen kann. So kann man für jede gemessne Zeit sich die Frequenz anzeigen lassen und entsprechend der Bewertungskriterien festlegen ob der Ton richtig ist.
Dein Prg. müßte dann anzeigen: E-, E oder E+ für die betreffende Saite.
Hast Du ein besseres Datenblatt ? Ich hab mir das PDF von Atmel heruntergeladen, da steht nicht viel drin.
mfG.
_________________
Wie der alte Meister schon wußte: Der Fehler liegt meist zwischen Plus und Minus. :-)
Und wenn ich mir nicht mehr helfen kann, schließ ich Plus an Minus an.
|
BID = 146273
wellenbrecher247 Gerade angekommen
Beiträge: 8
|
Mit dem Exel habe ich noch nicht richtig verstanden... der µC kann das doch auch umrechnen!?
ich habe jetzt ein programm geschrieben...welches nach jeder negativen Flanke abwechselnd den Timer zurücksetzt und ausließt.
Schauts dir mal an!
ich bin neuling in µC...überhaupt in elektronik...
das mit dem Vorteiler und bis 50000 zählen zu lassen...weiß nicht was du meinst (ich habe 12MHZ Quarz... Zähler incrementiert aller 1µs)
Hab kein besseres Datenblatt...
[ Diese Nachricht wurde geändert von: wellenbrecher247 am 5 Jan 2005 13:57 ]
|
BID = 146735
alpha-ranger Schreibmaschine
Beiträge: 1517 Wohnort: Harz / Heide
|
Hallo,
Danke für den Programmteil.
Es sollen die gemessenen Werte zum PC geschoben werden.
Dann braucht der Proz. auch keine Auswertung der Zahlen machen, und Du brauchst keine Exeltabelle um die krummen Werte der Töne in die jeweilige Periodendauer umzurechnen.
Zum testen einen Generator mit 100 Hz Rechteck anschließen.
Ergibt eine Periodendauer von 10 ms, der Counter müßte von Flanke zu Flanke 10 000 Increments machen.
Interruptbehandlung:
Während der Messung den Interrupt der seriellen Schnittstelle disabeln.
ext. Interrupt enabeln
beim ersten ext.Inter. Counter zurücksetzen.
beim zweiten ext. Inter. Counter auslesen.
ext. Inter. disabeln
Ausgaberoutine anspringen/ser. Inter. enabeln
zurück in die loop
Leite das mal mathematisch ab, wie Du bei 12MHz Takt auf exakt 1 µs kommst.
mfG.
|
BID = 147018
wellenbrecher247 Gerade angekommen
Beiträge: 8
|
Ich möchte ja später die Daten nicht zum PC senden, sondern über LED's soll angezeigt werden ob der Ton zu Hoch oder zu tief ist und auf eine Anzeige, wahrscheinlich 7 Segment...soll die dem Ton am nächsten liegende Note angezeigt werden...die Auswertung muss ich schon machen.
Das mit dem Generator ist ne gute Idee...danke!
Unser Doten hat gesagt: Quarzfrequenz= 12 MHz
Taktfrequenz= Quarzfreqenz/ 12 = 1MHz
--> Taktperiode = 1/1Mhz =1µs
hab das halt dann auch mal angenommen, dass das stimmt.
|
BID = 147019
wellenbrecher247 Gerade angekommen
Beiträge: 8
|
Kann sich bitte nochmal jemand meine Schaltung anschauen ???
Was kann vieleicht vereinfacht werden, wo sollte etwas besser gemacht werden?
Danke!
|
BID = 147058
wellenbrecher247 Gerade angekommen
Beiträge: 8
|
jetzt ist mir noch eine Merkwürdigkeit aufgefallen...
Ich hab das Programm mit 1kHz ausprobiert...
Funktioniert eigentlich super...es gibt mir 1000 µs aus...
...aber ab und zu 1007...vieleicht aller 10 Messungen manchmal auch häufiger ...aber immer nur 1007... hab dann ein bischen rumgespielt... z.B. clr ex0 mal weggelassen ... dann hat es 993 ausgegeben...also ab und zu...
wie kann das kommen? Wie beseitige ich den Fehler?
|