Wenn das Ding ein Polrad hat, was ich annehme, sollte es am einfachsten mit einem Magnetfeldsensor machbar sein.Wenn deine Kiste nicht grade ne Magnetozündung hat (wo ich mir den Signalabgriff schwierig vorstelle), geht es im Prinzip so wie Jacko sagt.
Das Teil läuft mit 5V und Angst wegen vagabundierender Hochspannung braucht man auch nur wenig haben, es sei denn man legt die Signalleitungen direkt neben das Zündkabel.
Zum Thema Codeschnipsel:
Zuerst die beiden Interruptroutinen zur Ermittlung der Drehzahlen:
Nun der Teil der für die Sekundenzählung ( Torzeit ) und Mittelung der Drehzahlimpulse zuständig ist.Code:/* Turn registers saving off */ #pragma savereg- // External Interrupt 1 service routine Drehzahlmesser impulseingang interrupt [EXT_INT1] void ext_int1_isr(void) { new_drimp=1; #asm PUSH r26 IN r26,SREG PUSH r26 PUSH r27 ;*** Erste Phase der Drehzahlermittlung mittels Timerabfrage = Periodendauermessung *** IN r26,TCNT0 ;Aktuelle Zeit holen LDS r27,(_li_oldtimer) ;Vorherigen Wert holen STS (_li_oldtimer),r26 ;Vorheriger alten Wert überschreiben SUB r26,r27 ;Unterschied berechnen STS (_li_drwert),r26 ;Die berechnung als Wert abspeichern LDS r26,(_li_timer+1) ;Das gleiche für die 2te Stelle _li_timer+1 ist der überlauf des TCNT0 LDS r27,(_li_oldtimer+1) STS (_li_oldtimer+1),r26 SBC r26,r27 STS (_li_drwert+1),r26 LDS r26,(_li_timer+2) ;Das gleiche für die 3te Stelle LDS r27,(_li_oldtimer+2) STS (_li_oldtimer+2),r26 SBC r26,r27 STS (_li_drwert+2),r26 LDS r26,(_li_timer+3) ;Das gleiche für die 4te Stelle LDS r27,(_li_oldtimer+3) STS (_li_oldtimer+3),r26 SBC r26,r27 STS (_li_drwert+3),r26 ;*** Zweite Phase der Drehzahlermittlung mittels Pulszählung *** LDS r26,(_ui_intpulses) INC r26 STS (_ui_intpulses),r26 BRNE ENDINT1 LDS r27,(_ui_intpulses+1) INC r27 STS (_ui_intpulses+1),r27 ENDINT1: POP r27 POP r26 OUT SREG,r26 POP r26 #endasm; } // Timer 0 overflow interrupt service routine Drehzahlmesser Pulsdauermessung interrupt [TIM0_OVF] void timer0_ovf_isr(void) { #asm PUSH r26 IN r26,SREG PUSH r26 LDS r26,(_li_timer+1) INC r26 STS (_li_timer+1),r26 BRNE ENDINT0 LDS r26,(_li_timer+2) INC r26 STS (_li_timer+2),r26 BRNE ENDINT0 LDS r26,(_li_timer+3) INC r26 STS (_li_timer+3),r26 ENDINT0: POP r26 OUT SREG,r26 POP r26 #endasm } /* re-enable register saving for the other interrupts */ #pragma savereg+
Nun die Berechnung der DrehzahlCode:// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { /* 1 Sekunde */ ui_timer++; if (new_drimp>0) { li_drmittel+=li_drwert; /* Aufaddierung für Drehzahlmittelwertbildung */ uc_stellen++; /* Aufaddierung der Stützstellen */ new_drimp=0; /* Neue Drehzahl Flag löschen*/ }; if (ui_timer>19) { ui_drpulses=ui_intpulses; ui_intpulses=0; ui_timer=0; new_sec=1; uc_overflow++; } }
Und die dazugehörige Timer initialisierungCode://Drehzahlermittlung if (ui_drpulses<3) /* Drehzahlen unter 120 U/min werden ignoriert */ { li_drehzahl=0; } else { if (ui_drpulses<350) /* Entscheidung welches Drehzahlermittlungsverfahren angewendet wird bei 21000 U/min*/ { li_drmittel=li_drmittel/uc_stellen; /* Mittelwert der Drehzahlmessungen errechnen */ li_drehzahl=7500000/(li_drmittel*uc_blatt); /* Periodendauermessung */ } else { li_drehzahl=ui_drpulses; /* Pulszählung in Torzeit ( 1Sekunde )*/ li_drehzahl=(li_drehzahl*60)/uc_blatt; } } ui_drpulses=0; /* Pulszählung zurücksetzen */ li_drmittel=0; /* Mittelwertbildner zurücksetzen */ uc_stellen=0; /* Stützstellenzähler zurücksetzen */
Die Routine arbeitet mit beiden möglichen Messmethoden und schaltet ab 350 Impulsen pro Sekunde ( ~21000 U/min ) zwischen den beiden Berechnungsverfahren um.// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
TCCR0=0x03;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// CTC Mode : On
TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0xC3;
OCR1AL=0x4F;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x11;
Der Controller läuft mit einem externen 8MHz Quarz.






Zitieren
Lesezeichen