mikrocontroller.net

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


Autor: Christian Berndt (chrisbe3)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Programm ist in C auf CodeVision geschrieben.

Welches? Und wo zu finden?

Autor: Christian Berndt (chrisbe3)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hatte das File vergessen....

Autor: Christian Berndt (chrisbe3)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> SpeedMaster=((CountMultiplikator*256+CountValue)*300)/1024;

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

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SpeedMaster = CountMultiplikator * 75 + CountValue * 75 / 256

so siehts doch schon viel freundlicher aus.

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> SpeedMaster = CountMultiplikator * 75 + CountValue * 75 / 256

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Axel Krüger (axel)
Datum:

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

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Route_66 (Gast)
Datum:

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

Autor: Route_66 (Gast)
Datum:

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

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Regeln im Bogenminuten-Bereich. Genaue Regler brauchen noch
genaueren Input.

Autor: Christian Berndt (chrisbe3)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.