-
Nein 2 Takt Motoren Zünden pro Umdrehung einmal. Das heißt du musst 1:1 rechnen. Ein Impuls entspricht einer umdrehung.
Und zum Thema wo du das Zündsignal abnehmen sollst: Eine Vespa hat ne CDI Zündung und ein Pickup am Polrad. Das Kabel vom Pickup ist rot und geht bis zur CDI durch. Du kannst das Signal direkt dort abgreifen aber es muss noch geglättet werden, da der Pickup ein Induktivgeber ist. Das heißt es wird eine Spannung induziert die du in geeignete Form bringen musst für den ADC des Mikrocontrollers. Sollte aber kein Problem sein mit nem Tiefpass und einem begrenzenden widerstand.
-
Wenn ich meine Schaltung noch richtig weiss, hab ich mit nem Pullup die Kl. 1 auf 12V gezogen. Der Schalter zieht die dann regelmässig nach GND.
Dann da einfach nen NPN mit der Basis hin, Emitter auf Masse und Kollektor über nen Widerstand an 5V. Dann liegt am Kollektor das Schaltsignal in 0V/5V vor.
Zur Rechnung: immer gleich ist das nicht. Hängt von der Zylinderzahl sowie Taktanzahl ab.
Ein 2-Takt-Motor braucht jede Umdrehung einen Zündfunken. Da nur 1 Zylinder da ist, ist also die Anzahl der Zündpulse = Drehzahl.
Wenn du ne halbe Sekunde misst und dann die Umdrehungen pro Sekunden brauchst, ist der Faktor 120 (weil ja 120 halbe Sekunden in ne ganze Minute passen)
-
aaahso verstanden:-)
ok, passt, ich hätte noch eine frage:
ich habe begonnen den controller mit bascom zu programmieren, habe aber basic noch nie gemacht, in C wäre es mir lieber, aber ich krig das einfach nicht hin mit diesem makefile und dem ganzen shit...aber das ist jetzt egal, könntest du mir nicht ein codeschnipsel in bascom schicken, das zeigt wie man sie einen impuls "liest", also das zählen der impulse und so...
wäre sehr hilfreich!!
vielen dank!!
-Alexander
-
Wenn Du AVR Studio von Atmel kostenlos runterlädst, brauchst Du kein Makefile, und kannst in C arbeiten.
-
ok :-) ich lade gerade avr studio runter :-)
@jaecko: könntest du mir irgend ein codeschnipsel schicken für das zählen der impulse?
wäre sehr nett!
danke!!
-
Wenn Du ohnehin schon ein Polrad ( = Magnet ) hast, könntest Du die Drehzahl auch gleich mit einem Magnetsensor wie z.B. den TLE4905L abnehmen.
Der funktioniert auch mit 5V wie der Microcontroller und Du bist vom Zündstromkreis komplett galvanisch getrennt.
Du brauchst dir somit also über Überspannungen und Ausschwingeffekte keine Gedanken machen.
-
wenn das signal nicht prellt, kann man es einfach auf einen der beiden interrupteingänge des mega legen und bei jedm interrupt den zählerstand um eins erhöhen, da sollte man ein 16 bit register, wenn nicht sogar ein 24-bit register nehmen, kommt auf die max drehzahl an: bei 16bit maximal 65535 rpm; bei 24: 16777215 rpm, hmm scheint doch etwas viel^^; hab grad keine vorstellung,, wie schnell son teil dreht (bin leider zu jung um sowas zu fahren^^).
dann braucht man nen timer, der alle jede sekunde überläuft (Timer 1 im ctc modus glaub ich), der gibt dann den wert der rpm irgendwo aus und setzt den wert wieder auf 0, oder man lässt ihn alle halbe sekunde überlaufen und multiplizert die umdrehungszahl mit 2 und hat die rpm, dann sollte man wohl dicke mit nem 16-bit register auskommen^^
man könnte dann vielleicht noch ne rundung oder eine interpolation(?) über die zeit hinzufügen, damit der wert nicht so springt und man besser lesen kann.
mit uart oder lcd könnte das in assembler vielleicht maximal ne gute DinA4 seite sein, wenn man die ansteuerungsroutinen nicht dazurechnet.
in basic sollte das n fliegenschiss sein und in c auch nich sonderlich viel, da hat man allerdings auch wieder die ansteuerungsroutinen/libs für lcd bzw uart oder was man sonst haben will.
basic code könnte ich jez nich posten, weil ich in C progge (und gelegentlcih assembler), aber ich bin ja auch nich gefragt^^
Ele
-
Die Impuls Zählmethode mit fester Torzeit ist sicher die einfachste Möglichkeit einen Drehzahlmesser zu bauen.
Dabei gibts allerdings den Nachteil, das man nur Schritte mit 60U/min dabei hat.
Und auch nur dann, wenn man als Torzeit 1sek verwendet.
Bei 0,5sek und 1 Impuls pro Umdrehung sind es dann schon 120 U/min.
Ich bin da lieber für die Periodendauermessung.
Man lässt einen Timer mit Überlaufzähler frei laufen.
tritt ein Impuls auf wird der Zählerstand des vorherigen Impulses vom aktuellen Zählerstand abgezogen.
Verwendet man dazu unsigned Variablen ist auch der Überlauf des Zählers kein Problem.
Dieser Wert entspricht quasi der Periodendauer der Drehzahl und kann in diese Umgerechnet werden.
Diese Methode ist gerade bei niedrigen Drehzahlen sehr genau und man erhält bei jedem Impuls eine Aussage über die Drehzahl.
Ab einer bestimmten Drehzahl werden die ermittelten Zählerstände wiederum so klein, das die Impulszählmethode wieder genauer ist.
Bei meinem letzten Projekt lag diese Drehzahl bei 22000 U/min.
Und da wir auch ein kleiner 2 Takter nur schwer drüber kommen.
Ein Problem der Periodendauermessung möchte ich auch nicht verschweigen. Wenn die Drehzahl so niedrig ist, das der Zähler in einer Periodendauer überläuft, kommt es natürlich zu Fehlmessungen.
Das sollte man in der Soft berücksichtigen und abfangen.
Eine BASCOM Source kann ich Dir leider auch nicht anbieten, ich progge auch in "C".
Ausserdem hab ich die letzte gut funktionierende Drehzahlmeßroutine in Assembler geschrieben. Die geht aber auch bis 800000 U/min hoch.
-
also wenn ich jetzt den controller in C programmiere ist das kein problem :-) wäre auch mit einem schnipsel in C zufrieden ^^
würde mir sehr helfen, da ich leider nicht viel ahnung davon habe wie das ganze funktioniert^^
ich bn nicht recht fit mit microcontroller und muss mir erst mal diese ganzen timer und interrupt sachen anschauen^^
ich glaube ich mache es schon mit der periodendauermessung, da mein motor sicher nicht unter diesen bereich in der es fehler gibt mit der drehzahl kommt, und da er auch keine 22000 u/min macht ^^
würde mich sehr über einen beispielcode freuen :-)
vielen dank!!
-alexander
-
ALso den Drehzahlmesser hab ich damals auch in Bascom gemacht.
Der "Nachteil" mit der Auflösung war mir im Prinzip egal. Da es ja eigentlich keinen Unterschied macht, ob der Motor jetzt mit 3400 oder 3460 dreht.
Also mal ein Codeteil (Kann sein, dass irgendwo noch kleine Fehler sind, also ein = zuviel o.ä., aber seit Februar hab ich Bascom eigentlich nicht mehr verwendet)
Code:
' INT0 initialisieren
Config INT0 = Falling ' oder Rising; an sich egal
On INT0 ISR_Int0 ' Bei Auslösung: Springe nach ISR_Int0
Enable INT0 ' INT0 einschalten
Enable Interrupts ' Interrupts global freigeben
' Timer einstellen
Config Timer1 = ... je nach gewünschter Dauer...
On Timer1 ISR_Timer1
Enable Timer1
DIM Pulse as Word ' Zählvariable
DIM Drehzahl as Word
DO
'Main-Loop, irgendwas machen, z.B. Ausgaben etc
LOOP
ISR_Int0:
INCR Pulse ' Pulse um 1 erhöhen
Return
ISR_Timer1:
Drehzahl = Pulse * Faktor ' (Faktor je nach Motortakte/Zylinderzahl/Messzeit)
Pulse = 0
Return
So lassen sich schon mal die Pulse zählen. Jetzt nur noch nen Timer mit der gewünschten Zähllänge dazu, dort die Anzahl der Pulse auswerten und die Variable 'Pulse' wieder auf 0 setzen.