Hallo, ich würde gerne über einen Hallgeber den stand des Schwungrades auslesen. Dies kann man mit Timer realisieren, wie ich das gelesen habe. Das Schwungrad besitzt eine Doppelverzahnung (2x kurtz Impuls ). Dieser ist aber wichtig um den korrekten Zündzeitpunkt zu ermitteln, nur leider weiß ich nicht wie ich diesen "2x kurtz Impuls" als auslöser einer Funktion z.B. "Zünden" herrausfiltern kann. Der Rest des Rades hat eine gleichmäßige Verzahnung also immer (Low, HI) abwechselnd bis zum Doppelpuls. Ungefähre Impulsstruktur : ...---x---x---x---X-X---x---x---x---x... (Die Drehzahl ändert sich ständig) Habe schon länger im Netz nach einer lösung gesucht und leider nichts gefunden. Ich hoffe Ihr könnt mir da weiterhelfen, gerne auch Links. Ich benutze den Atmega32-PU mit einer 16 Mhz Taktung. Vielen Dank!!! Jan
:
Bearbeitet durch User
Bleistift und Pspier. Aufmalen nachdenken, danach programmieren. Das macht man so......
Jan Schnabel schrieb: > Ich benutze den Atmega32-PU mit einer 16 Mhz Taktung. Dann musst du damit jetzt nur noch die Länge deiner Pulse ausmessen und wenn zwei auffällig "kurtze" dabei sind, "Bescheid" sagen. Bei der statistischen Bewertung deine Pulslängen könnte dir der Median hilfreich sein, da er sich durch die beiden "kurtzen" Pulse nicht gleich ändert.
Wenn dir das Erfassen des Pulsabstandes schon ein Rätsel ist, wird es schwierig, dir zu helfen. Ansonsten: ABSTAND_ALT = sehr kleiner Wert Schleife: ABSTAND_NEU = Neue Messung Pulsabstand ABSTAND_NEU < ABSTAND_ALT/2 ? Ja: Doppelpuls erkannt - Zündung aulösen! Nein: ABSTAND_NEU nach ABSTAND_ALT kopieren GOTO Schleife
Hallo zusammen, ich versuche gerade eine Ansteuerung eines Doppelpulsmessplatzes zu schreiben. Ich bin mir nicht ganz sicher ob ich das mit dem mega328p und C++ realisieren kann. Ziel soll die einstellung der Pulse/Totzeit auf < 1us sein. high ------- ------- low ______| |___________| |_______ t | <1us | <1us | <1us | Ich frage mich ob ein switch/case dafür schnell genug ist. Denkt ihr das kann Funktionieren? Mein Ansatz ist: Timer1 im CTC mode;
1 | ...
|
2 | |
3 | case 20: |
4 | TCCR1A = 0bXXXXXXXX; //A ein, CTC |
5 | TCCR1B = 0bXXXXXXXX; //A ein, CTC |
6 | OCR1A= 10; //erster Puls auf 10 Takte |
7 | break; |
8 | case 21: |
9 | OCR1A= 10; //Totzeit auf 10 Takte |
10 | break; |
11 | case 22: |
12 | OCR1A= 10; //zweiter Puls auf 10 Takte |
13 | break; |
14 | case 23: |
15 | TCCR1A = 0b00000000; //A aus, normal port operation |
16 | break; |
17 | }
|
18 | }
|
19 | |
20 | ISR (TIMER1_OVF_vect){ |
21 | ov_counter+=1; //hochzählen bei overflow |
22 | ...
|
:
Bearbeitet durch User
8 Jahre alten toten Thread wieder ausgebuddelt? Reschbeggd.
War am ehesten das was ich suche. Besser neu aufmachen?
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.