Forum: Mikrocontroller und Digitale Elektronik drehzahl messen mit Inkrementalgeber 1024 Striche


von Christian B. (chrisbe3)


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

von STK500-Besitzer (Gast)


Lesenswert?

>Programm ist in C auf CodeVision geschrieben.

Welches? Und wo zu finden?

von Christian B. (chrisbe3)


Angehängte Dateien:

Lesenswert?

Sorry, hatte das File vergessen....

von Christian B. (chrisbe3)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Könnte es sein, daß ein Inkrementaldrehgeber für die Drehzahlmessung 
recht ungeeignet ist?

Hier treten Frequenzen von immerhin knapp 50 kHz auf - ist denn der 
Drehgeber dafür überhaupt ausreichend schnell?

von tuppes (Gast)


Lesenswert?

> SpeedMaster=((CountMultiplikator*256+CountValue)*300)/1024;

Bei 16-Bit-Multiplikation läuft der Klammerausdruck vor der Division 
garantiert über, sobald CountMultiplikator > 0 ist

von tuppes (Gast)


Lesenswert?

SpeedMaster = CountMultiplikator * 75 + CountValue * 75 / 256

so siehts doch schon viel freundlicher aus.

von Route_66 (Gast)


Lesenswert?

> SpeedMaster = CountMultiplikator * 75 + CountValue * 75 / 256

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

von Karl H. (kbuchegg)


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.

von tuppes (Gast)


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.

von tuppes (Gast)


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

von Axel K. (axel)


Lesenswert?

Was ist ein Inkrementalgeber? Ist das soeine Scheibe wie in einer 
Kugelmaus? Wenn ja, warum hat diese dann soviele Striche?

von Route_66 (Gast)


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!

von Route_66 (Gast)


Lesenswert?

Sorry, selbst ich habe da einen Fehler gemacht: wenn schon vierteln der 
Faktoren dann natürlich auch CountValue!!!

von Route_66 (Gast)


Lesenswert?

Also am besten mit unsigned long arbeiten, damit auch nach einer 
Umrechnung die Auflösung erhalten bleibt!

von tuppes (Gast)


Lesenswert?

> Was ist ein Inkrementalgeber?

http://de.wikipedia.org/wiki/Inkrementalgeber

> Ist das soeine Scheibe wie in einer Kugelmaus?
> Wenn ja, warum hat diese dann soviele Striche?

Zum Regeln im Millisekunden-Takt. Schnelle Regler brauchen noch 
schnelleren Input.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Zum Regeln im Bogenminuten-Bereich. Genaue Regler brauchen noch
genaueren Input.

von Christian B. (chrisbe3)


Lesenswert?

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

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.