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
>Programm ist in C auf CodeVision geschrieben.
Welches? Und wo zu finden?
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
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?
> SpeedMaster=((CountMultiplikator*256+CountValue)*300)/1024;
Bei 16-Bit-Multiplikation läuft der Klammerausdruck vor der Division
garantiert über, sobald CountMultiplikator > 0 ist
SpeedMaster = CountMultiplikator * 75 + CountValue * 75 / 256 so siehts doch schon viel freundlicher aus.
> SpeedMaster = CountMultiplikator * 75 + CountValue * 75 / 256
Besser:
SpeedMaster = (CountMultiplikator * 64 + CountValue) * 75 / 256
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.
> 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.
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ß.
Was ist ein Inkrementalgeber? Ist das soeine Scheibe wie in einer Kugelmaus? Wenn ja, warum hat diese dann soviele Striche?
@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!
Sorry, selbst ich habe da einen Fehler gemacht: wenn schon vierteln der Faktoren dann natürlich auch CountValue!!!
Also am besten mit unsigned long arbeiten, damit auch nach einer Umrechnung die Auflösung erhalten bleibt!
> 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.
Zum Regeln im Bogenminuten-Bereich. Genaue Regler brauchen noch genaueren Input.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.