Hallo ,
ich habe den Drehzahlmesser aus einem Auto an einem Pic angeschlossen.
Mit einem Timerinterrupt gebe ich Impulse an einem Pin aus. Und mein
Problem ist das ich die Drehzahl als Zahl habe, und nicht weiß wie ich
das umrechnen muss um den Timer einzustellen. Also z.b alle 15ms ein
Puls entspricht ca.1000upm, alle 7.5ms ist ca. 2000upm. 3.25ms ~4000upm
usw. Ich dachte ich kann die Drehzahl einfach multiplizieren bzw.
dividieren aber musste feststellen das das nicht so einfach geht.
kann jemand helfen ? :-)
Gruß,
Michi
Ich habe leider keinerlei Erfahrungen mit PICs, aber die Einstellungen
der Timer beziehen sich immer auf die Taktfrequenz (auf was sonst?).
Also immer auf die Taktfrequenz bezogen umrechnen!
> Also z.b alle 15ms ein Puls entspricht ca.1000upm,> alle 7.5ms ist ca. 2000upm. 3.25ms ~4000upm
Sind das jetzt reale Zahlen oder sind das nur Beispiele.
Wenn nur Beispiele:
Programmiere den PIC, dass er dir eine bekannt Frequenz
ausgibt. Dann schau auf den Drehzahlmesser, was angezeigt
wird. Dasselbe machst du mit noch einer 2ten Frequenz.
Wenn du dann diese 4 Werte hast
f1 Umin1
f2 Umin2
dann kannst du durch diese 2 Koordinatenpunkte eine
Gerade legen und deren Koeffizienten ausrechnen.
Die Annahme lautet: Es gibt einen linearen Zusammenhang
zwischen Frequenz und Drehzahl
f = k * Umin + d
für 2 Wertepaare kennst du die konkreten Werte (die hast
du ja gemessen)
f1 = k * Umin1 + d
f2 = k * Umin2 + d
f1, f2, Umin1, Umin2 sind bekannt. k und d sind unbekannt.
Du hast aber 2 Gleichungen in 2 Unbekannte, und dieses System
lässt sich daher lösen.
Mit dann bekanntem k und d lässt sich dann für jede gewünschte
Drehzahl errechnen, welche Frequenz dafür notwendig ist.
Hallo,
Ist es so, dass du pro Umdrehung einen Puls erzeugen willst?
Dann musst Du wie folgt rechnen:
2000 upm = 2000/60 ups d.h. ca 33,33 Umdrehungen pro Sekunde
Davon den Kehrwert nehmen, also 1/33,33 rechnen, das gibt eine Dauer von
0,03 s, d.h. 30 ms.
Vielleicht habe ich das Problem auch nicht richtig verstanden...
Also,
bei der kleinsten zu messenden Drehzahl ist die Impuls xx (z.B. 100) ms
lang.
Die größte Drehzahl ergibt einen Impuls von 3,25 ms.
Du solltest eine Torzeit definieren, die möglichst viel Impulse
mitnimmt:
4MHz Takt / 4 = 1MHz Rechentakt (=0,001 ms). Dann sind bei Timer0 (8Bit)
bei einem Prescaler von 1:1 nach 256 Takten = 0,256ms schon der Timer
durch, Du hast aber noch keine Impulse gezählt.
Also nehmen wir den Prescaler 1:256. Dann sind nach 65,565 ms die
Torzeit um. Da hast Du sicher Probleme mit der unteren Drehzahl.
Das paßt also nicht !
Also nehmen wir den Timer 1, der hat 16 Bit und einen Prescaler von max.
1:8. Ergibt eine Torzeit von 524,288ms.
Damit zählst Du bei der kleinsten Drehzahl ca. 2-3 steigende Impulse und
bei der höchsten Drehzahl ca. 80 Impulse.
Du siehst, man wählt eine Torzeit, innerhalb der man die Impulse zählt
(in Timer0, den man über den externen Eingang als Counter schaltet).
Wenn dann der Timer1 überläuft ($FFFF auf $0000) wird ein Interrupt
erzeugt, der den Timer0 ausliest und für das Hauptprogramm sichert.
Anschließend TMR0 löscht.
Das Hauptprogramm macht das bischen Mathematik (Dreisatz) und gibt die
Drehzahl aus.
Mit etwas mehr Mühe kann man auch CCP o.ä. finden, wo die Hardware des
PICs beim Timerüberlauf den gezählten Stand automatisch sichert. Man
kann auch den Timer nicht nur überlaufen lassen, sondern eine feste
Torzeit von z.B. 0,5 Sekunden einstellen, so daß der Timer bei Erreichen
eines festen Wertes neu startet (CCP).
Es geht viel. Welche Hardware ist vorhanden ?
>Sind das jetzt reale Zahlen
Also hier sind mal paar reale Zahlen. Benutze den Timer1, 16bit,
Prescaler 1:8, bei 48Mhz. Ist nen 18f4550. Ganz hinten stehen die
ungefähren werte die ich in the Timer1 laden muss um die entsprechende
Drehzahl anzuzeigen.
10000upm = 333,33 imp/sec. = 3ms ~ eeb0h
7500upm = 250 imp/sec = 4ms ~ e800h
5000upm = 166,66 imp/sec = 6ms ~ da00h
2500upm = 83,33 imp/sec = 12ms ~ b200h
1250upm = 41,66 imp/sec = 24ms ~ 6000h
Falls es jemanden intressiert...Drehzahlmesser messen die Anzahl der
Zündimpulse pro zeit. Geht mann jetz von einem 4 Zylinder aus, 4 Takter
natürlich so zündet dieser 2 mal pro Umdrehung. Bei einer Drehzahl von
5000upm also 10.000 mal pro minute , oder halt 166,66 mal pro sekunde.
@ Michi:
> Geht mann jetz von einem 4 Zylinder aus, 4 Takter> natürlich so zündet dieser 2 mal pro Umdrehung.
Pro Umdrehung hat doch nur einer der vier Zylinder seinen Arbeitstakt
(=Zündung), oder? D.h. pro Umdrehung gibts eine Zündung, oder hab ich
in Physik doch nicht genug aufgepasst? ;-)
beim 4-Takter findet alle 720° ein Arbeitstakt statt. Somit zündet die
Zündkerze des Zylinders nur alle 2 Kurbelwellenumdrehungen. Bei vier
Zylinder findet im Abstand von 180° ein Arbeitstakt statt.
Beim 2Takter zündet die Zündkerze jede Kurbelwellenumdrehung.
Also ich kann die Drehzahl jetz in "Timerzählerstand" umrechnen aber nur
mit nem Taschenrechner , wie ich das in Asm machen soll ist mir noch nen
Rätsel.
Also ein cycle dauer bei 48Mhz 0,00008333ms .Bei einem Prescaler von 1:8
dauert ein weiterzählen vom Timer 0,00066666ms. Bei einer Drehzahl von
7500upm, müssen die Impulse alle 4ms kommen. Also rechne ich
1/(7500*2/60) = 0,004sec = 4ms
4ms/0,00066666ms = 6000 (1770h)
Der Wert bei 7500upm für einen 16bit Timer der runterzählt ist also
1770h.
Weiter komm ich nicht :-( jedenfalls nicht ohne Taschenrechner.
Passt schon. Also ich konnte die Formel auf 45000000/upm verkürzen. Nur
kann ich das immer noch nicht in ASM ausrechnen. Kleinste drehzahl die
ich messen kann sind dann 687upm, alles drunter wird als 0 upm
behandelt, das reicht mir.
Ja 48 Mhz. Na und, lass ihn doch Däumchen drehen. Mein Auto hat auch
mehr Leistung als üblich bzw. notwendig wäre ;-)