Variablen Doppelpuls Messen mit einem Atmega32

#3684129
Lesenswert?

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
Gast #3684238
Lesenswert?

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.
Gast #3684557
Lesenswert?

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
#7037773
Lesenswert?

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
...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren