Hallo Zusammen! Ich Versuche seit Tagen einen genauen Drehzahlmeser mit einem MSP aufzubauen. Dazu 1. zähle ich mittels Interrupt die Impulse eines Drehzahlgebers und 2. zähle ich Millisekunden. Alle halbe Sekunde also alle 500mS berechne ich dann die Drehzahl. Die Schwankt aber dann stark. 20% sind da garnix. Und das, wie Hoch oder nidrig die Drehzahl auch ist. Ich teste zwischen 1800 und 30000 1/min. Nach meiner kenntniss sollte das ergebnis aber genauer werden, je höher die Drehzahl ist. Klar: Wenn die Taktzahl ungefähr gleich der Zeitintervallzahl ist wird das ganze beliebig ungenau. Mit der oben gennten Drehzahlspanne sollte ich aber doch auch bessere Ergebnisse bekommen oder? Nochwas: Ich habe als Zeitbasis den TimerA mal mit 32,... (ACLK) und mal mit 8000kHZ (SMCLK) betieben. Das macht keinen unterschied, die Takte laufen also gleich genau/ungenau. Benni
hmm bist du dir sicher, das du den msp richtig konfiguriert hast? bist du dir sicher das der mclk auch deinem quartz entspricht? klingt so, als wenn du den internen osz benuten würdest, denn der kann unter umständen(temperatur, wärme,...) schon sehr stark schwanken. woher weißt du, dass du genau bei 1/2 sec auslöst? hast du den msp vielleicht schlafen gelegt (raminhalt ging verlohren?) ... mfg KoF
Äähm "mclk"? Also: Timer A: TACTL = TASSEL_1+TACLR+ID_2;//ACLK,clear TA,Clockdder(8) //4096=1Sek TACTL |= MC_1; // Up 0 -> CCR0, 0 -> CCR0, 0 -> CCR0, ... CCR0set (1024); // 1/8s Taktung interrupt (TIMERA0_VECTOR) Timer_A(void) { L1inv(); // Toggle P1.0 ctr_tconst++; // achtelsekunden msec++; }; Takteingang mitzählen: interrupt(PORT1_VECTOR) intServiceRoutine(void){ ctr_Zimp++; // Takte } Im Programm: if ((ctr_Zimp>30) && (ctr_tconst>4)) n=ctr_Zimp*8*60/ctr_tconst; //[Impulse*Hz*2*60Sek/Zeitintervall] Mit dem if gehe ich sicher, daß ich mindestens 30 Impulse und 1 Sekunde warte um sehr nidrige oder sehr hohe Drehzahlen abzufangen. Nein: Schlafen geht er fast nie, außer ohne Strom ;-). Mit der SMCLK also dem 8MHz Quarz mache ich ähnliche Fehler. An der Temperatur u.s.w. kann es also nicht wirklich liegen - oder welchen "sauberen" Takt kann ich noch auf den Timer legen? Benni PS.: Quarz wird so gestertet?!?! WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer BCSCTL1&=XT2OFF; // Switch on the XT2 osc. BCSCTL2|=SELM1+SELS; // Select XT2 osc. for // SMCLK & MCLK // Test the osc. flag bit do { IFG1 &= ~OFIFG; // Clear the OFIFG bit } while (OFIFG&IFG1); // }
Ohne mich in Deine Quelltexte eingelesen zu haben: Ist der Sensorausgang ordentlich entprellt? Wenn das Signal, welches Du auf den IRQ-Eingang gibt's, nicht sauber ist sondern prellt, könnte auch das von Dir beschriebene Verhalten auftreten... Christian
signal mit oszi überprüfen. ein schmitt-trigger bietet sich da auf jeden fall an.
Hallo Benjamin! Ist der DZM für ein Fahrzeug mit Benzinmotor gedacht? Wenn ja, so muss ich sagen, dass das bei Fahrzeugen mit elektronischer Zündanlage Schwierigkeietn dadurch macht, dass die Frequenz der Zündimpulse nicht proportional zur Drehzahl ist. Ich habe mittels Oszi festgestellt, dass beim Corsa z.B. ab 2500 U/min 4 Impulse pro Umdrehung erzeugt werden; darunter nur 2. MfG Paul
Hallo Paul, für ein KFZ wird das nicht gedacht sein, da er von 30'000 U/min schrieb... Jedoch verstehe ich nicht, wieso die Impulse nicht direkt von der Drehzahl abhängen sollten - Schließlich muß pro Umdrehung jeder Zylinder einmal gezündet werden, oder läuft der Corsa unterhalb 2500U/min nur auf 2 Töpfen? Gruß, Christian
@Christian Nein, der läuft schon rund. :-)) Aber es werden (um bei hohen Drehzahlen eine bessere Verbrennung zu erreichen) mehrere Impulse erzeugt. Da hat mir dann auch ein KFZ-Elektriker bestätigt, was ich auf dem Oszi mit Entsetzen gesehen habe. MfG Paul
wie jetzt, soll das heißen, der zündet mehr als einmal aller zwei umdrehungen pro zylinder, also nicht nur beim verdichten vor OT ? wozu ? und bei welchen takten ? ...fragen, fragen, fragen...
Ja! Das ding ist letzten Endes für ein Auto - das hat aber bislang noch garkeine elektronik. Einen Hall-Sensor habe ich schon hier liegen: Funktionstüchtig. Birngt auch schon Signale. Zum Testen ist das aber alles nix. Darum benutze ich einen Frequenzgenerator. Sinusschwingung rein in den Schmitt-Trigger vom MSP... Damit lasse ich auch eine LED blinken, die ich hier nicht mit ins Forum geschrieben habe. Leider kann der Frequenzgenerator nur Schrittweise 20,40 ... 15kHz. Damit simuliere ich so auch sehr hohe Drehzahlen. Das sollte aber erstmal egal sein. So kann ich allerdings versuchen den Fehler Prozentual kleiner zu machen, indem ich die Taktzahl massiv erhöhe. In meiner Main-Loop steuere ich auch noch ein LCD an. So wie ich das sehe haben aber die Int's immer Prio - oder habe ich da was falsch verstanden? Ich verstehe es einfach nicht: Er läuft nicht richtig rund....warum? Zu euren KFZ-Fragen: Ich habe schon von Fahrzeugen gehört - es gab da eine generation Fiesta, die hatten eine Doppelzündung: Einmal normal vor OT und dann nochmal kurz dahinter, falls es beim ersten mal nicht gekracht hat. Vieleicht hat der Opel sowas nur in höheren Drehzahlen. Wie ich das sehe steckt in dieser ganzen KFZ-Zünderei aber noch eine ganze Menge know how... Benni
moin, die lösung, die takte zu zählen und dann anhand des 125ms-zähler die frequenz auszurechen kann so wie du es beschrieben hast nicht genau sein, da der zeitpunk wann du die frequenz berechnest nicht genau bestimmt werden kann. ist dein zähler ctr_tconst bei 4 angekommen, wird IRGENWANN im programm die frequenz aus ctr_Zimp berechnet. zu diesem zeitpunkt ist der impulszähler ctr_Zimp aber schon weiter hochgelaufen. besser wäre es, den impulszähler ctr_Zimp in der TIMAER_A0 interruptroutine bei 4 ctr_tconst zu sichern und dann die berechnung im hp durchzuführen. eine andere möglichkeit wäre, mit jedem impuls einen timerinterrupt auszulösen. dieser interrupt wird als capture konfiguriert. bei jedem interrupt wird nun das entsprechende register (TACCRx) gesichert, zuvor wird der vorherige wert gesichert. ziehst du den alten wert vom neuen ab, erhälst du genau die periodendauer des signal. daraus die frequenz bzw. drehzahl zu berechnen dürfte ein leichtes sein. allerdings mußt du dabei den überlauf des register TACCRx beachten, stellt aber auch kein problem da. gruß tenner
Hallo tenner! Wenn ich die Drehzahl berechne, nehme ich aber den Aktuellen Werf für die counter. Wenn ctr_tconst weiter gezählt hätte, hat auch ctr_Zimp die möglichkeit gehabt weiter zu laufen. Das ganze habe ich auch schon mit wesentlich größeren unteschieden zwischen Impuls- und Zeitzähler versucht. Da war mal so ein Faktor 100 drin - und das ergebnis ist genau so falsch wie vorher. D.h. das Ergebnis ist nicht einfach falsch sondern es schwingt irgendwo um die tatsächliche Drehzahl, nur um das ganz klar zu machen. Werde das aber mal mit dem gegenseitigen blockieren der counter versuchen und auch mal die Lösung, die Timerregister auszulesen. Hast du da mal einen Codeschnipsel, wie ich die CCRx auslese bzw. als Capture configuriere? Danke Benni
@clink84 GRÜNAU!! Der kriegt nicht nur einen Zündimpuls pro Zylinder sondern bis zu 4 und zwar vor dem OT. Sonst zu zünden hätte ja keien Sinn. MfG Paul
Hallo Zusammen! Gestern habe ich nochmal das Programm überarbeitet. Habe eine bool-Variable genutzt, die sofort sperrt, sobald der Timer-Counter eien Wert von 5 erreicht. Dann wird der Zimp-Counter nicht weiter hochgezählt. Die Beiden Werte "verwurste" ich dann. Leider bekomme ich genau so schlechte Ergebnisse wie zuvor. ICh schätze der Timer sit und bleibt das Problem. Getestet habe ich übrigens bis 500Hz -> 30000 1/min. Ich checks einfach nicht, warum das ding nicht genauer taktet. Benni
Hallo! Pro Umdrehung bekomme ich einen Impuls. Auf diese Nachfrage hin habe ich dann mal die Eingangsfrequenz um das 200-fache erhöht : Mit dem Frequenzgenerator. Brachte aber wenig. Jetzt habe ich das ganze mal so umprogrammiert, daß bei Interrupt auf Port1 - also als reaktion auf den Drehimpuls: 1. Timer A ausgelesen wird und 2. Timer A auf Null gesetzt wird. Die Genauigkeit liegt jetzt bei 1 Impuls pro Umdrehung auf 106 1/Min abweichung bei 15000 1/Min. Also komme ich bei einem Drehzahlbereich 0 bis 10000 1/Min locker hin. Danke jedenfalls für eure Tips... Benni
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.