Forum: Mikrocontroller und Digitale Elektronik MSP: Drehzahlmesser zu ungenau?!


von Benjamin Johann (Gast)


Lesenswert?

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

von KoF (Gast)


Lesenswert?

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

von Benjamin Johann (Gast)


Lesenswert?

Ää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);      //
}

von Christian (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

signal mit oszi überprüfen.
ein schmitt-trigger bietet sich da auf jeden fall an.

von Paul Baumann (Gast)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

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

von Paul Baumann (Gast)


Lesenswert?

@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

von c-link-84 (Gast)


Lesenswert?

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

von Benjamin Johann (Gast)


Lesenswert?

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

von tenner (Gast)


Lesenswert?

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

von Benjamin Johann (Gast)


Lesenswert?

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

von Paul Baumann (Gast)


Lesenswert?

@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

von c-link-84 (Gast)


Lesenswert?

wieder was dazu gelernt

von Benjamin Johann (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

Wieviel Impulse bekommst du denn pro Umdrehung?

von Benjamin Johann (Gast)


Lesenswert?

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