Hallo, ein Kollege von mir fährt einen Ford Fiesta und hatte mir erzählt das er ein Tachosignal (digital) per Hallgeber an seinem analogen Tacho anliegen hat, dies aber nicht genutzt wird. Pro Umdrehung der Welle (dessen Name ich vergessen hab) löst der Hallgeber ein Signal aus. Also lag der Gedanke nah einen Tacho mit einem Atmega16 zu bauen der dieses Signal auswertet. Hab ich auch gemacht und zuerst die Anzahl der Signale in einer gewissen Zeitspanne gemessen. Hab die Zeit so gelegt das bei 60 km/h auch 60 Umdrehungen erreicht werden. Die Zeit betrug dann aber so um die 700 ms, was mir bissl zu lang war da ich schon die Geschwindigkeit ordentlich hochrasseln sehen wollte :))) Also hab ich versucht die Zeit einer Umdrehung zu messen um dann auf die Geschwindigkeit zu schliessen. Und jetzt (endlich) zu meinem Problem: Bei konstanter Geschwindigkeit (erzeugt durch eine Bohrmaschine am Hallgeber) bekomme ich immer unterschiedliche Zeiten raus, so zwischen 60-110 ns. Ist das normal das der Hallgeber da so abweicht oder liegts an der Bohrmaschine? Kann man das durch eine Mittelwertsfunktion ausfiltern? Oder seht ihr da gar keine Zukunft? Vielen Dank schonmal im Vorraus Mfg Nick
60ns => 16MHz => 10^9 U/min ... geile Bohrmaschine
Ja, kann sein das die Einheit jetzt aus dem Kopf gesagt net richtig war...weiss nur das auf dem lcd immer werte zwischen 60 und 110 angezeigt wurden und ich mich wunderte...
:-D wie erfaßt du diese Zeiten? Capture Pin? hast du ein Oszi mit dem mal dein Eingangssignal überprüfen kannst? ich denke aber nicht, daß die Drehzal der Bohrmaschine um fast 100% schwankt - das würde man dann sicher auch hören...
Also ich schliess es an den Pin wo man Zählen lassen kann und schalt den Modus auf "bei aufsteigender Flanke zählen".Bei der ersten aufsteigenden Flanke lass ich dann einen Timer starten und bei der nächsten aufsteigenden lass ich ihn wieder stoppen. Hab den Hallgeber mal an ein Oszi angeschlossen, aber auch nicht die grosse Ahnung wie man so ein Oszi bedient. Auf jeden Fall sahen die Ausschläge sehr gleichbleibend aus...
wie schnell läuft der Zähler... wenn der zu schnell ist, dann hast du
den uU überfahren und misst Mist...
und bisschen mehr Info (z.B. Takt des ATmega) und Code wären sicher
hilfreich...
>Auf jeden Fall sahen die Ausschläge sehr gleichbleibend aus...
du meinst, daß die Frequenz (also die Zeit zwischen den Impulsen)
halbwegs stabil ist...
@Sebastian Nickel Schau dir mal diese Seite an, dort hat einer genau das umgesetzt..... http://www.do2sha.de/Basteln_Tacho.html Gruß, Sepp
Also ob der Zähler überläuft hab ich getestet und es war bei kleinen eingestellten Zählfrequenzen der fall (also alle wieviel Takte der uU den Wert des Timers erhöht). Hab ihn dann auf alle 1024 Takte um eins hochzählen gestellt. Der Zähler läuft dann nicht mehr über. Zum Takt kann ich nur sagen das ich einen externen 16Mhz Quarz benutze. Hab das auch getestet und bin auf den internen Oszillator umgesteigen, dort haben sich aber auch die Abweichungen ergeben. Und ja ich meinte das die Zeit zwischen den Impulsen sehr konstant aus sieht beim Osziloskop...Code kann ich erst heut Nachmittag liefern...
Also bei meinem Fiesta 1.1l Bj 95 gabs kein Geschwindigkeitssignal am Tacho aber dafür sitzt am Getriebe direkt nen Geschwindigkeitsgeber an dem Mann das Signal abgreifen kann. Allerdings hab ich mir leider nie Signalform näher angesehen, da mein Navi das Signal vom Geber ohne Mucken akzeptiert hat.
[OT]
>an dem Mann das Signal abgreifen kann.
Dürfen Frauen sowas nicht machen?
[/OT]
Wie wäre es, mal einen Schaltplan und die Software hier zu posten?
Irgendwie "riecht" das hier schon wieder nach der
"Kristallkugel-Jonglier- und Bowling-Meisterschaft"...
@Sepp Klötengong Naja er hat das fast umgesetzt...Er hat den kompletten Tacho und damit die Logik schon bei Ebay gekauft und sich einen eigenen Tachogeber gebaut. Ich will die Logik (das heisst uU mit LCD Dislpay) ja selber bauen und ich habe bereits am Fiesta einen Tachogeber eingebaut der wohl von den Impulsen pro Drehung auch ausreichend ist. ACH JA, was ich noch sagen wollte: Erhöht man auf der Bohrmaschine die Drezahl und damit die Geschwindigkeit des Tachos so werden die Zeitabstände des Hallgebers kleiner!!! Weiss nicht ob das wichtig ist...
>Erhöht man auf der Bohrmaschine die Drezahl und damit die >Geschwindigkeit des Tachos so werden die Zeitabstände des Hallgebers >kleiner!!! Weiss nicht ob das wichtig ist... Das ist nicht wichtig, sondern logisch.
Also das Baujahr des Fiesta des Kollegen ist Juni 1996...falls das irgendjemandem hilft...
@ Raul, der Trollige Warum ist das logisch? Ich meinte mit Zeitabständen nicht die Zeit die pro Umdrehung vergeht sondern die Zeitdifferenzen die manchmal auftreten (die 60-110 die ich vorher geschrieben hatte)...
Ich bin grad dabei, mir nen kompletten Bordvomputer mit nem Mega16 für nen Escort Bj. 94 zu bauen. Ist schon ziemlich fertig. (Geschwindigkeit, Drehzahl,Spritverbrauch, Bordspannung....). Ich hab zur Geschwindigkeitsmessung auch den Hallgeber an der Tachowelle am Motorblock verwendet. Der Pegel wechselt alle 10cm (10cm low-10cm high; Habe die Impulse über eine Strecke von 300km gezählt) Hatte das gleiche Problem mit den Schwankungen. Daher messe ich die Dauer von 10 Impulsen (über 50kmh dann 20). Klappt ganz gut. Genauigkeit ist ca. 1km/h. Wenn du Fragen hast, dann kann ich dir per Mail weitere Infos geben.
>Also das Baujahr des Fiesta des Kollegen ist Juni 1996...falls das >irgendjemandem hilft... Schon wieder völlig sinnlose Informationen. Kannst du rechnen?
@T_Fleckenstein Das klingt ja gut was du da machst...Das mit den 10 Impulsen werde ich mal probieren und mal schauen ob dort die Zeiten konstant bleiben. Das mit den 10cm high und 10cm low versteh ich zwar noch net ganz aber naja...Das Signal für die Drehzahl, wo nimmst du das ab? Vielen Dank erstmal für die vielen Infos...
Zu den 10cm: Du benötigst doch einen Umrechnungsfaktor um die Zeitdauer von z.B. 10 Impulsen in eine Geschwindigkeit umzurechnen. Alternative wäre eine Ermittlung des Faktors über den Analogtacho. Davon würde ich aber abraten, da mein Analogtacho bei 100km/h knapp 10% Abweichung besitzt (laut meinem Bordcomputer UND einem Tachotest vom ADAC) Die Drehzahl wird ich über das Drehzahlsignal vom Motorsteuergerät (EEC IV glaub ich)ermittelt. In welcher Programmiersprache schreibst du? Wie sind deine Kenntnisse?
Hab diesen Faktor wie du schon gesagt hast über einen Analog Tacho bei so 40km/h bis 60km/h ermittelt, weil ich dachte das die Abweichung bei diesen Geschwindigkeiten noch nicht so hoch ist. Mein Kollege hat aber andere Reifen auf dem Fiesta und dadurch ergab sich bei einer Messung des ADAC das sein Analog Tacho jetzt ganz genau geht...So wie ich mir das vorstelle sind die 10 cm der Weg den die Welle innerhalb der 10 Impulse zurücklegt, oder? Und du kommst dann einfach mit v= s/t zum Ergebnis? Ich schreibe in Assembler. Hab durchs Studium relativ viel mit Assembler für die 368 gemacht, bin aber in Avr Assembler und der damit verbundenen Risc Struktur erst Anfänger...
Der Tacho wird pro Rad-Umdrehung eine gewisse Anzahl Impulse abgeben. Je nach Reifendurchmesser ergibt sich dann für diese Anzahl eine unterschiedliche Strecke (s = pi*Raddurchmesser). Je nach Menge der Impulse, die in einer gewissen Zeit auflaufen, kann man so also auf die Geschwindigkeit schliessen. Umgekehrt gilt: Je kürzer die Zeit zwischen den Impulsen ist, umso schneller bewegt sich das Rad um seinen Drehpunkt. Ich vermute ja immer noch einen Fehler in deiner Software.
Also da ich denke das es wirklich ein Fehler in meiner Software sein könnte poste ich den Hauptquelltext mal hier rein: ; Programm misst die Zeit einer Umdrehung eines Hallgebers ; benutzt 16-Bit Timer als Timer .DEF akku = r16 .DEF temp3 = r17 ;zeigt an ob Flanke die Start- oder End-Flanke ist .DEF ZeitLow = r24 .DEF ZeitHigh = r25 .DEF Flag = r19 ;zeigt an ob Timer1 überläuft .INCLUDE "m16def.inc" rjmp start .ORG OVF0addr rjmp Timer0Int ;Springe zu Timer0 Interrupt .ORG OVF1addr rjmp Timer1_ueberlauf ;Springe zu Timer1 Interupt .ORG $2A ;Hauptprogramm start: ldi akku,LOW(RAMEND) ;Stack Pointer setzen out SPL,akku ldi akku,HIGH(RAMEND) out SPH,akku ser akku out DDRD,akku ;PORTD (LCD) ist Ausgang rcall lcd_init ;LCD initialisieren rcall lcd_clear ;LCD löschen ldi akku,'S' rcall lcd_data ; 'S' schreiben ldi akku,'T' rcall lcd_data ; 'T' schreiben ldi akku,'A' rcall lcd_data ; 'A' schreiben ldi akku,'R' rcall lcd_data ; 'R' schreiben ldi akku,'T' rcall lcd_data ; 'T' schreiben in akku,TIMSK ori akku,(1<<TOIE0) ;Timer0 (Zähler) Interupt enabled ori akku,(1<<TOIE1) ;Timer1 (Timer) Interupt enabled out TIMSK,akku ldi temp3,0b101 ;Systemtakt durch 1024 bei Timer1 (Timer) ;minimale Messzeit=64us out TCCR1B,temp3 ;schreiben nach Timer/Counter Controll Register ;ab jetzt läuft Timer ldi temp3,0b111 ;mit steigender Flanke zählen (Timer0) out TCCR0,temp3 ;schreiben ldi temp3,0 ;jetzt Start/Stop Flag laden ldi Flag,0 ;das Overflow Anzeige Flag belegen ldi akku,255 ;den aktuellen Zählwert auf Timer0 (Zähler) schreiben out TCNT0,akku sei ;Interupts global anschalten Schleife: rjmp Schleife ;und wiederholen ;sobald ein High Signal am Pin ankommt gehts in den Interupt Timer0Int: in akku,SREG ;SREG zwischen speichern push akku cpi temp3,0 ;Flag auf 0 vergleichen (ist erste Flanke?) breq Timer1_starten ;wenn 0 dann Timer starten ldi temp3,0 ;ansonsten Flag wieder auf 0 setzen (war zweite Flanke) cpi Flag,1 ;hat ein Ueberlauf stattgefunden breq ueberlauf_anzeigen ;wenn ja dann: anzeigen in ZeitHigh,TCNT1H ;jetzt den Zeitwert holen in ZeitLow,TCNT1L rcall lcd_clear ;Display löschen rcall ausdez16 ;Zahl auf LCD ausgeben rjmp Tachowarten ;kurze Zeit warten ueberlauf_anzeigen: rcall lcd_clear ;Display löschen ldi akku, 'O' rcall lcd_data ;an Display senden ldi akku, 'V' rcall lcd_data ldi akku, 'F' rcall lcd_data Tachowarten: rcall warte16 ;98 ms warten rcall warte16 rcall warte16 rcall warte16 rcall warte16 rcall warte16 rcall warte16 ;180 ms warten rcall warte16 rcall warte16 rcall warte16 rcall warte16 rcall warte16 rcall warte16 ;178 ms warten rcall warte16 rcall warte16 rcall warte16 rcall warte16 rcall warte16 rcall warte16 ;360 ms warten rcall warte16 rcall warte16 rcall warte16 rcall warte16 rcall warte16 ldi akku,255 ;den Timer0 (Zähler) wieder zurücksetzen out TCNT0,akku pop akku ;SREG wieder herstellen out SREG,akku reti ;wenn es beim Vergleich oben die erste Flanke war soll der Timer1 starten Timer1_starten: inc temp3 ;Start/Stop Flag auf 1 setzen ldi akku,255 out TCNT0,akku ;Timer0 (Zähler) wieder zurücksetzen clr ZeitHigh clr ZeitLow out TCNT1H,ZeitHigh out TCNT1L,ZeitLow ;Timer1 (Timer) wieder auf 0 setzen ldi Flag,0 ;Overflow Flag auf 0 setzen pop akku out SREG,akku reti ;wenn bei Timer1 (Timer) ein Überlauf geschieht dann Flag setzen Timer1_ueberlauf: ldi Flag,1 ;Flag auf 1 setzen reti .INCLUDE "..\Routines\lcd-routines.asm" .INCLUDE "..\Routines\ausdez16.asm" .INCLUDE "..\Routines\warte16.asm" .EXIT
Also ich bin mir sogar inzwischen sicher das es sich um einen Fehler in der Software handeln muss, da ich gestern nochmal probiert habe und niemals eine Zeit grösser als 240 gesehen habe was ja stark nach 8-Bit aussieht...Ich benutz ja aber einen 16-Bit Timer. Schreibe ich aber statt: in ZeitHigh,TCNT1H ;jetzt den Zeitwert holen in ZeitLow,TCNT1L die 2 neuen Zeilen: ldi ZeitHigh, HIGH(10345) ldi ZeitLow, LOW(10345) dann wird mir die 10345 auch auf dem LCD ausgegeben, woraus ich schliesse das meine ausdez16 Prozedur funktioniert... Kann den Fehler net finden...
Du solltest deinen Programmaufbau ändern. Du machst alles in der Interruproutine. Pausen in der Interruptroutine-->Das beißt sich. Grundsätzlich soll die Interruptroutine so kurz und knapp wie nur möglich sein.(Falls das Programm irgendwann mal mehr machen soll als nur diese eine Routine.) Mein Aufbau ist folgerndermaßen: Mein Timer läuft ohne Vorteile immer schön bis 40000 hoch. dann wird ein Interrupt ausgelöst. Damit habe ich alle 10msec einen Interrupt. 100 Interrupts ergben eine Sekunde.-->Uhr In der Interruptroutine für die Geschwindigkeitsmessung werden beim Start bzw. Ende (10 Messungen) die Timerwerte im SREG abgespeichert. Ist eine Messung fertig, wird ein Flag gesetzt. Dieses Flag wird in der Hauptschleife überprüft. Ist das Flag gesetzt, werden Startwert und Zielwert voneinander abgezogen, und du erhälst die Zeitdauer. Das Problem sind dann "nur" noch die Überläufe. Da brauchst du dann noch ein Überlaufflag, das bei einem Timerinterrupt gesetzt wird. Fand ein Überlauf statt, musst du deinen Wert nochmal von 40000 (Timerendwert) abziehen. (oder umgekehrt?) Wenn ich mal Zeit hab, kann ich dir mal n paar Programmzeilen zukommen lassen. Da müssen aber vorher noch n paar Kommentare rein, damit man den Code auch versteht. Habe auch in Assembler programmiert. Gruß T_Fleckenstein (at gmx punkt de)
Kann das sein, dass du deine Timerwerte in falscher Reihenfolge ausliest? Beim Lesen zuerst Low und beim Schreiben zuerst High. Beim Einlesen versuchst du zuerst den High wert zu holen
Find gut was du vorschlägst. Aber wo überprüfst du ob der Wert vom Hallgeber Pin sich geändert hat? So wie ich das bisher versteh hast du alle 10ms den Interrupt und prüfst in dieser Routine ob sich der Wert des Hallgebers (also high oder low) geändert hat? So ganz klar ist mir das noch nicht... Die Wartezeit in meinem Interrupt hab ich ja nur reingemacht damit ich was auf dem LCD lesen kann. Könnte natürlich auch im Interrupt die Werte ins SREG schreiben lassen und in der richtigen Hauptschleife immer wieder vom SREG lesen lassen und auf dem LCD ausgeben...Erstmal wieder vielen Dank für deine Hilfe. Aber wirklich komisch find ich langsam auch das ich einen 16-Bit Timer benutz und noch nie eine Zahl grösser 240 auf dem Display stand und sogar manchmal schon 0 bei niedriger Drehzahl der Bohrmaschine zu lesen war...Da stimmt auf jeden Fall was nicht. Wärs kein Hallgeber würd ich entprellen sagen...
Allerdings...Wusst nicht mehr das es da drauf ankommt, aber jetzt wo du das schreibst fällt mir auch wieder ein das so etwas in meinem AVR Buch stand...Werd es heut Nachmittag mal ändern und schauen was sich tut...Glaub da wär ich in 3 Jahren noch net drauf gekommen...
Also die Reihenfolge beim holen des Timerwertes hat das Problem das ich immer nur Werte unter 255 gesehen habe behoben. Ich hab ja einen alten analogen Tacho zum (mehr schlecht als recht) eichen. Wenn ich dort bei 60 km/h bin dann liegen meine Timerwerte grob zwischen 660 und 700, was einem Zeitwert zwischen 10,56 us und 11,2 us entspricht. Glaube das dürfte jetzt durch eine Mittelwertsfunktion auszugleichen sein. @T_Fleckenstein: Wäre trotzdem echt froh über einen Auszug deines Codes wegen der Programmstruktur. boehser_nick (at web punkt de)
Ich meinte in meinem vorherigen Beitrag natürlich 10,56 ms und 11,2 ms...
Ich fahre nen 94er Fiesta, mit Digifiz. Habe mir einfach einen eigenen Tachogeber gebaut, um entsprechend passende Werte zu bekommen. Bordcomputer mit Mega16/32 läft seit 6 Monaten, bisher aber noch immer weiter im Aufbau. Schaut rein, www.DO2SHA.de, für mehr Infos, einfach nochmal fragen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.