Motorsteuerung mit AVRco

Aus c't-Bot Wiki
Wechseln zu: Navigation, Suche

Im ersten Beispiel lernen wir die Motorsteuerung mit einigen typische Prozeduren und Funktionen des Pascal-Dialektes kennen. Das Programm wird übersetzt und mit Hilfe von PonyProg auf den Bot übertragen.

Im ersten Schritt legen wir eine neues Projekt an (File|New Project). Im sich öffnenden Fenster sind die Bezeichnung des Projektes, der Pfad sowie der Name der Hauptdatei auszuwählen.

Projekt-Menü
Auswahl des Prozessors
PWM-Kanäle
Digitale Ausgänge

Das Programm bietet in den folgenden Dialogen die Einbindung diverser Treiber und die Konfiguration der Pins des Prozessors an. In unserem Beispiel soll zunächst nur die Motorsteuerung verwendet werden. Daher werden die PWM-Kanäle PWMPort1A und PWMPort1B aktiviert. Die Drehrichtung der Motoren kann über die Pins PC6 und PC7 gesteuert werden. Da standardmäßig alle Pins als Eingänge geschaltet sind, werden die DataDirection Bits entsprechend auf Ausgang "o" geschaltet.

Im letzten Fenster wählen wir die Buttons "Build Application", dann "store" und zuletzt "exit". Daraufhin wird der Rahmencode des Projektes erzeugt und im Editorfenster angezeigt. Sollte das Editorfenster leer bleiben kann die Datei über File|Open MainFile geöffnet werden.

<c> program motortest;

{ $BOOTRST $03800} {Reset Jump to $03800} {$NOSHADOW} { $W+ Warnings} {Warnings off}

Device = mega32, VCC=5;

Import SysTick, PWMport1A, PWMport1B;

From System Import ;

Define

 ProcClock      = 16000000;       {Hertz}
 SysTick        = 10;             {msec}
 StackSize      = $0064, iData;
 FrameSize      = $0064, iData;
 PWMres1        = 8;              {bits}
 PWMpresc1      = 64;

Implementation

{$IDATA}

{--------------------------------------------------------------} { Type Declarations }

type


{--------------------------------------------------------------} { Const Declarations }


{--------------------------------------------------------------} { Var Declarations } {$IDATA}


{--------------------------------------------------------------} { functions }

procedure InitPorts; begin

 DDRC:=  %11000000;

end InitPorts;


{--------------------------------------------------------------} { Main Program } {$IDATA}

begin

 InitPorts;


 EnableInts;
 loop


 endloop;

end motortest.

</c> Die Einträge sind eigentlich fast alle selbsterklärend. Der erste wichtige Eintrag wäre die Deklaration der Prozedur InitPorts. Dort ist zu sehen, wie die Pins PC6 und PC7 als Ausgänge konfiguriert werden.

Das eigentliche Hauptprogramm zwischen Begin und End initialisiert die Treiber, die Pins und tritt dann in eine Endlosschleife (loop endloop).

Die Pins für die Steuerung der Drehrichtung der Motoren werden an Variablennamen gebunden damit sie innerhalb von Programmen einfach geändert werden können.

<c> {--------------------------------------------------------------} { Var Declarations } {$IDATA} var

  motli[@PortC,6]: bit;
  motre[@PortC,7]: bit;

{--------------------------------------------------------------} </c>

Die Drehrichtung der Motoren kann nun über die Zuweisung der Werte 0 oder 1 an die beiden Variablen motli und motre geändert werden. Zu beachten wäre noch dass, die Motoren bei gleicher Polung entgegengesetzt drehen. Für einfache Fahrversuche implmentieren wir zunächst 4 Prozeduren für die Fahrtrichtung: fwd für Vorwärtsfahrt, bwd für Rückwärtsfahrt turnle für Linkskurve (beide Räder drehen entgegengesetzt) turnre für Rechtskurve. Mit der Prozedur speed kann die Drehzahl der Motoren zwischen 0 und 255 verändert werden.


<c> procedure fwd; begin

    PWMPort1A:=0;
    PWMPort1B:=0;
    Motli:=1;
    MotRe:=0;

end;

procedure bwd; begin

    PWMPort1A:=0;
    PWMPort1B:=0;
    Motli:=0;
    MotRe:=1;

end;

procedure turnle; begin

    PWMPort1A:=0;
    PWMPort1B:=0;
    Motli:=1;
    MotRe:=1;

end;

procedure turnre; begin

    PWMPort1A:=0;
    PWMPort1B:=0;
    Motli:=0;
    MotRe:=0;

end;

procedure speed(speedli,speedre: word); begin

    PWMPort1A:=speedli;
    PWMPOrt1B:=speedre;

end; </c>

Damit der Roboter zunächst gerade aus, dann eine Linkskurve fährt und anhält und anschließend noch einmal eine kurze Strecke im Rückwärtsgang zurücklegt und kurz auf der Stelle dreht, sind im Hauptprogramm zwischen loop und endloop folgende Zeilen einzufügen:

<c>

   mdelay(2000);            {Warte 2 Sekunden}
   fwd;                     {Vorwärtsgang}
   speed(120,120);          {gleiche Geschwindigkeit}
   mdelay(2000);            {Fahrt für 2 Sekunden}
   speed(40,120);           {leichte Linkskurve}
   mdelay(1000);            {Fahrt für 1 Sekunde}
   speed(0,0);              {halt}
   bwd;                     {Rückwärtsgang}
   speed(60,60);            {gleiche Geschwiwndigkeit}
   mdelay(2000);            {Fahrt für 2 Sekunden}
   speed(0,0);              {halt}
   turnre;                  {Rechtsdrehung}
   speed(50,50);            
   mdelay(500);             {für 0.5 Sekunden}
   speed(0,0);              {halt}

</c>

Nun muss das Programm noch übersetzt und z.B. mit Hilfe von PonyProg in den Bot geladen werden. In der Werkzeugleiste finden sich folgende Schaltflächen:

Leiste-kurz.png

Mit dem Hammer wird das Projekt in die ausführbare Hex-Datei übersetzt und kann dann in den Bot geladen werden.

So das wars fürs erste. Im nächsten Tutorial wird gezeigt, wie der Bot sich mit Hilfe einer Fernbedienung steuern lässt.