drehzahl messen mit Inkrementalgeber 1024 Striche

OP #1144197
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
OP #1150252
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
Gast #1150264
> SpeedMaster=((CountMultiplikator*256+CountValue)*300)/1024;

Bei 16-Bit-Multiplikation läuft der Klammerausdruck vor der Division 
garantiert über, sobald CountMultiplikator > 0 ist
#1150306
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
> 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
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
@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!
OP #1150808
sorry wegen dem int, habe es nach dem Posten des Programm geändert weil 
es nicht im Aufbau lief.
Könnte ich es auch über eine Periodendauermessung machen? Ich muss nach 
der Drehzahlmessung den Wert noch weiterbehandeln und dem Timer1 zur 
Frequenzerzeugung zuführen.

Gruß


Christian

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.