drehzahl messen mit Inkrementalgeber 1024 Striche

#1144197
Lesenswert?

Hab nun alles Beiträge übers Drehzahl messen durchforstet aber noch 
nicht die Lösung für mein Problem gefunden. Ich habe einen 
Inkrementalgeber mit 1024 Strichen/Umdrehung an einem Motor mit Umax 
2890 U/min und im AVR Atmega 16 noch den Timer0 und den Timer 2 zur 
Verfügung. Timer 1 ist der Erzeugung von variablen Frequenzen im CTC 
Modus beschäftigt. Ich habe den Timer 2 als Zeitgeber laufen und den 
Timer0 als Zähler laufen. Meine Drehzahl, die ich messe und berechne 
stimmt nicht und schwankt auch sehr stark. Kontrolle erfolgt per 
Digitalem Tacho. Der zu messende Drehzalbereich liegt zwischen 50 und 
2800 Umdrehungen pro Minute. Hat jemand schon solch ein Projekt gehabt 
und kann mir da helfen? Programm ist in C auf CodeVision geschrieben.

Danke für eure Hilfe

Christian
#1150252
Lesenswert?

Hab das Zeitintervall vom Timer2 nochmal nachgerechnet, er sichert alle 
0,2 Sekunden den Multiplikator vom Timer0 und das TCNT0 Register. Da 
dürfte doch eigentlich nix schieflaufen. Bei voller Drehzahl (2890 
U/min) werden mir aber auf meinem Tacho 3185 U/min angezeigt. Geht bei 
einem DSAM net. Hab ich da Spezifikationen für den Timer0 oder Timer2 im 
Datenblatt übersehen? Der Inkrementalgeber liefert mir aber ein sauberes 
TTL Signal.

Gruß

Christian
#1150306
Lesenswert?

Route_66 wrote:
>> SpeedMaster = CountMultiplikator * 75 + CountValue * 75 / 256
>
> Besser:
> SpeedMaster = (CountMultiplikator * 64 + CountValue) * 75 / 256

reicht immer noch nicht.
Wenn ich seine Werte aus der Drehzahl mal zurückrechne, dann komm ich
auf
  38  für CountMultiplikator und 136 für CountValue

38 * 64  =    2432
           +   136  = 2568
                           * 75 = 192600

-> Game Over. 16 Bit Overflow

Hilft nichts, da muss ein unsigned long rein

 SpeedMaster = (CountMultiplikator * 64 + CountValue) * 75UL / 256


Ich würd mir auch mal die tatsächlich gemessenen Werte für 
CountMultiplikator und CountValue ausgeben lassen und das mal händisch 
durchrechnen. Aber ich bin sowieso ein Freak von: trau keiner Berechnung 
und wenn was Falsches rauskommt, dann schau dir als erstes mal die 
Eingangswerte an.
Gast #1150441
Lesenswert?

> Besser:
> SpeedMaster = (CountMultiplikator * 64 + CountValue) * 75 / 256

Wieso soll das besser sein, bitte begründen.

Ich halte es für eindeutig schlechter, denn der CountMultiplikator wird 
zu erst mit 4800 multipliziert (64 * 75), um dann durch 256 geteilt zu 
werden. Keine gute Idee, wenn 65535 nicht überschritten werden darf, 
auch nicht als Zwischenergebnis.
Gast #1150446
Lesenswert?

Ach ja, eben Karl Heinzens Werte in meine Formel einsetzen, siehe oben:

  38 * 75 + 136 * 75 / 256
= 2850    +  10200   / 256
= 2850    +         39
= 2889

Ergebnis stimmt auf 0.03%, und keiner der Werte ist zu groß.
Gast #1150471
Lesenswert?

@tuppes
Du hast die Ursprungsformel
> SpeedMaster=((CountMultiplikator*256+CountValue)*300)/1024;
nicht nach den mathematischen Regeln umgeformt wenn Du zu Deiner Formel
>> SpeedMaster = CountMultiplikator * 75 + CountValue * 75 / 256
kommst.
Die Grenze 65536 habe ich gar nicht erst in Betrachtung gezogen, wenn 
schon einfache mathematische Regeln missachtet werden!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren