Hallo liebe Leute, ich habe da mal eine Frage. Ich bastel gerade an einer Zündung für einen 2 Takt Motor. Soweit habe ich es auch hinbekommen das ich bei Eingang LOW an einem Ausgang HIGH bekomme und der Motor läuft. Wie kann ich da jetzt eine Verzögerung einbauen? Also bei Eingang LOW das Zündsignal auf spät verstellen also etwas verzögert... Bitte gebt mir ein Codebeispiel. Ich fange gerade an und bastel mir aus verschiedenen Sachen etwas zusammen. Ich weiß das es entweder etwas mit millis oder micros zu tun hat aber ich weiß nicht wie ich das in den Code bastel. Ich danke euch für eure Hilfe
Da Du 2 Zylinder steuern willst, mußt Du mit millis() oder mikros() abrbeiten, wie Du schon richtig erkannt hast.
Hast Du Vorstellungen, um wieviel Du verzögern willst (von 0 bis ???).
Schjau Dir BlinkWithoutDelay an, um erst mal ein Gefühl für die Zeitsteuerung zu bekommen. Als Erläuterung ist manchmal die Nachtwächtererklärung sinnvoll.
Hallo, nein es ist ein 1 Zylinder 2 Takt Motor. Also eigentlich ein Go Kart. Nun möchte ich das Zündsignal so weit nach hinten verschieben das der Motor nicht über eine bestimmte Leistung kommt, damit mein Kind nicht die volle power hat wenn er drin sitzt. Es gibt zwar auch andere Lösungen, allerdings läuft da der Motor unrund und der Auspuff verölt.
Wie viel Zeitverzögerung ich brauche muss ich erst noch ausrechnen. Mir geht es in erster Linie darum wie ich diese Verzögerung in meinen Sketch einbaue. Da ich echt blutiger Anfänger bin kann ich mit dem Beispiel welches genannt wurde nicht viel Anfangen. Dieses habe ich mir schon angeschaut und werde nicht ganz Schlau daraus. Hier mal mein Code, vielleicht kann mir jemand verraten wie ich da diese Verzögerung einbaue...
const int Eingang = 2; // Pin 2 ist Eingang für Sensor
long previousMicros = 0;
long interval = 60000;
void setup() {
pinMode(2, INPUT); // Eingangspin auf Eingang stellen
digitalWrite(2, HIGH); // und Pullup-Widerstand einschalten
pinMode(3, OUTPUT);
Serial.begin(9600); // start serial
digitalWrite(3,LOW);
delay (2000);
attachInterrupt(0, readmicros, FALLING ); // Interrupt 0 auf Routine readmillis setzen
// reagiert auf steigende Flanken an Pin 2
}
// ein paar variablen definieren
volatile unsigned long dauer = 0; // microsekunden seit dem letzten Interrupt
volatile unsigned long last = 0; // Zählerwert beim letzten Interrup
long drehzahl; // selbstredend
char buf[17]; // Pufferstring für sprintf
void loop() {
{
// Hauptprogramm
drehzahl = 60000000 / dauer; // Drehzahl ausrechnen und
sprintf(buf, "RPM %4lu ", drehzahl); // als 4stellig formatierte Zahl in den Puffer schreiben
Serial.println(buf); // Puffer ausgeben
if (digitalRead(2) == LOW )digitalWrite(3,HIGH);
if (digitalRead(2) == HIGH )digitalWrite(3,LOW);
}
}
void readmicros() { // Interrupt-Routine
detachInterrupt(0); // Interrupt ausschalten damit er uns nicht beißt
unsigned long m = micros(); // Microsekundenzähler auslesen
unsigned long v = m - last; // Differenz zum letzten Durchlauf berechnen
if (v > 5000) { // ignorieren wenn <= 5ms (Kontaktpreller)
dauer = v; // Wert in dauer übernehmen
last = m; // und wieder den letzten Wert merken
}
attachInterrupt(0, readmicros, FALLING ); // Interrupt wieder einschalten.
}
Diesen Code habe ich aus dem Internet um die Drehzahl zu ermitteln. Wie gesagt ich bin blutiger Anfänger... Danke euch schon mal...
Wenn es nur ein Zylinder ist und der Arduino nichts anderes machen soll, kannst Du auch mit Deley(miillisekunden) oder delayMicroseconds(mikrosekunden) arbeiten, was erst mal einfacher ist.
Aber die Bedingungen: Nur 1 Zylinder und nichts Anderes tun beachten.
Dann gibst Du Deine errechete Verzögerung als Variable an eine der beiden Funktionen.
Zum Ermitteln der Werte dürfte das sowieso der einfachste Weg sein.
Ja der Arduino macht nix anderes als das. Tommy kannst du mir evtl. noch kurz ein Beispiel geben mit der If Bedingung? Das wäre super lieb. Dann werde ich das mal testen und berichten. Den Code siehst du ja mit dem if high etc. Daaaaaaaaaanke
Ich bin mir nicht sicher, ob der Arduino in dieser Umgebung überhaupt zuverlässig arbeitet. Das solltest du vorher hardwaremässig austesten, bevor du dich an die Zündzeitpunktverstellung machst.
Also funktionieren tut es schon mal so mit diesem Code. Also Arduino noch am Schlappi angeschlossen und den Eingangspin mit Schaltung an dem Pickup ( Hallsensor) und den Ausgangspin an die CDI Zündung. So läuft das erstmal. Also denke ich das das mit entsprechender Step Down Elektronik auch am Boardnetz laufen sollte. Das kommt dann aber später. erstmal muß ich diese Verzögerung einbauen. Der Zündzeitpunkt wandert ja auch in Abhängigkeit zur Drehzahl. erstmal möchte ich wissen wie man das in dem Code einbaut den Rest werde ich durch Try and error herausfinden. Aber schon mal danke für die Antworten....
Was Deinem Sketch noch fehlt, ist die Berechnung der Verzögerung abhängig von der Drehzahl.
Das kann ich Dir aber nicht schreiben, da ich von diesen Zusammenhängen keine Ahnung habe.
da ich von diesen Zusammenhängen keine Ahnung habe.
Als KFZi habe ich da etwas Ahnung.
Und auch schon einige Richtigtakter auf dem Prüfstand gehabt.
Wenn man die Wahl hat, dann:
Zum leichten starten, sollte der ZündZeitPunkt(ZZP) auf OT, oder auf etwas später stehen.
Im Leerlauf, sind ca 3° bis 7° Frühzündung angemessen.
Dann sollte der ZZP mit steigender Drehzahl Richtung früher gehen.
Mit dem erreichen des Resonanzbereiches, sollte der ZZP sich wieder Richtung Spät absenken.
Bei Drehzahlen über der Resonanz, wieder früher werden.
Die Verstellkurve sollte also einen deutlichen Sattel im Bereich der Resonanz aufweisen.
Das Ganze ist natürlich extrem von den verwendeten Komponenten abhängig.