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.
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.
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.
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.
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.
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)
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:
darüber nachdenken, ob 0ms ein guter Wert sind für den ersten Zündverzug. So ist es aktuell programmiert.
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.