Anbei eine Schaltung und ein Programm für einen einfachen
Drehzahlmesser. Das Programm wurde unter AVR-Studio 4.18 entwickelt. Zum
Einrichten eines eigenen Projektes reicht die angehängte .c-Datei sowie
die Einstellungen F_CPU = 2000000 sowie CPU = ATmega88. Die 'fuses'
werden für max. ext. Quarz gewählt und BOD auf 4,3V gesetzt.
Die Schaltung ist einfach: sie besteht aus einem ATmega88, einer
LC-Anzeige 2x16 und wenigen passiven Bauteilen besteht.
Das Programm ist einfach: eine einzige .c-Datei, die mit den
Grundeinstellungen des AVR-Studio übersetzt wird.
Das Programm:
Gemessen wird im Grunde die Eingangsfrequenz; angezeigt werden Drehzahl
("D") und Zeit_pro_Umdrehung ("T") als 6-stellige Werte (gerundet). Die
Berechnungen werden mit den 'float'-Routinen des AVR-GCC durchgeführt;
das Programm benötigt ca. 5,4KB Programmspeicher.
Gemessen wird lückenlos - jede Sekunde ein neuer Wert bei 60 rpm - und
angezeigt werden maximal drei Ergebnisse/s; eine LED signalisiert eine
fertige Messung.
Zur Schaltung:
Der Prozessor ist mit der Anzeige gemäß Schaltbild verdrahtet; die
Pinbelegung ist 'historisch' gewachsen (beruht auf einem abgemagerten
Frequenzzähler).
Das Eingangssignal wird über den analogen Komparator dem ICP des Timer1
zugeführt. Das hat den Vorteil, dass die Eingangsbeschaltung variabel
ausgelegt und bei Bedarf die Eingangsempfindlichkeit auf einige 10mV
erhöht werden kann. So lassen sich z.B. R4 und C3 als Widerstände 2M2
bestücken und D1 gegen einen Kondensator 100nF austauschen, wenn sehr
kleine Drehzahlen nicht erwartet werden.
An anderer Stelle befindet sich noch ein Vorschlag für eine
Eingangsstufe, mit denen man auch unsaubere Eingangssignale für die
Drehzahlmessung aufbereiten kann.
Beitrag "Eingangsstufe für Frequenzzähler DC-50MHz, +5V"
Lukas schrieb:> gibst du damit nicht auf beiden Zeilen das selbe aus?
Sieh Dir bitte weiter oben an:
"void zeige_x(float x,char zeige_periode)"
Bei 'zeige_x(frequenz,0)' wird die Drehzahl (ursprünglich die Frequenz)
und anderfalls die Periodendauer angezeigt.
Das obige Foto entstand bei ca. 1,2kHz Eingangsfrequenz; einmal x*60
skaliert und in der 2. Zeile mit 1/x.
Vielleicht ist es niemandem aufgefallen und es wird äußerst selten zu
'unsauberer' Auswertung führen, aber nachfolgender Programmabschnitt
sollte vor einem T1OV-Interrupt geschützt werden. 'mess_dauer' kann
sonst falsch gelesen oder gelöscht werden.
Die Sperre für TOIE1 habe ich hier ergänzt:
TIMSK1 &= ~(1<<TOIE1); // t1OV interrupt sperren
if(mess_status==MESSEN && mess_dauer >= MESSZEIT) {
mess_status=AUSLESEN; // Auswertung starten
mess_dauer = 0; // wieder Messzeit abwarten
}
TIMSK1 |= (1<<TOIE1); // t1OV interrupt freigeben
Als Hallsensor sollte ein TLE4905 direkt anschließbar sein. R4 ist der
Pullup für den OC-Ausgang.
Bei einem Reedkontakt würde ich in Reihe zum Kontakt 1k legen und C3
soweit vergrößeren, dass bei max. Schaltfolge die Signalamplitude an
AIN0 maximal 1,5V unter- und minimal 3,5V überschreitet. Als
experimentellen Startwert würde ich mit 10nF beginnen, was grob einer
Eingangsfrequenz von 10kHz entsprechen würde. Das Tastverhältnis ist
aber zu berücksichtigen.
Der 1k Widerstand schützt den Reedkontakt vor zu großen Entladeströmen.
Wenn kein Schmutz auftreten kann, kann man auch mit Reflexkopplern
arbeiten. Ein bißchen Alufolie auf dem Drehteil erzeugt kaum Unwucht.
Jetzt habe ich noch eine Frage:
wie bekomme ich das ganze auf den ATMEGA644 portiert? Theoretisch müsste
ich doch nichts am Code verändern. Das Signal wir in PD6 gespeist, oder?
Ich würde nämlich gerne das ganze auf dem Webserver von Ulrich Radig
laufen lassen
Das Programm zu portieren sollte kein Problem sein. ICP als Eingang ist
auch in Ordnung.
Was den Webserver angeht: den kenne ich nicht. Dazu muß man wissen,
welche Timer, I/O und Interrupts dort verwendet werden und ob dies mit
der Drehzahlmessung kollidiert.
Für ein Einzelstück würde ich der Drehzahlmessung einen eigenen
Prozessor spendieren und die Meßwerte per UART an den Webserver
übertragen. Da stören sich die Programme nicht und man ist auf der
sicheren Seite.
Hallo Leute.
Ich komme hier wirklich nicht weiter und nach langem Überlegen habe mich
doch entschlossen kein Internet Forschung mehr in diesem Fall zu
betreiben.
Vielleicht hilft mir hier jemand der "sich besser auskennt".
Ich versuche die möglichst Übersichtig mein Problem zu erklären :
Ich versuche seit tagen die Messung an ein ATmega8 und mein Display
anzupassen und habe bis jetzt folgendes geändert:
-TMSK1 in TMSK unbenannt - da an ATmega 8- so steht bei Atmel
-lcd_routines.c mit meiner LCD Konfiguration eingebunden - die sind ok.
- im Code folgendes unbenannt:
--int_lcd in lcd_init von lcd_routnes
--lcd_f_str in lcd_string von lcd_routines.
An der Schaltung hängt ein Lüfter- das Schwarze Tachokabel an PD6 (
(AIN0) .Ich bekomme jetzt nur D: und T: auf dem Display angezeigt. Keine
000 keine ??? - überhaupt kein Wert,
Ich gehe davon aus dass noch was in der LCD Einbindung verändert werden
muss.
Das Programm lässt sich fehlerfrei und Warnungsfrei kompilieren.
Kann mir da bitte jemand bei der Einbuindung von lcd_routines ein Tipp
geben ?
>-lcd_routines.c mit meiner LCD Konfiguration eingebunden - die sind ok.
Beweise? Quellcode?
Du hast lcd_zeichen vergessen.
Wird aber alles nicht ändern.
Wenn ich den Code beim überfliegen richtig verstanden habe
erscheinen erst dann zahlen auf dem display wenn die
Messung erfolgreich war (genauer gesagt nach der 2).
Da aber D: und T: bei dir angezeit wird vermute ich mal
das entweder
- Kein Brauchbares signal ankommt
oder
- Die Ansteuerung des Timers beim M8 nicht komatibel zum m88 ist
> An der Schaltung hängt ein Lüfter- das Schwarze Tachokabel
Ich würd eher sagen Gelb....
Wenn "D: " und "T: " angezeigt werden, funktioniert die LCD-Ansteuerung.
Wenn ein Signal anliegt, muß die LED bei jeder fertigen Messung 0,1s
aufleuchten. Falls das nicht passiert, ist das Signal nicht erkannt
worden.
Kontrolliere bitte, ob die T1-Interrupts überhaupt arbeiten. Zunächst
muß der OVF-Interrupt funktionieren: LED in der Routine blinken lassen.
Als Nächstes die LED in der CAPT-Routine blinken lassen.
Wenn beide Interrupts funktionieren, müßte auch die Anzeige der
Messwerte klappen.
Noch etwas: ist SEI() wirksam, oder ist irgendwo ein CLI() vorhanden,
was alle Interrupts wieder sperrt?
Jan schrieb:> An der Schaltung hängt ein Lüfter- das Schwarze Tachokabel an PD6 (> (AIN0)
Kontrolliere mit einer LED, ob hier überhaupt Impulse vorhanden sind.
m.n. schrieb:> Vielleicht ist es niemandem aufgefallen und es wird äußerst selten zu> 'unsauberer' Auswertung führen, aber nachfolgender Programmabschnitt> sollte vor einem T1OV-Interrupt geschützt werden. 'mess_dauer' kann> sonst falsch gelesen oder gelöscht werden.> Die Sperre für TOIE1 habe ich hier ergänzt:>> TIMSK1 &= ~(1<<TOIE1); // t1OV interrupt sperren> if(mess_status==MESSEN && mess_dauer >= MESSZEIT) {> mess_status=AUSLESEN; // Auswertung starten> mess_dauer = 0; // wieder Messzeit abwarten> }> TIMSK1 |= (1<<TOIE1); // t1OV interrupt freigeben
Wenn ich das richtig verstanden habe muss es dann so wie angehängt
aussehen.
Gruß Andreas
Oh, ich sag mal nur, dass ich suchen mußte, um Deine Änderung zu finden.
Damit niemand die schlechte Kopie verwendet, hänge ich die letzte
Version am besten an.
Hallo Leute,
da ich mal auf die Schnelle einen Drehzahlmesser brauchte, habe ich mal
fix ein 1-seitiges Layout gemacht. Nix schönes und ohne ISP. Das LCD
passt direkt oben drauf. Vielleicht kann es ja jemand brauchen.
Die Beleuchtung des LCD ist nicht vorgesehen, da ich es für
Batteriebetrieb vorgesehen hatte.
Gruß
Stephan
Tommy Tomatronic schrieb:> kann man die hex file in bascom zurückwandeln?>> hätte da einige änderungen. :)
Sieh es als Zeichen, dass es an der Zeit ist, eine vernünftige
Programmiersprache zu lernen.
Eine neue Programmversion mit automatischen Abgleich auf ein
1Hz-Referenzsignal - am besten von einem GPS-Empfänger - ist fertig.
Damit kann man den oben gezeigten Aufbau von Stephan Henning recht
einfach abgleichen. Eine kurze Beschreibung dazu sowie .c-Quellcode und
.hex-Datei sind hier zu finden.
http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp3
m.n. schrieb:> Eine neue Programmversion mit automatischen Abgleich auf ein> 1Hz-Referenzsignal - am besten von einem GPS-Empfänger - ist fertig.>> Damit kann man den oben gezeigten Aufbau von Stephan Henning recht> einfach abgleichen. Eine kurze Beschreibung dazu sowie .c-Quellcode und> .hex-Datei sind hier zu finden.> http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp3
theoretisch schon. Praktisch schwierig.
Ich habe die Eingangsbeschaltung nicht veröffentlicht.
Als Eingang habe ich die vom Sprut veröffentlichte genommen.
Fototranse mit OPV (Modellbaudrehzahlmesser)
Nein die ist nicht auf dem Bild zu sehen. das war was anderes,
was ich da vorn dran hatte.
Gruß
Stephan
funktioniert übrigens gut. Nur die Anzeige ist mir etwas zu hektisch
und macht zu größe Sprünge, was sich aber auf Grund des Prinzips
nicht viel ändern lassen wird. Möglich wäre eine gleitende
Mittelwertbildung zB. Wert neu = Wert alt *3 / Wert neu. Was allerdings
unweigerlich zu einer deutlich trägeren Anzeige führen würde, wenn sich
Wert alt und wert neu langsam annähern.
Es ist eben nichts perfekt. So wie wir Menschen. :-)
Stephan Henning schrieb:> m.n. schrieb:>> Eine neue Programmversion mit automatischen Abgleich auf ein>> 1Hz-Referenzsignal - am besten von einem GPS-Empfänger - ist fertig.>>>> Damit kann man den oben gezeigten Aufbau von Stephan Henning recht>> einfach abgleichen. Eine kurze Beschreibung dazu sowie .c-Quellcode und>> .hex-Datei sind hier zu finden.>> http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp3>> theoretisch schon. Praktisch schwierig.
Ich weiß jetzt nicht, worauf sich das "schwierig" bezieht.
Den 'Fangbereich' für den auto. Abgleich habe ich von +/-100ppm auf
+/-1000ppm erweitert, obwohl die nun mögliche Toleranz für mich schon
grenzwertig ist.
Unter Umständen sollte C3 bei einem GPS-Signal unbestückt sein oder R4
verkleinert werden, falls der 1pps-Impuls nur 1µs lang ist.
Stephan Henning schrieb:> theoretisch schon. Praktisch schwierig.m.n. schrieb:> Ich weiß jetzt nicht, worauf sich das "schwierig" bezieht.
Hallo Michael,
das bezog sich lediglich auf die Eingansbeschaltung welche ich nicht
dargestellt hatte. Das optische Eingansteil vom Sprut.
Welche für den Abgleichzweck aber völlig uninteresant ist.
Sorry, hatte einen Knoten im Hirn.
Außerdem sind ja in der BRD Datei keine Werte enthalten.
Es ging ja bei dem Post lediglich um die mögliche Nutzung des Layouts,
da ich es ja eh machen musste.
Bleib ganz ruhig, alles gut.
Gruß
Stephan
Stephan Henning schrieb:> Bleib ganz ruhig, alles gut.
Na ja, dass die Istfrequenz von Quarzen in manchen Fällen zu stark
streut, ist mir schon zu Ohren gekommen. Deshalb wollte ich ein bißchen
mehr Nachbausicherheit einbringen.
Ferner ist mir bei der Anpassung eines Frequenzzähler-Programms auf
einen Arduino UNO R3, eine Abweicheng des 16MHz Quarzes von >500ppm
aufgefallen. Das ist schon heftig und wohl die Folge von "Geiz ist ...".
Michael,
ich denke Du machst Dir zu viele unnötige Sorgen. Wenn es hier deutliche
Probleme geben würde, hättest Du schon was davon gelesen, bzw. über
Deine eigene Homepage ein Feedback bekommen. Dein(e) Schaltung /Programm
erhebt ja auch nicht den Status eines Präzisionsmessers.
Das wird erst interessant wenn sich der Peter Danneger melet.
Also bleib entspannt.
Ein Arduino UNO R3 kann ja wohl nicht das Maß der Dinge sein.
Ist das Ding überhaupt Echtzeifähig ?
Kann doch bei USB Interface eigentlich nicht sein, denke ich.
Ich habe keines.
Gruß
Stephan
Hallo alle
Ich habe die Drehzahl-Schaltung gebaut (mit externem 20MHz Quarz). Ich
verwende am Eingang einen wie im thread besprochenen Hallsensor Typ
TLE4905. Der Prozessor erkennt die Impulse (Led), die ich mit einem
Magneten am Sensor gebe.
Jedoch scheint die angezeigte Frequenz und damit auch die Zeit nicht zu
stimmen. Es zeigt mit eine deutlich zu hohe Drehzahl an, wenn ich z.B.
im Sekundentakt den Hallsensor ansteuere.
Ich vermute, dass meine Prozessor-Clock nicht stimmt. Ich habe den
Atmega88 mit folgenden Fuses programmiert:
Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 258 CK/14 CK +
65ms; (CKSEL0110 SUT=01)
Brown-out detection level at VCC=4.3V
ergibt:
Low: 0x56; High: 0xDC; Extended: 0xF9
Laurin E. schrieb:> Es zeigt mit eine deutlich zu hohe Drehzahl an, wenn ich z.B.> im Sekundentakt den Hallsensor ansteuere.
Welcher Wert wird angezeigt und ist er stabil?
Das hatte ich schon vermutet. Mit der letzten Version wäre das Problem
nicht entstanden.
m.n. schrieb:> Eine neue Programmversion mit automatischen Abgleich auf ein> 1Hz-Referenzsignal - am besten von einem GPS-Empfänger - ist fertig.>> Damit kann man den oben gezeigten Aufbau von Stephan Henning recht> einfach abgleichen. Eine kurze Beschreibung dazu sowie .c-Quellcode und> .hex-Datei sind hier zu finden.> http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp3
In der 1. Zeile von main() steht dort:
CLKPR = 0x80; CLKPR = 0x0;
Damit wird der interne Vorteiler immer auf 1 gestellt.