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
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).
>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
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.
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
@ 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
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
>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
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
Das geht einfacher. Da die Drehrichtung analog zur Polung (DC-Motor) ist, reicht ein Hallsensor und die Überwachung der Motorspannung.
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?
Erfahrung kommt von erfahren. Und vielleicht braucht er ja gar keine punktgenaue Positionierung. Oliver
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.