mikrocontroller.net

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


Autor: Martin Almstätter (ma112de)
Datum:

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

Autor: Sardaukar (Gast)
Datum:

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

Autor: OliverSo (Gast)
Datum:

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

Autor: Power (Gast)
Datum:

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

Autor: Martin Almstätter (ma112de)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Martin Almstätter (ma112de)
Datum:

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

Autor: OliverSo (Gast)
Datum:

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

Autor: ma112de (Gast)
Datum:

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

Autor: Jupp (Gast)
Datum:

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

Autor: Sardaukar (Gast)
Datum:

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

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erfahrung kommt von erfahren.
Und vielleicht braucht er ja gar keine punktgenaue Positionierung.

Oliver

Autor: Power (Gast)
Datum:

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

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.