robo junior
29.01.2007, 15:29
Hallo
Ich hab das Kompassmodul CMPS03 an dem RN 2560 Modul. Ich möchte die Kompassdaten über den PWM-Ausgang des Moduls abfragen. Dazu habe ich den Ausgang an einen Interrupteingang des ATMega 2560 Moduls angeschlossen. Ich benutze folgenden Code um die Länge einer Flanke des PWM Signals zu messen, die man dann in den Kompasswert umrechnen kann:
ISR(INT6_vect) {
if(zustand.kompass_high==1) {
aktuell_winkel=((TCNT1-25)/2.5); //länge des PWM Signals auslesen
EIMSK &= ~(1<<INT6); //Pin6 disable
EICRB = (1<<ISC61)|(1<<ISC60); //Interrupt bei wechsel auf high
EIMSK = (1<<INT6); //Pin6 enable
zustand.kompass_high=0;
} else {
TCNT1=0;
zustand.kompass_high=1;
EIMSK &= ~(1<<INT6); //Pin6 disable
EICRB = (1<<ISC61); //Interrupt bei wechsel auf low
EIMSK = (1<<INT6); //Pin6 enable
}
}
zustand.kompass und aktuell_winkel sind volatile. Der Prescaler für Timer1 hab ich auf 64 eingestellt. Eigentlich liefert das auch meißtens ein vernünftiges Ergebnis. Mein Problem ist, dass ich aber manchmal in den Ergebnissen Abweichungen um +/- 400 (entspricht 40°) habe. So ungenau dürfte der Kompass doch eigentlich nicht sein? Mach ich bei der Auswertung einen Fehler bzw. wie würde ich das besser machen?
schon mal danke für Eure Tips
Ich hab das Kompassmodul CMPS03 an dem RN 2560 Modul. Ich möchte die Kompassdaten über den PWM-Ausgang des Moduls abfragen. Dazu habe ich den Ausgang an einen Interrupteingang des ATMega 2560 Moduls angeschlossen. Ich benutze folgenden Code um die Länge einer Flanke des PWM Signals zu messen, die man dann in den Kompasswert umrechnen kann:
ISR(INT6_vect) {
if(zustand.kompass_high==1) {
aktuell_winkel=((TCNT1-25)/2.5); //länge des PWM Signals auslesen
EIMSK &= ~(1<<INT6); //Pin6 disable
EICRB = (1<<ISC61)|(1<<ISC60); //Interrupt bei wechsel auf high
EIMSK = (1<<INT6); //Pin6 enable
zustand.kompass_high=0;
} else {
TCNT1=0;
zustand.kompass_high=1;
EIMSK &= ~(1<<INT6); //Pin6 disable
EICRB = (1<<ISC61); //Interrupt bei wechsel auf low
EIMSK = (1<<INT6); //Pin6 enable
}
}
zustand.kompass und aktuell_winkel sind volatile. Der Prescaler für Timer1 hab ich auf 64 eingestellt. Eigentlich liefert das auch meißtens ein vernünftiges Ergebnis. Mein Problem ist, dass ich aber manchmal in den Ergebnissen Abweichungen um +/- 400 (entspricht 40°) habe. So ungenau dürfte der Kompass doch eigentlich nicht sein? Mach ich bei der Auswertung einen Fehler bzw. wie würde ich das besser machen?
schon mal danke für Eure Tips