Hallo, Ich bastel an einem alten 2Takter (Vespa Pk50Xl Kat), der mittlerweile sehr hoch dreht, sich aber trotz guter Vergasereinstellung schlecht fährt. Vielleicht liegt das an der höheren Resonanzdrehzahl (irgendwo bei 10k, wird noch gemessen) wodurch die Zündkurve nicht mehr passt. Ich würds halt gern genau wissen und den Zündzeitpunkt verstellen können. Es ist eine Vespatronic verbaut, hab aber keinen Schaltplan zur CDI gefunden. Die CDI hat nur 2 Anschlüsse und zündet ohne Pickup 2x pro Umdrehung. Ab ca 4k upm geht die Vorzündung um 8° runter. Schaltungstechnisch hab ich eh schon ein bisschen gebastelt, zb: https://www.youtube.com/watch?v=0FbeTMbfEHU aber CDIs etc sind mir noch zu kompliziert, ich hoffe ich blicke da bald besser durch. Meine Idee für eine Zündwinkelverstellung für Zündungen mit Pickup wär, mittels Ladungspumpe am Pickup einen Kondensator mit Pulldown laden. Ein Levelmeter (zb LM3914) steuert einen NE555 für die Verzögerung. Je nach Drehzahl ist ein anderer Ausgang + Einstellpoti aktiv. Kann das so funktionieren, oder gibts da bessere Ansätzte? Lg, Nick
Nick S. schrieb: > Ich bastel an einem alten 2Takter (Vespa Pk50Xl Kat), der mittlerweile > sehr hoch dreht, sich aber trotz guter Vergasereinstellung schlecht > fährt. Vielleicht liegt das an der höheren Resonanzdrehzahl (irgendwo > bei 10k, wird noch gemessen) wodurch die Zündkurve nicht mehr passt. Ich würde da mal über einen Satz neue Wellendichtringe nachdenken!
Die resonanzdrehzahl wird bei 2taktern von den stezerzeiten vom Zylinder und dem Auspuff bestimmt. Hast du daran nichts geändert sollten sie noch dort sein wo sie waren.
Da wurde einiges gemacht, verschiedene Zylinder mit verschiedenen Steuerzeiten, Resobirne, siehe Youtube Kanal. Der Motor ist 100% dicht! Evtl geben die Membranplättchen bei den Drehzahlen auf, oder Verwirbelung, etc. Trotzdem wärs schön die Zündkurve nach belieben zu verändern, rein aus neugierde wie sich das Fahrverhalten ändert. lg
Also im Jahr 2015 würde ich nichtmehr mit analogem Kram rumkleckern. Man macht aus dem Signal von dem Pickup ein Rechteck (entweder via Komparator oder evtl. reicht schon der Schmitt-trigger am Eingang) und steuert dann den Zündwinkel in SW auf nem µC. Da kannst du dann für jede Umdrehung deinen Winkel individuell festlegen. Man könnte evtl. sogar eine automatische Optimierung nach Schema Klopfsensor anbringen (als "nicht-Bezin-Murkser" weiß ich nicht wie akut das bei nem 2 Takter is).
Die EFI schaut interessant aus, und die Überlegung mit MC hatte ich auch schon bzw noch... Eine Spannung zur Drehzahl generieren, die gemütlich mit einem Arduino Nano auslesen und aus einer Liste oder mit Funktionen die passende Verzögerung ausgeben...könnt mit bisschen Hilfe gehen. Nano hab ich da, DC Spannung ist auch am Bordnetz. Analoge Vorschläge sind natürlich weiterhin willkommen :) lg
Cool, dass heute auch noch an den Mopeds geschraubt wird. Wir hatten noch alles mechanisch gemacht. Auslass vergrößert und poliert ...
Nick S. schrieb: > Eine Spannung zur Drehzahl generieren, die gemütlich mit einem Arduino > Nano auslesen und aus einer Liste oder mit Funktionen die passende > Verzögerung ausgeben...könnt mit bisschen Hilfe gehen. Nano hab ich da, > DC Spannung ist auch am Bordnetz. Es ist nötig die Flanken des Signals auszuwerten, irgendwie musst du ja die genaue Position der Kurbelwelle kennen ...
Ich meine die Drehzahlberechnung soll er über den Ladezustand eines Kondensators abfragen, oder haut das mit den Interrupts besser hin? Positionsbestimmung über das wechselnde Feld an der Zündspulenwicklung (2x Zünden pro Umdrehung) oder Hallsensor. Die max Drehzahl liegt bei ca. 15k, mit Reserven sollte alles auf 20k ausgelegt sein. Kriegt das der Nano hin? Lg
Nick S. schrieb: > Positionsbestimmung über das wechselnde Feld an der Zündspulenwicklung > (2x Zünden pro Umdrehung) oder Hallsensor. Es ist ziemlich sinnlos die Drehzahl zweimal zu berechnen. Damit du einen Zündwinkel benutzen kannst musst du ohnehin die Position des Rotors zu jedem Zeitpunkt kennen. Daraus ergibt sich automatisch die Drehzahl. Nick S. schrieb: > Die max Drehzahl liegt bei ca. 15k, mit Reserven sollte alles auf 20k > ausgelegt sein. In den 50 µS die eine Umdrehung braucht macht der Arduino mit seinen 16 MHz 800 Takte. Das ist jetzt nicht überragend viel sollte aber bei schlauer Programmierung locker reichen. Je nach Design wirst du aber u.U. den Interrupt für die Zündung "von Hand" in Assembler machen müssen (Takte zählen). Man könnte aber evtl. auch einfach den Compare-Ausgang benutzen, hängt eben vom Design ab. Eines kann ich dir aber versichern: dieses sub-µs genaue Timing wirst du mit der arduino IDE nur schwer bis garnicht hinkriegen. gcc und C (ohne ++) sind hier deine Freunde, aber keine Angst, ist nicht viel komplizierter als arduino. Solltest du dich für den Weg via µC entscheiden kann ich dir auf jeden Fall mit der SW Unterstützung leisten.
Danke für das Angebot Max.D, aber da müsstest du mir schon gewaltig helfen, da ich von Arduino und C kaum Ahnung habe :) Am besten ich bau mal ein Modell, zb Lochscheibe auf einem DC Motor, Lichtschranken, und versuche die Drehzahl mit dem Arduino auszugeben. Grob überrissen: Der Interrupt reagiert auf die Flanke, dann Timer setzen, auf nächste Flanke warten, Drehzahl ausrechnen...mal schaun wie weit ich komm :) Lg!
Nick S. schrieb: > Der Interrupt reagiert auf die Flanke, dann Timer > setzen, auf nächste Flanke warten, Drehzahl ausrechnen... Also in diesem Speziellen Fall würde ich eher auf einen Timer-Capture hinarbeiten. Das funktioniert so: Der Timer läuft endlos im Kreis (ein Durchlauf muss länger als eine Umdrehung des Motors sein). Das Signal von dem Sensor kommt an den Capture Input. Wenn jetzt der Sensor auslöst, dann wird der aktuelle Timerwert in das Capture Register gespeichert und der Timer läuft unbeirrt weiter. Gleichzeitig wird für die CPU ein Interrupt ausgelöst. In diesem Interrupt liest du jetzt das Capture register ein und vergleichst es mit dem Wert vom letzten mal.Aus der Tick-zeit des timers und der anzahl der Ticks zwischen den zwei events bekommst du die zeit für eine Umdrehung und die Drehzahl ist einfach der Kehrwert. Dieses Verfharen hat den großen Vorteil, dass es schon für den Zündwinkel vorbereitet ist, den machst du nämlich indem du aus dem Inhalt des Capture-Registers und der gewünschten Verzögerung den Wert für ein Compare-Match register berechnest an desssen zugehörigen ausgang der Auslöser für die Zündung hängt.
GROßES FAIL von mir: Die 20k bei dir beziehen sich auf RPM, ich hab die aus Gewohnheit als Hz interpretiert facepalm Damit ist das Timing natürlich extrem entspannt ^^
Cool, so erklärt versteh ichs einigermaßen :) Das Rad/Lichtschranken-Modell ist aufgebaut, gibt mit NE555 ein sauberes Rechteck aus, und der Nano steckt auch schon daneben. Ich guck mal was sich zum Capture Input auf der Arduino HP finden lässt, evtl hat jemand ein Stück Code zum vertraut machen? Lg
Also dadurch, dass ich zu dumm war RPM als solche zu erkennen und damit 20k als Hz interpretiert habe hab ich hier etwas die Pferde scheu gemacht. So kann es sein, dass man den Timer garnicht weit genug runterskalieren kann um bei niedrigen RPM noch auf einen Umlauf zu kommen. Was ist denn die minimale Drehzahl bei der der Motor läuft (anders als ein elektrischer kann er ja nicht stehen) ? Ansonsten: Als avr-gcc Nutzer kann ich jetzt zu dem arduino-Teil der Sache weniger sagen, aber allgemein kann ich dir das Datenblatt des verwendeten µC (auf dem nano sitzt glaube ich ein ATmega328 drauf) ans Her(t)z legen. Die Atmel Blätter sind eigentlich recht sinnvoll strukturiert.
Leerlaufdrehzahl sind knapp 1k upm. Ich hab da schon drüber gelesen dass bei niedrigen Drehzahlen die Impulslänge, und bei hohen Drehzahlen die Zeit bis zum nächsten Impuls gemessen wird. Warum funktioniert das nicht mit längeren Zeiten mit dem Timer, kann mir das jemand erklären? Edit: Jedesmal wenn der Timer voll ist, soll er das in einer Liste vermerken, dann kann man am Ende einfach zusammenrechnen und hat die Zeit/Drehzahl. Geht das? Lg!
:
Bearbeitet durch User
Nick S. schrieb: > Warum funktioniert das nicht mit längeren Zeiten mit dem Timer, kann mir > das jemand erklären? > > Edit: Jedesmal wenn der Timer voll ist, soll er das in einer Liste > vermerken, dann kann man am Ende einfach zusammenrechnen und hat die > Zeit/Drehzahl. Geht das? Also erstmal wieso der Timer nicht unendlich langsam sein kann: Es gibt nur prescaler bis 1024. Damit bekommt der Timer alle 1024 Systemtakte einen Puls, bei 16 MHz sind dass dann 15625 Hz (~15,6 kHz). Zusammen mit dem maximalen wert des Timer (timer 1 hat 16-Bit) von 65536 ergibt sich damit eine maximale Umlaufzeit von ~4s. In deinem Fall also durch die Verwendung von Timer 1 lösbar. Mit Timer 0 oder 2 wären dass (8-Bit) 256 Ticks und damit min. ~60 Hz und damit mindestens 3600 RPM, also nicht direkt nutzbar. Deine Idee mit dem SW-Teiler ist gut, allerdings verlängert dieser Zähler natürlich die Zeit die im Interrupt verbracht wird und behindert damit (zumindest theoretisch, bei den ~300 Hz die der Motor maximal dreht ist es egal) die Einstellung der Zündung. Was du aber ohnehin machen müssen wirst ist den Prescaler nachzustellen wenn sich die Drehzahl massiv ändert. Weil wenn du den Scaler fest auf 1024 lässt (damit der Leerlauf gut efasst wird), dann hast du bei maximaler Drehzahl nurnoch ~50 Inkremente per umdrehung, das taugt nich wenn du den Winkel im Sub-Grad-Bereich justieren willst. Das klingt zwar jetzt hier kompliziert, läuft aber auf eine Handvoll if() im Code raus.
Wenn ich richtig gerechnet habe, dauert 1 Umdrehung bei Standgas (1kUpm) 60 Millisekunden, bei 20kUpm 3ms. Mit Timer1 Prescale 64 (4us pro Tick) hätte ich 750 Ticks bei 20kUpm. Nach 524,288ms ist der Timer voll, das entspricht ca 8 Umdrehungen bei Standgas? Oder gleich Prescale 8, 0,5us/Tick und max 65,536ms. Wenn der Timer voll wird, weiß ich dass knapp unter Leerlaufdrehzahl bin, dann soll der Arduino die Zündung auf Leerlaufeinstellung stellen und erst wieder mit dem Zählen weitermachen bis die neue Flanke vom Pickup kommt.? lg
:
Bearbeitet durch User
Nick S. schrieb: > Mit Timer1 Prescale 64 (4us pro Tick) hätte ich 750 Ticks bei 20kUpm. > > Nach 524,288ms ist der Timer voll, das entspricht ca 8 Umdrehungen bei > Standgas? Der Timer läuft bei 65536 über, also schon nach 260 ms. Wäre aber egal. Die Einstellbarkeit wäre dann in 0,5° Schritten, wenn dir das reicht, dann passt das. Nick S. schrieb: > Oder gleich Prescale 8, 0,5us/Tick und max 65,536ms. Wenn der Timer voll > wird, weiß ich dass knapp unter Leerlaufdrehzahl bin, dann soll der > Arduino die Zündung auf Leerlaufeinstellung stellen und erst wieder mit > dem Zählen weitermachen bis die neue Flanke vom Pickup kommt.? Gleicher Fehlschluss, Überlauf schon nach 32 ms. Was du aber sehr einfach machen kannst wäre, dass du bis ~2k RPM (evtl. mit Hysterese) mit 64 skalierst und danach, dann umschaltest. Quasi eine Gangschaltung für den Timer. Eine weitere Möglichkeit wäre noch den Quarz zu tauschen und mit 8 MHz Sys-Clock zu arbeiten, damit wäre mit prescale 8 eine Laufzeit von ~64 ms drinnen, also ideal für Leerlauf.
Jetzt bin ich ein bisschen verwirrt, dachte bei Prescale 8 ist der Timer erst nach 65,53ms voll: http://playground.arduino.cc/code/timer1 Aber es würden auch 32ms reichen. Timer voll heist dann Leerlaufvorzündung, ab ca 2kUpm kann man dann Vorzündung feineinstellen. Ansonsten würde mir 1/2 Grad Auflösung mit Prescale 64 genügen. Hauptsache einfach, sonst hab ich keinen Überblick mehr :) lg
Ich weiß ehrlichgesagt nicht wie der Arduino-Kerl zu diesen Werten kommt. Timer 1 hat 16 Bit und damit 2^16 = 65536 Schritte. Wie er in diesen 16 Bit jetzt 65536µs/0,5µs = 131072 Schritte speichern will ist mir schleierhaft. Vielleicht teilt er in der lib ja irgendwie nochmal die Interrupts runter, keine Ahnung.
Ok, dann Prescale 64, ist mir genau genug. Also ganz grob: Interrupt reagiert auf Pickup-Flanke -> Wenn Timer 0 oder größer erwarteter Leerlaufzeit: Motor dreht zu langsam -> CDI sofort zünden Sonst: Drehzahl ausrechnen, Vorzündung ausrechnen/setzen, Timer nullsetzen. Bei erreichen der gesetzten Zündzeit die CDI funken lassen. ?!
:
Bearbeitet durch User
Alles blödsinn, glaub mit Prescale64 wärs so besser: Pickup steht zb auf OT, Arduino startet, und wartet aufs erste Pickupsignal-> Timer auslesen, Drehzahl ausrechnen, Vorzündung ausrechnen und Flag? setzen, dann Timer auf 0 zurücksetzen. Bei erreichen der Flag zünden, warten bis Pickupsignal und das Spiel beginnt von vorn... Richtig?
:
Bearbeitet durch User
Nick S. schrieb: > Wenn Timer 0 oder größer erwarteter Leerlaufzeit: Motor dreht zu langsam > -> CDI sofort zünden Damit zerschießt du dir potentiell den Motor, auch wenn der Motor zu langsam läuft musst du ihn noch richtig zünden. Höchstens kannst du die Zündung ganz aussetzen wenn er zu langsam ist. Nick S. schrieb: > Pickup steht zb auf OT, Arduino startet, und wartet aufs erste > Pickupsignal-> > > Timer auslesen, Drehzahl ausrechnen, Vorzündung ausrechnen und Flag? > setzen, dann Timer auf 0 zurücksetzen. > > Bei erreichen der Flag zünden, warten bis Pickupsignal und das Spiel > beginnt von vorn... Also: Der Timer wird "für dich" von der Hardware in genau dem Augenblick ausgelesen in dem das Pickup-Signal kommt. Zurücksetzen musst du ihn nicht (ist sogar kontraproduktiv). Stattdessen nimmst du den Inhalt des Capture-Registers (in dem ist der Wert der zum Pick-Up Zeitpunkt im Timer war) und addierst auf ihn die berechnete Zeit zwischen pickup und Zündung dazu. Das Ergebnis kommt in das Compare-Match register. Wenn der Timer jetzt diesen Wert erreicht hat, dann löst er selbsttätig die Zündung aus und informiert dich via interrupt. Du musst dann via Code die Auslösung wieder abschalten, damit sich energie für die nächste Runde aufbaut. Was hier (hoffentlich) auffält: Der µC muss Zeit haben den Zündzeitpunkt festzulegen nachdem er das Pickup-Signal bekommen hat. Wenn die Zündung erfolgen müsste bevor er fertig gerechnet hat, dann findet die nicht statt. Du kannst dem µC das ganze erleichtern indem du das Pickup Signal eine gewisse Zeit vor der Zündung ansetzt (z.B. im unteren Totpunkt). Der Abstand lässt sich leicht mit einer Konstanten rausrechnen. Was ich noch anmerken wollte: "Richtige" ECUs werten zusätzlich die Stellung der Drosselklappe aus. Das könnte dir auch hier einen weiteren Effizienzgewinn bringen.
Cool, du hast da echt feine Tips! Pickup auf UT hab ich mir mittlerweile auch schon gedacht, ein Poti zwischen den Vergaserzug wär auch kein übertiebener Aufwand...aber eins nach dem anderen :) Zündung bei Buffer overflow ausschalten ist eine gute Idee. Die nötige ca 1 Umdrehung pro Sekunde fürs starten ist ausreichend, das krieg ich beim ankicken locker hin. Jetzt bin ich endlich mal auf einen gscheidn Link gestoßen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR Und hab gleich meine erste Frage: Wie kann ich das TCCR auf Prescale 64 setzen? TCCR1 = ?? Lg
:
Bearbeitet durch User
Das machst du mit
1 | TCCR1B |= (1<<CS11)|(1<<CS10); |
Diese Information kommt (genau wie alle Register-Infos) aus dem Datenblatt des AVRs http://www.atmel.com/images/doc8161.pdf Ab Seite 113 geht es um Timer1. Auf Seite 136/137 ist TCCR1B mit den Prescaler-Bits behandelt. Im Allgemeinen dürfte die Antwort 80% aller Fragen die dir während dem Coden kommen in dem DB sein.
Vom Datenblatt verstehe ich vielleicht 10% :( Irgendwie tu ich mir schwer Seiten zu finden, wo Codefunktionen ausführlich und animiert dargestellt werden. Mich in die Programmierung einarbeiten dauert mind 1 Jahr, so lange will ich die Motorentests nicht auf Eis legen. Gibts denn nicht schon fertige Sketches die auf meine Anwendung passen, haben doch bestimmt schon tausend Leute vorher gemacht?? Lg
Hier hat jemand schonmal was vergleichbares gebastelt, aber am Ende sind die Infos etwas löchrig. Beitrag "Vollprogrammierbare Zündanlage für 1Zylinder 2 und 4 Takt Motoren"
Das schaut interessant aus, sind das hier die richtigen Daten dazu: https://docs.google.com/file/d/0BxQHqG9HPIj3UFdwNXNuRUt2UnM/edit ? Wie bekomme ich den Code auf den Nano, hab bisher nur ein bisschen mit der Arduino SW gearbeitet? Kann ich den Vespatronic-Stator mit 4 Spulen / 2 Zündungen pro Umdrehung dann mit einer "normalen" CDI mit 3 Anschlüssen verwenden? Danke schonmal für die Infos!
Ich wär für den Anfang schon begeistert wenn ich zumindest einen Drehzahlmesser Sketch nach Max.Ds Angaben hätte: Der Timer läuft endlos im Kreis (ein Durchlauf muss länger als eine Umdrehung des Motors sein). Das Signal von dem Sensor kommt an den Capture Input. Wenn jetzt der Sensor auslöst, dann wird der aktuelle Timerwert in das Capture Register gespeichert und der Timer läuft unbeirrt weiter. Gleichzeitig wird für die CPU ein Interrupt ausgelöst. In diesem Interrupt liest du jetzt das Capture register ein und vergleichst es mit dem Wert vom letzten mal.Aus der Tick-zeit des timers und der anzahl der Ticks zwischen den zwei events bekommst du die zeit für eine Umdrehung und die Drehzahl ist einfach der Kehrwert. Kann mir jemand dabei helfen? Ein Modell mit Lochscheibe (12Löcher) und Lichtschranken mit NE555 Trigger ist aufgebaut, kann auch gerne Bilder hochladen wenns funktioniert. Lg!
Der Link von dir enthält Code für einen PIC, das passt nich zum arduino. Nick S. schrieb: > Ein Modell mit Lochscheibe (12Löcher) und > Lichtschranken mit NE555 Trigger ist aufgebaut, kann auch gerne Bilder > hochladen wenns funktioniert. Das ist auf jeden Fall keine schlechte Idee.
Ich besitze selber keinen arduino und hab dem entsprechend auch nicht so viel mit der IDE am Hut. Im Allgemeinen brauchst du das: Im setup:
1 | TCCR1A = 0; |
2 | TCCR1B = 0b11000011; |
3 | TIMSK1 = 0b00100111; |
Dann musst du die Interrupts global freischalten, beim gcc geht das mit "sei();" unter arduino weißich nicht. In dem Capture Interrupt kannst du für den anfang einfach die Timerwerte auf die UART ausgeben (das is unter arduino ja einfach mit Serial.print). Die Formel um von dem rohen Tick-Wert auf RPM zu kommen sieht übrigens etwa so aus: RPM = (1/(Ticks*64/F_CPU))*60 ohne Gewehr auf Richtigkeit ;) Damit kannst du erstmal mit dem Taschenrechner deine Messwerte prüfen.
Es stimmt! Mit 750 Ticks sagt mein Taschenrechner: (1/(750*64/16000000))*60=20000 :) Und wenn ich das richtig verstanden habe, und der Timer 65536 Ticks schafft, dann funktionierts runter bis 228 U/min. Aber je mehr du mir erklärst, desto mehr schreckt es mich ab, bin vielzuweit weg das zu lernen...und optimier lieber mal meine Grundschaltungskenntnisse. Falls du einen fertigen Code hast/teilen willst, gib bitte Bescheid, würd mich sehr freuen! lg
:
Bearbeitet durch User
Es gibt mittlerweile kleine Fortschritte und sogar ein Bild: Beitrag "Re: Arduino Drehzahlmesser" Bitte, spendet Code zur Modernisierung alter Motoren! :)
Das Programm läuft, aber ich schaffe es einfach nicht das Pickupsignal auszuwerten, bekomme keine genaue Anzeige :( Das Signal schwankt um die 2V mit vielen kleineren Ripples, RC Filter habe ich bereits verschiedene probiert, ohne Erfolg. Kann mir da jemand weiterhelfen, zB RC dimensionierung und richtige Kondensatorart? lg
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.