Forum: Compiler & IDEs Wie benüzte ich einen Counter zum hoch UND runter zählen?


von Martin A. (ma112de)


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

von Sardaukar (Gast)


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

von OliverSo (Gast)


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

von Power (Gast)


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.

von Martin A. (ma112de)


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

von Falk B. (falk)


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

von Martin A. (ma112de)


Lesenswert?

Hallo Falk,

über die Regelung habe ich mir noch keine Gedanken gemacht. Wollte mir 
erst mal überlegen, wie ich die benötigten Werte einlesen kann.
Durch eure Antworten, sollte ich das nun aber schon hinbekommen.

Also erst mal herzlichen Dank.

Martin

von OliverSo (Gast)


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

von ma112de (Gast)


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

von Jupp (Gast)


Lesenswert?

Das geht einfacher. Da die Drehrichtung analog zur Polung (DC-Motor) 
ist, reicht ein Hallsensor und die Überwachung der Motorspannung.

von Sardaukar (Gast)


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?

von OliverSo (Gast)


Lesenswert?

Erfahrung kommt von erfahren.
Und vielleicht braucht er ja gar keine punktgenaue Positionierung.

Oliver

von Power (Gast)


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! ;-)

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.