Zuendanlage fuers Moped

Hallo alle zusammen,

ich will mir eine Zuendanlage fuers Moped zusammen bauen. Leider ist mein Moped so alt, das ich keine Teile mehr bekomme.

Im Standgas ist eine Verzoegerung von 2mS notwendig und bei Vollgas eine Verzoegerung von 1mS

Eingang uber Zuendgeber auf PIN 3,

Errechne die RPM //

map ( RPM zu Verzoegerung)

Wenn pin3 HIGH
dann delay(Verzoegerung)
write pin3 LOW

Soweit so gut funktioniert das ja auch.

Ich bekomme aber nur fuer jeden 3ten Eingangs Impuls einen Ausgangs Impuls.

Eingangs Frequenz ist 16-100Hz ( 1000-6000RPM)

Verzoegerung ist von 2ms im Leerlauf bis hin zu 1ms bei Vollgas.

Auch mit attachedInterrupt habe ich dasselbe Ergebnis.

int pulseOut = 0;
int pulseHigh = 0;
int pulseLow = 0;
float pulseTotal;
float frequency;

void setup() {
  pinMode(3, INPUT);
  pinMode(4, OUTPUT);

}

void loop() {
  pulseHigh = pulseIn(3, HIGH);
  pulseLow = pulseIn(3, LOW);
  pulseTotal = ((pulseHigh / 10) + (pulseLow / 10));
  frequency = 100000 / pulseTotal;
  pulseOut = map(frequency, 0, 100, 2333, 1014);  //Errechne Verzoegerung von Leerlauf 16Hz nach Vollgas 100Hz 
  if ( digitalRead(3) == 1) {
    delayMicroseconds(pulseOut);
    digitalWrite(4, HIGH);
    delay(2);
    digitalWrite(4, LOW);
  }
}


Schoenen Gruss ausm Sueden

Andy

(deleted)

Hi Peter,

hab ich schon gemacht.

mit :

attachInterrupt(digitalPinToInterrupt(3), blink, RISING);

und

void blink (){

digitalWrite(4,HIGH);
delayMicroseconds(pulseOut);
digitalWrite(4,LOW);
}

bekomme ich das selbe Ergebnis.

Gruss

(deleted)

Lies dich eher bei pulseIn ein und erkenne, dass diese Funktion blockierend arbeitet.
Wenn du auf jeden Puls reagieren willst, darfst du nicht erstmal einen Puls abwarten, um die Frequenz zu bestimmen.

Und in einer ISR kann man nicht warten.

(deleted)

Da beist sich ja mal wieder die Schlange in den Schwanz.

Ich kann also nicht die Zeit zwischen 2 Impulsen zaehlen und gleichzeitig eine Trigger funktion fuer jeden RISING impuls machen.

Hi

Wieso?
Du kannst bei jedem Impuls (PCINT) feststellen, in welche Richtung Dieser ging.
Demnach kannst Du ALLES, was man sich so vorstellen kann, berechnen.

Eingang der ISR: micros() oder millis() einlesen. _aktmicros=micros();
Wenn jetzt LOW-Pegel ist, werden wir eine fallende Flanke haben, sonst eine Steigende.
Je nach Flanke merke ich mir die Zeit davon (lastfalling/lastrising=_aktmicros;)
Kurz zuvor kann ich die Zwischenzeit berechnen (bevor ich den Merker überschreibe).

Wenn die Berechnung in loop() stattfinden soll - merke ich mir die aktuelle Zeit und setze ein Flag.
Da ich mir zwei Flanken merken muß und nur Eine überschrieben habe, muß ich auch noch wissen, Welche die Neue ist - kann ich mit dem Flag machen, statt bool als byte und 0/1/2
Wobei 0 'kein Flag' und 1/2 den Wert aufzeigt, Der zuletzt gesetzt wurde.

Daraus kann ich mir dann immer noch die Zwischenzeit egal welcher Flanke berechnen und auch daraufhin einen Trigger ausführen.
Wenn der Trigger zeitkritisch ist, kann Das auch schon in der ISR erfolgen.

MfG

Arduino__Andy:
Da beist sich ja mal wieder die Schlange in den Schwanz.

Ich kann also nicht die Zeit zwischen 2 Impulsen zaehlen und gleichzeitig eine Trigger funktion fuer jeden RISING impuls machen.

Was glaubst Du wie schnell die Drehzahl sich ändert?

Grüße Uwe

postmaster-ino:
Hi

Wieso?
Du kannst bei jedem Impuls (PCINT) feststellen, in welche Richtung Dieser ging.
Demnach kannst Du ALLES, was man sich so vorstellen kann, berechnen.

Eingang der ISR: micros() oder millis() einlesen. _aktmicros=micros();
Wenn jetzt LOW-Pegel ist, werden wir eine fallende Flanke haben, sonst eine Steigende.
Je nach Flanke merke ich mir die Zeit davon (lastfalling/lastrising=_aktmicros;)
Kurz zuvor kann ich die Zwischenzeit berechnen (bevor ich den Merker überschreibe).

Wenn die Berechnung in loop() stattfinden soll - merke ich mir die aktuelle Zeit und setze ein Flag.
Da ich mir zwei Flanken merken muß und nur Eine überschrieben habe, muß ich auch noch wissen, Welche die Neue ist - kann ich mit dem Flag machen, statt bool als byte und 0/1/2
Wobei 0 'kein Flag' und 1/2 den Wert aufzeigt, Der zuletzt gesetzt wurde.

Daraus kann ich mir dann immer noch die Zwischenzeit egal welcher Flanke berechnen und auch daraufhin einen Trigger ausführen.
Wenn der Trigger zeitkritisch ist, kann Das auch schon in der ISR erfolgen.

MfG

Bis ich da mal durchgestiegen bin was da gemeint ist wirds wohl noch ein bischen dauern.

Arduino__Andy:
Bis ich da mal durchgestiegen bin was da gemeint ist wirds wohl noch ein bischen dauern.

Eher nicht.
postmaster-ino hat nur den Eingang und die erste Verarbeitung in der ISR unabhängig von Deinem bisherigen Vorgehen beschrieben.

Arduino__Andy:
mit :
attachInterrupt(digitalPinToInterrupt(3), blink, RISING);

Verzichtest Du auf die Bedingung RISING, wird bei jeder Änderung die ISR aufgerufen und Du kannst alles selbst machen....

uwefed:
Was glaubst Du wie schnell die Drehzahl sich ändert?

Grüße Uwe

Moin alle zusamme,
sagen wir mal so: Wenn ich an der Ampel stehe, dreht der Motor im Leerlauf so um die 16Hz. Wenn die Ampel auf gruen geht, dann bin ich im Ersten Gang und es dauert schon 1 Sekunde bis zum 2ten bei Vollgas und der Motor dreht so um die 100Hz.

Also kurz und knapp: Von 16Hz nach 100Hz in 1Sekunde.

Ich hab jetzt schon ziemlich viel versucht. Im ISR die Zeit zu messen, Mit einem zweiten pin die Zeit messen usw.. Ich probiers halt heute mal weiter.

Schoenen Gruss aus Sueden.

Im Standgas ist eine Verzoegerung von 2mS notwendig und bei Vollgas eine Verzoegerung von 1mS

Ich weiß nicht so ganz, ob diese Betrachtungsweise "richtig" ist.

Als alter KFZler, würde ich das Pferd vom Kurbelwinkel her aufzäumen.

Also erste Frage:
Wieviel Grad vor OT sitzt der Sensor?

Schön, wäre, wenn der auf 0 Grad montiert wäre.
Das ist schön fürs Anspringen.
Denn in dem Augenblick gibts noch keine Drehzahl, welche man messen könnte.

Zweitakter?

combie:
Als alter KFZler, würde ich das Pferd vom Kurbelwinkel her aufzäumen.

Schon richtig, aber dann muss man es in eine Zeit umrechnen. Ich vermute mal das wurde getan.

combie:
Schön, wäre, wenn der auf 0 Grad montiert wäre.
Das ist schön fürs Anspringen.
Denn in dem Augenblick gibts noch keine Drehzahl, welche man messen könnte.

Wäre 30 Grad vor OT nicht schöner? Dann zündet man mit 0 bis 20 Grad "zeit"verzug ab dem Trigger.

Dass 0 Grad fürs Anspringen gut ist will ich in Frage stellen. Ich habe mich mit der Zündkurve meines Mopeds mal näher beschäftigt, und im Bereich zwischen Standgas und Drehzahl = 0 sinkt die Kurve von rund 20° auf 18°. Es scheint demzufolge für das Startverhalten eine frühe Zündung von Vorteil zu sein. Habe die Werte nicht selbst gemessen, aber mehrere Quellen stimmen da überein.

Dass 0 Grad fürs Anspringen gut ist will ich in Frage stellen.

Ja?

Einigkeit herrscht, wenn ich sage, dass das Druckmaximum auf, oder kurz nach OT, auftreten muss, damit die Kurbelwelle in die richtige Richtung beschleunigt wird.

Oder?

Oder anders formuliert:
Ein 500ccm Einzylinder, mit zu früher Zündeinstellung, zertrümmert dir das Fußgelenk beim antreten

(bis jetzt ist noch nicht mal klar, ob 4 Takter, oder Richtigtakter)

combie:
[...], ob 4 Takter, oder Richtigtakter

Zumindest hier herrscht zwischen uns beiden Einigkeit! ;D

combie:
Einigkeit herrscht, wenn ich sage, dass das Druckmaximum auf, oder kurz nach OT, auftreten muss, damit die Kurbelwelle in die richtige Richtung beschleunigt wird.

Oder?

Theoretisch ja. Je länger ich darüber nachdenke, umso mehr geb ich dir Recht. Bei niedrigen Drehzahlen sollte das Gemisch im Verhältnis zur Periodendauer sehr schnell durchbrennen. Und ich will sicher nicht, dass es durchgebrannt ist bevor OT erreicht ist.

Andererseits möchte ich mich ungern für schlauer als Yamaha halten, auch wenn ich es theoretisch nicht begründen kann warum die Vorzündung bei 0 rpm gut sein soll.

Abschließend würde ich dem TO empfeheln:

  1. darüber nachdenken, ob 0ms ein guter Wert sind für den ersten Zündverzug. So ist es aktuell programmiert.
  2. Wenn das Möp nicht anspringt, mal alles zwischen 0 und 20° Vorzündung auszuprobieren, solange man dabei halbwegs safe sein kann. Ich gehe mal von einem kleinvolumigen Geschoss aus, da ist man mit Stiefeln beim Ankicken sicher.