Hallo AVR-Gemeinde,
ist es möglich mit einem Mega32 per Software eine Fequenz zwischen 0,1 MHz und 2 MHz zu messen.
Gibt es vielleicht sogar schon fertige Lösungen?
Grüßle
Sebastian
Hallo AVR-Gemeinde,
ist es möglich mit einem Mega32 per Software eine Fequenz zwischen 0,1 MHz und 2 MHz zu messen.
Gibt es vielleicht sogar schon fertige Lösungen?
Grüßle
Sebastian
Stichwort: Timer, Counter - Siehe Datasheet.
mfG
Markus
Das müsste möglich sein, wenn man die zu messende Frequenz als Taktquelle für einen Timer benutzt.
Ein weiterer Timer bestimmt dann noch die Torzeit der Messung.
Es gibt aber, soweit ich das im Hinterkopf habe, eine Grenze wie hoch der Timer extern im Bezug auf den Controllertakt sein darf.
hat hierzu vielleicht irgendjemand ein Beispiel damit ich mich daran orientieren kann?
Hab so was noch nie gemacht.
Für etwas niedrigere Frequenzen, bis etwa 300 kHz, geht die Freqwunzmessung sehr gut über die ICP funktion. Man maißt da nicht die Freqwunz direkt, sondern die Periodendauer. Unter Timer ist in Wiki Bereich ein Beispielprogramm in C, allerdings mehr für niedrige Freqwunzen unter 1 kHz. Für höhere Freqwunzen solle man die Dauer von mehreren Perioden messen.
Eine Frequenz über etwa 300 kHz müßte man das Signal runterteilen.
@sebi87
Ein fertiges Programm hab ich leider nicht in petto.
Im Prinzip geht es darum einen Timer, vorzugsweise den Timer 1 mit der zu messenden Frequenz zu takten. Ich würde das ohne Vorteiler machen.
Im Overflow Interrupt des Timers 1 wird dann eine Variable hochgezählt, die dann auch Messungen über 65536 Hz zulässt und somit als High Word dient.
Ein anderer Timer z.B. dient als Torzeitquelle für z.B. 1sek. Der wird mit der prozessoreigenen Taktquelle gesteuert.
Nach einer Sekunde, also wenn der Torzeittimer zugeschlagen hat wird der Zähler + Überlaufzähler ausgelesen, in eine Variable geschoben und der Timer 1 für die nächste Messung wieder auf 0 gesetzt. Diesen Programmteil würde ich auch in einem Interrupt anlegen.
Man hat jetzt das Low und High Word der gemessenen Frequenz direkt in Hertz und kann das Ergebnis in der Hauptroutine des Programms weiter verarbeiten.
Das stimmt schon, hier geht es aber um 2 MHz und da wird es mit ICP schon sehr ungenau und schwierig.Für etwas niedrigere Frequenzen, bis etwa 300 kHz, geht die Freqwunzmessung sehr gut über die ICP funktion.
Ausserdem wir ja so bei jedem Takt der Frequenz ein Interrupt ausgelöst und blockier so den Controller.
Kann mir da jemand ne grobe Programmierstuktur geben?
Wie muss ich das mit der Torzeit machen.
Mir ist klar wie das Funktionieren soll, kann es nur nicht programmierne...
Das habe ich mal Programmiert und der Zähler zählt auch die Überläufe am Timer0
Wenn mir jemand helfen könnte wäre ich sehr dankbarCode:volatile uint16_t overflow ; /*-- Hauptprogramm ---------------------------------------------------------------------*/ int main(void) { char buffer[10] ; count = 0 ; overflow = 0 ; // Variable für Overflow lcd_init() ; // LCD aktivieren // Timer0 auf Externen Clock Source T0 mit Rising Edge setzen --> S.86 TCCR0 |= (1<<CS02) | (1<<CS01) | (1<<CS00) ; // Overflow Interrupt Enable --> S.87 TIMSK |= (1<<TOIE0) ; sei() ; while(1) { utoa(overflow,buffer,10) ; set_cursor(0,1) ; lcd_string(buffer) ; } } /*-- Timer0 Overflow Interrupt ---------------------------------------------------------*/ SIGNAL (SIG_OVERFLOW0) { overflow++ ; }
Für die Torzeit muß man noch eine genaue Verzögerung Programmieren:
Ersr den externen timer zurücksetzen und starten, dann die genau definierte Zeit (z.B. 1 Sekunde) warten und danach den Timer Stoppen.
Für eine Möglichst genaue Wartezeit, sollte man dafür einen 2 ten Timer nehmen, denn die man sollte das schon bis auf ein paar Zyklen genau hinkriegen. Es ist möglich das sogar wirklich zykengenau hinzukriegen, allerdings nicht ganz einfach wenn man gerade am Ende eine Überlauf Interrupt dazukriegt. Wenn man sich nicht um diesen eher seltenen Fall kümmern will, sollte man zum Zählen besser den 16 Bit Zähler nehmen, dann tritt der Fehler eher selten auf.
Ich komm gerade irgendwie nicht weiter....
Wie bekomme ich den Timer dazu diese Genau definierte Zeit zu messen?
Lesezeichen