Forum: Mikrocontroller und Digitale Elektronik Variablen Doppelpuls Messen mit einem Atmega32


von Jan S. (bugware)


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

: Bearbeitet durch User
von Uhrmacher (Gast)


Lesenswert?

Bleistift und Pspier.
Aufmalen nachdenken, danach programmieren.
Das macht man so......

von Mike (Gast)


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.

von Uhrmacher (Gast)


Lesenswert?

Kurtz??

von kein (Gast)


Lesenswert?

Uhrmacher schrieb:
> Kurtz??

Das Gegenteil von "lahng" - ist doch wohl klar ;-)

von Oldie (Gast)


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

von Uhrmacher (Gast)


Lesenswert?

Nö, lanck;-)

von David W. (david_w403)


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

: Bearbeitet durch User
von Helmut -. (dc3yc)


Lesenswert?

8 Jahre alten toten Thread wieder ausgebuddelt? Reschbeggd.

von David W. (david_w403)


Lesenswert?

War am ehesten das was ich suche. Besser neu aufmachen?

von Thomas F. (igel)


Lesenswert?

David W. schrieb:
> Besser neu aufmachen?

Ja, mache eine neuen Thread auf.

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
Noch kein Account? Hier anmelden.