Rechtecksignal Impulsdauer halbieren

Guten Tag zusammen
Ich bin Automechaniker, habe also praktisch keine Vorkenntnisse was das Programmieren vom Arduino angeht. Ich bitte deshalb jetzt schon um Entschuldigung falls ich dumme Fragen stelle.
Jetzt aber zu meinem Anliegen:

Zur Zeit baue ich ein Mofa aus den 60er Jahren auf elektronische Einspritzung/Zündung um. Zu diesem Zweck verwende ich bestehende Komponenten aus einem Aprilia SR50 DiTech Roller. Das Einspritzventil musste ich Konstruktionsbedingt von einem Citroen C3 verwenden. Da mir dieses Ventil zu lange offen bleibt läuft der Motor zu fett.

Die Aufgabe die der Arduino Uno erfüllen soll ist diese:

Ausgegebene Impulse des Motorsteuergeräts (durch mosfet-schaltung in 5V Rechteck-Signal umgewandelt) verkürzen. gehen wir mal von halbieren aus.
Die Frequenz wie die Impulslänge varieren je nach Last und Motordrehzahl.
Bei Leerlaufdrehzahl ca 30Hz
Bei 10000 U/min ca 167 Hz
die gemessene Impulsdauer ist im Bereich von 4-6ms

meine Idee ist es jetzt, die Dauer des am Pin 2 anliegenden Impulses zu messen und die halbe Impulsdauer davon am Pin 7 wieder aus zu geben. Dies führt logischerweise zu einer Verzögerung, da ich aber eine Saugrohreinspritzung bei einem 2Takt Motor habe, ist die für mich nicht relevant.
Ist so etwas möglich?

Danke jetzt schon für eure Antworten

Ja :slight_smile:

Im einfachsten Fall mit pulseIn() die Dauer des Impulses messen und dann mit digitalWrite() und delayMicroseconds() den halbierten Impuls ausgeben.

Hallo
Oder ganz einfach ein SN7474 FF nehmen.

Da hast Du wohl die Aufgabenstellung falsch verstanden.

Danke schon mal. Ich pröble mal einwenig herum mit dieser Funktion. Dachte schon, dass es irgendwie in diese Richtung gehen muss.

Der Vorteil des Controllers ist dass du auch die Verzögerung des Saugrohrs einstellbar machen kannst. Demnach wie fit du mit der Materie bist könntest du dir deine Frequenzteilung sowie die Verzögerung per Poti einstellbar machen, ich denke da wird noch viel Justierarbeit auf dich zukommen.
Spritzt du Gemisch ein oder hast du eine extra Öleinspritzung?

ok die Einspritzdüse für einen 4 zylinder 1400 cc Motor ist natürlich zu groß für ein 1 Zylinder 50cc Motor.
Bist Du sicher daß die Einspritzdüse so kurze Öffnungszeiten kann?
Die Impulslänge des Steuergerätes messen und dann eine proportionale kürzeren Impuls generieren heißt aber daß der generierte impuls erst nach dem des Steuergerätes produziert wird. Produziert das steuergerät den Injektionsimpuls einfach regelmäßig oder synchronisiert mit der Kurbelwennen / Kolbenposition?

Grüße Uwe

Da hat Uwe Recht aber die Einsrpitzmenge hängt auch vom Kraftstoffdruck und der Kraftstoffart ab. Den Druck könnte er geringer auslegen mit einem Regler den er sowieso braucht.

Bei einem geringen Druck könnte es sein daß der Kraftstoff nicht richtig vernebelt wird und darum zu flüssig bleibt?

So ist es.

Der Regebereich liegt meist irgendwo zwischen 2,5 und 5 Bar.
Oft unmittelbar mit dem Ansaugrohrdruck gekoppelt.
Sobald der steigt, steigt auch der Benzindruck.

Vielen Dank für eure Antworten!
Also: Natürlich habe ich mir im Vorfeld die Überlegung gemacht, dass ich Ventil von einem möglichst Hubraum kleinen Motor verwenden werde. Ich habe ein Ventil des 1100ccm C3 eingebaut. Dieser hat eine Multipoint Einspritzung, das bedeutet dass das Ventil für nur einen der 4 Zylinder den Kraftstoff einspritzt. Das sind aber immer noch 275ccm was, wie Uwefed richtig geschrieben hat, zu viel Kraftstoff für einen 50ccm Motor bedeuten würde. Meine Überlegung war deshalb von Anfang an mit weniger Druck zu arbeiten. Zu diesem Zweck ist ein manueller Benzindruckregler verbaut, den ich nicht an den Saugrohrdruck, der bei so einem kleinen Motor kaum relevant ist, gekoppelt habe. Wird das Ventil mit einem Druck unter 1Bar versorgt wird der Kraftstoff nicht richtig vernebelt, was korrekt bemerkt wurde.
Das original Ventil des Rollers ist niederohmig (2Ohm) das jetzt eingebaute jedoch hochohmig (14Ohm) das hat zur Folge, dass das Ventil, wird es direkt ans Steuergerät angeschlossen, nicht voll öffnen kann, was wiederum zu einer nicht optimalen Vernebelung des Kraftstoffs führt. Zufälligerweise öffnet das Ventil jedoch gerade so weit, dass die Menge reicht um ein nahezu optimales Gemisch auf zu bereiten. Das heisst im Klartext: Ich kann bereits fahren mit dem Mofa. "nahezu optimal" reicht mir jedoch nicht aus, deshalb möchte ich den Arduino vorschalten und dem ganzen am besten abhängig von der Drehzahl eine Kurve hinterlegen. (Was vermutlich unmöglich ist) Da der Roller eine Direkt-Einspritzung hatte, das Mofa jedoch eine Saugrohreinspritzung stimmen die vom Steuergerät gegebenen Zeiten nicht ganz. Ich würde also gerne in den unteren Drehzahlen etwas mehr anfetten, in den oberen etwas magerer fahren.
schön währe, wenn ich den Zeitpunkt der Einspritzung festlegen könnte. Das heisst, ich möchte das Ventil öffnen, wenn der Ansaugschlitz offen ist und mehr oder weniger direkt unterhalb des Kolbens in den Zylinder einspritzen.
Ich habe als Versuch mal einen 1ms Impuls bei 100Hz auf dem Arduino laufen lassen und das Ventil über eine separate Mosfet-Endstufe angesteuert. Dieser Versuch hat gut funktioniert, anscheinend schaltet das Ventil sehr schnell, was gutes hoffen lässt.
Ich verwende ein Akalyt Benzin Gemisch (Motorex Aspen). ein herkömmliches 2-Takt Gemisch würde mir vermutlich das Ventil verkleben.
Was ich nun brauche ist ein Code, mit dem ich (vermutlich per "PulseIn) den Impuls auslese, den (mit "Duration?") dann anpasse und bei offenem Ansaugschlitz wieder ausgebe. Dass das Ganze dann um ca einen Impuls Zeitversetzt ist dürfte nicht relevant sein.
Ich kann übrigens die Position der Kurbelwelle sehr genau bestimmen, da diese über das Polrad mit einem Induktivgeber abgetastet wird.
Wenn mir also jemand fürs erste mal mit einem Sketch zur Anpassung des Einspritzimpulses behilflich sein könnte, währe ich sehr dankbar.

Du hast einen Kurbelwellensensor
Damit Drehzahl und Drehwinkel

Auch einen Drosselklappensensor? (alternativ Luftmassenmesser?)
Damit könnte man dann den Saugrohrdruck abschätzen.

Und eine "Kennfeldsteuerung" willst du ja sowieso bauen.
Dann fasse das doch gleich zusammen!

Zündzeitpunkt
Einpritzzeiten
Elektrischer Benzindruckregler, wenn nötig.

Du kannst ja das Ventil mit dem Start des Impulses des Steuergerätes triggern aber die Dauer der vorherigen Messung des Steuergerätsteuerimpulses nehmen. Dazu muß das Ventil gleichzeitig mit der Steuergerätimpulses Messung angesteuert werden. Das müßte kein Problem sein.
Grüße Uwe

Genau das habe ich vor. Hast du eine idee wie ich das programmieren kann?

Mal sehen ob das alles in meiner Macht steht. Eingebaut ist ein Drosselklappenpoti. Zündzeitpunkt und Einspritzzeit werden grundsätzlich schon vom Steuergerät festgelegt. Ich möchte lediglich noch ein paar Korrekturen einfügen.

Kennst du die Verdichtung deines Motors?

Da bin ich noch dran. Der originale Zylinderkopf taugt nichts, der Brennraum ist nicht optimal geformt und die Kompression zu klein. Die CAD Zeichnung eines angepassten Zylinderkopfes geht nächste Woche ins Fräswerk. Ca Mitte,Ende Januar sollte ich den neuen Zylinderkopf montieren und dann die Effektive Kompression messen können.

Du betreibst schon einen großen Aufwand, ist aber ein cooles Projekt. Wenn du die Kompression und den die Brennraumgröße genau kennst kannst du die erforderliche Einspritzmenge genau berechnen

Ja, der Aufwand ist tatsächlich gross. Der Ehrgeiz auch, da mir von diversen Personen keine guten Prognosen für ein Gelingen dieses Projektes vorausgesagt wurden. Die Kurbelwelle ist übrigens auch ein Einzelstück, das ich anfertigen liess. Die ganze Mechanik und auch der "normale" Teil der Elektronik ist mein täglich Brot, also machbar. Die Programmierung eines Arduino aber völliges Neuland für mich. Ich bin dauernd gefundene Sketches am hochladen und das hochgeladene mit dem Ozillosop am überprüfen. Bisher hat mich noch nichts überzeugt. Hier bin ich auf Hilfe angewiesen.

Ich habe jetzt folgendes Programm geschieben:

int Ausgang=7;
int Eingang=2;
int duration=0;

void setup() 
{
    pinMode(Ausgang, OUTPUT);
    pinMode(Eingang, INPUT);
}


void loop() 
{
     duration = pulseIn (Eingang,HIGH);
     Serial.println(duration);
     while (digitalRead(Eingang)==0)
{
}
     digitalWrite(Ausgang, HIGH);
     delayMicroseconds(duration);
     digitalWrite(Ausgang,LOW);
}

das Ergebnis ist, dass nur jeder 2te Impuls ausgegeben wird. Die Impulszeit ist dabei gleich geblieben. Ein Versuch am Motor hat ergeben, dass das Ganze so jetzt zu mager läuft. heisst also: ich muss jeden Impuls ausgeben, die Impulslänge jedoch anpassen können.
Kann mir da jemand weiter helfen?