Phi - Ein Roboter als Haustier und Gartenbewohner
http://parinor.pureplayaz.de/

OBEN RUNTER Zusammenfassung der genutzten μC-Peripherie des ATmega32


OBEN RUNTER HOCH Die Pinbelegung

PORT A
  • PinA 0
  • PinA 1
  • PinA 2
  • PinA 3
  • PinA 4
  • PinA 5
  • PinA 6
  • PinA 7
PORT B
  • PinB 0
  • PinB 1
  • PinB 2
  • PinB 3
  • PinB 4
  • PinB 5
  • PinB 6
  • PinB 7
PORT C
  • PinC 0
  • PinC 1
  • PinC 2    IN_0 Linker Motor
  • PinC 3    IN_0 Rechter Motor
  • PinC 4    IN_1 Linker Motor
  • PinC 5    IN_1 Rechter Motor
  • PinC 6    LED2
  • PinC 7    Taster
PORT D
  • PinD 0 (USART Rx)
  • PinD 1 (USART Tx)
  • PinD 2 (Int0)    Radencoder links
  • PinD 3 (Int1)    Radencoder rechts
  • PinD 4 (OC1B)    PWM linker Motor
  • PinD 5 (OC1A)    PWM rechter Motor
  • PinD 6
  • PinD 7


OBEN RUNTER HOCH Die externen Interrupts

Für die Fahrtregelung müssen die Impulse aus den beiden Radencodern hochgezählt und mit der verstrichenen Zeit verglichen werden. Als Zeitbasis wird der ohnehin regelmäßig überlaufende T/C1 genutzt, dessen ISR übergibt die aktuelle Impulsanzahl an die Regelung.
Gezählt werden die Impulse mit den externen Interrupts INT0 und INT1.
GICR:   [ INT1 ] = 1   [ INT0 ] = 1
Dabei sollen die Interrupts bei steigender Flanke erfolgen. Um eine doppelte Auflösung zu erhalten, könnte man auch bei jedem Flankenwechsel die ISR ausführen lassen.
MCUCR:   [ ISC11 ] = 1   [ ISC10 ] = 1   [ ISC01 ] = 1   [ ISC00 ] = 1


OBEN HOCH Der Timer/Counter 1

Dieser Zähler wird für die PWM-Ansteuerung der Motoren verwendet. Er ist wie geschaffen für diese Anwendung, da er zwei unabhängige Vergleichseinheiten beinhaltet, mit denen zwei PWM-Kanäle gesteuert werden können.

Betrieben wird der T/C1 im Fast PWM Mode, ich nutze ihn im 8-bit Modus. Diese Auflösung reicht für die Drehzahlregelung aus. Folgende Flags konfigurieren die Modi des Zählers:
TCCR1A:   [ WGM11 ] = 0   [ WGM10 ] = 1
TCCR1B:   [ WGM13 ] = 0   [ WGM12 ] = 1

Über den Vorteiler läßt sich die Taktfrequenz in verschiedenen Größenordnungen einstellen. Zu Beachten ist, daß eine falsche Taktung zu Problemen führen kann. Ist die Taktfrequenz zu niedrig, brummt der Motor, läuft unruhig und eine Regelung wird schwieriger. Ist sie zu hoch, kommt es zu hohen Ummagnetisierungsverlusten, die in Wärme umgewandelt werden und die Magnete langfristig schädigen können. Hinzu kommt, daß ein Motor im niedrigen Drehzahlbereich mit einer niedrigen PWM-Frequenz auch ein höheres Drehmoment hat.
Ein Versuch mit den drei größten Vorteilern bestätigte meine Erwartungen. Mit clk/64 (488 Hz) lief der Motor bei einem Tastgrad von etwa 30 % nicht an, mit clk/1024 (30,5 Hz) brummte er und es gab deutliche Vibrationen. Nur bei dem mittleren Vorteiler clk/256 mit der PWM-Frequenz von 122 Hz lief der Motor gut.
Die Taktfrequenz wird über die drei Clock Select bits im TCCR1B-Register eingestellt.
TCCR1B:   [ CS12 ] = 1   [ CS11 ] = 0   [ CS10 ] = 0

Um die Pulsweite zu steuern, verändert man die Werte in OCR1A bzw. OCR1B. Dies sind auch die Register, die von der Pulsweitenregelung automatisch angepasst werden. Mit der u.g. Konfiguration im TCCR1A steigt der Tastgrad mit steigenden Werten in diesen Vergleichsregistern. Da der Zähler im 8-bit Modus betrieben wird, reicht es, nur die niedrigen 8 Bit der Vergleichsregister zu schreiben. Die hohen müssen 0 sein.
OCR1AH = 0
OCR1BH = 0
  0 < OCR1AL < 256
  0 < OCR1BL < 256

Das Verhalten der beiden Ausgänge PinD5 (OC1A) und PinD4 (OC1B) wird ebenfalls im TCCR1A-Register eingestellt. Der Einfachheit halber sollen die Pins auf HIGH gestellt werden, wenn der Zähler überläuft und auf LOW umschalten, wenn der Zähler und die Vergleichsregister OCR1A bzw. OCR1B übereinstimmen. Um einen Motor abzuschalten, reicht es, das zugehörige Flag (COM1A1 / COM1B1) null zu setzen. Sicherheitshalber werden die Pins PinD4/PinD5 als Ausgang konfiguriert und auf GND gelegt.
TCCR1A:   [ COM1A1 ] = 1   [ COM1A0 ] = 0   [ COM1B1 ] = 1   [ COM1B0 ] = 0
DDRC :   [ DDD5 ] = 1   [ DDD4 ] = 1
PORTD:   [ PIND5 ] = 0   [ PIND4 ] = 0

OBEN Letzte Änderung: 21. Januar 2013 - © Per Petersen