Forum: Mikrocontroller und Digitale Elektronik Geschwindigkeitsmessung Ford Fiesta mit Atmega16


von Sebastian N. (boehser_nick)


Lesenswert?

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

von vorbeigeschlendert (Gast)


Lesenswert?

60ns => 16MHz => 10^9 U/min ...
geile Bohrmaschine

von Sebastian N. (boehser_nick)


Lesenswert?

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...

von vorbeigeschlendert (Gast)


Lesenswert?

:-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...


von Sebastian N. (boehser_nick)


Lesenswert?

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...

von vorbeigeschlendert (Gast)


Lesenswert?

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...

von Sepp Klötengong (Gast)


Lesenswert?

@Sebastian Nickel

Schau dir mal diese Seite an, dort hat einer genau das umgesetzt.....


  http://www.do2sha.de/Basteln_Tacho.html



Gruß, Sepp

von Sebastian N. (boehser_nick)


Lesenswert?

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...

von Martin (Gast)


Lesenswert?

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.

von Rahul, der Trollige (Gast)


Lesenswert?

[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"...

von Sebastian N. (boehser_nick)


Lesenswert?

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

von Rahul, der Trollige (Gast)


Lesenswert?

>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.

von Sebastian N. (boehser_nick)


Lesenswert?

Also das Baujahr des Fiesta des Kollegen ist Juni 1996...falls das 
irgendjemandem hilft...

von Sebastian N. (boehser_nick)


Lesenswert?

@ 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)...

von T_Fleckenstein (Gast)


Lesenswert?

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.

von Rahul, der Trollige (Gast)


Lesenswert?

>Also das Baujahr des Fiesta des Kollegen ist Juni 1996...falls das
>irgendjemandem hilft...

Schon wieder völlig sinnlose Informationen.

Kannst du rechnen?

von Sebastian N. (boehser_nick)


Lesenswert?

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

von T_Fleckenstein (Gast)


Lesenswert?

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?

von Sebastian N. (boehser_nick)


Lesenswert?

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...

von Rahul, der Trollige (Gast)


Lesenswert?

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.

von Sebastian N. (boehser_nick)


Lesenswert?

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

von Sebastian N. (boehser_nick)


Lesenswert?

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...

von T_Fleckenstein (Gast)


Lesenswert?

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)

von T_Fleckenstein (Gast)


Lesenswert?

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

von Sebastian N. (boehser_nick)


Lesenswert?

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...

von Sebastian N. (boehser_nick)


Lesenswert?

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...

von Sebastian N. (boehser_nick)


Lesenswert?

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)

von Sebastian N. (boehser_nick)


Lesenswert?

Ich meinte in meinem vorherigen Beitrag natürlich 10,56 ms und 11,2 
ms...

von DJShadowman (Gast)


Lesenswert?

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