Wie benüzte ich einen Counter zum hoch UND runter zählen?

OP #542422
Lesenswert?

Hallo,

ich möchte einen DC Motor mit einem Atmega16 regeln.
Zur Positions- (und Geschwindigkeits-) erfassung wir ein Zahnrad mit 
einem Hallsensor abgetastet.
Da die Hauptaufgabe des uC das Regeln sein soll, sollte das Zählen der 
Zähne in einem Counter vor sich gehen. Ich habe dabei an den 
Timer/Counter 1 gedacht.

Meine Fragen:
Wie muss man den Counter initialisieren, bzw. ein Programm schreiben, 
welches je nach Drehrichtung des Motors ein Register hoch- bzw. 
runterzählt.

Ist das überhaubt möglich?

Ich hoffe mir kann jemand dabei weiterhelfen.

Danke

Martin
Gast #542468
Lesenswert?

Für die Drehrichtung brauchst Du auf jeden Fall ein AB Signal, wie es 
aus einem Encoder kommt.
Das AB-Signal würde ich aber über Interrupteingänge mitzählen (wenn Du 
schon keinen AB-Zähler hardwaremäßig verbauen willst).
Gast #542472
Lesenswert?

>Das AB-Signal würde ich aber über Interrupteingänge mitzählen (wenn Du
>schon keinen AB-Zähler hardwaremäßig verbauen willst).
Lass das lieber.

Wie man es richtig macht, siehst du hier:
Beitrag "Drehgeber auslesen"

Und keine Angst, der Mikro hat ausreichend Leistung, neben der Regelung 
auch noch den (oder die) Drehgeber auszuwerten.

Oliver
Gast #542479
Lesenswert?

Du kannst auch nur die Drehrichtung abtasten, die Impulse über den 
Eingang T1 (Timer1) einlesen und den Zählerstand je nach Drehrichtung 
zum Vorigen Zählerstand addieren uder subtrahieren. Um den T1-Eingang 
mit dem Timer1 zu verbinden: siehe Datenblatt. Ein Interrupt wird zum 
Zählen von Timer1 nicht benötigt, nur zur Drehrichtungserkennung.
OP #542494
Lesenswert?

Danke für die Antworten

Die Lösung von Power hört sich ganz gut an, da ich keinen Encoder 
benützen möchte.
Ist dies aber auch mit einem Interrupt pro Zahn möglich oder werden das 
dann zu viele Interrupts. Ich hätte gerne so oft wie möglich den 
aktuellen Zählerstand.

Martin
#542499
Lesenswert?

@ Martin Almstätter

>Ist dies aber auch mit einem Interrupt pro Zahn möglich oder werden das

Bei einm AB-Encoder geht das nicht anders. Schlimmer noch, du musst 
mind. 2 mal schneller abtasten (im Timerinterrupt) als die höchste 
Freqeunz des Encoders.

>dann zu viele Interrupts. Ich hätte gerne so oft wie möglich den
>aktuellen Zählerstand.

Das ist Quark. Welche Abtastfreqeunz benutzt denn deine Reglung?

MfG
Falk
Gast #542790
Lesenswert?

>Die Lösung von Power hört sich ganz gut an, da ich keinen Encoder
>benützen möchte.

Und als nächstes kommt die Frage: Wer kennt einen Hall-Geber mit Impuls- 
und Drehrichtungsausgang?

Warum wohl gibt es Encoder? So etwas lässt sich auch z.B. über eine 
Strichscheibe und zwei (Gabel-)Lichtschranken bauen. Oder zwei versetzte 
Hall-Geber auf einem Zahnrad. Oder, oder, oder. Aber um das Prinzip der 
zwei um 90 Grad versetzten Impulskanäle wirst du nicht herumkommen.
Schau mal bei den Roboter-Freaks vorbei. Die kennen das Problem nicht 
nur, die haben auch Lösungen dafür.

Oliver
Gast #542959
Lesenswert?

Schön, dass Du in die Zukunft schauen kannst, aber leider mit der 
falschen Voraussage.

Ich würde aber nicht nach dieser Lösung fragen, wenn die Hardware nicht 
schon komplett stehen würde.

Versuche es erst mal so. Sollte für meinen Zweck eigentlich reichen. Ich 
weiß ja über die geschalteten Ausgänge in welche Richtung ich drehe.

ma112de
Gast #543166
Lesenswert?

Das wird aber eine Trickserei mit der Reglerdimensionierung.
Motor läuft links mit x rpm, Polung wird vertauscht, Motor wird aber 
weiterhin nach links laufen und mit einer mechanisch definierten Rampe 
die Richtung wechseln, die aufgenommenen Impulse zählen aber schon nach 
rechts und anhand derer wird geregelt. Na Prost Mahlzeit, wie willst Du 
dem Regler beibringen, dass er Vorzeichenverkehrt regelt?
Gast #543823
Lesenswert?

Was soll denn eigentlich die Diskussion wegen Drehrichtungserkennung? 
Ist mir grade aufgefallen: Wenn ich den Motor mit dem µC steuere weiß 
ich IMMER in welche Richtug der Motor dreht, dann brauche ich nur noch 
die Zähne zu zählen und, wie in meinem Posting oben beschrieben, den 
Zählerstand addieren oder subtrahieren.
Zur eigentlichen Frage wie der Counter eingestellt werden muss:
im Register TCCR1B die bits CS11 und CS12 oder CS10, CS11 und CS12 (je 
nach Flankenrichtung) setzen um den Timer mit dem T1-Eingang (PORTB1, 
Pin 2) hochzuzählen.
Das ist alles. Du brauchst keinen Interrupt oder Ähnliches, nur den 
Timer per Software zu Beginn des Zählvorganges auf null setzen und am 
Ende des Zählvorganges (evtl. interruptgesteuerte Torzeit) den 
Zählerstand ablesen. Falls eine bestimmte Anzahl Steps (Impulse) 
gefahren werden soll kann das auch mittels Output-Compare-INT realisiert 
werden. Phantasie spielen lassen! ;-)

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