So, ich hab jetzt den Asuro dazu gebracht, sich mit der Geschwindigkeit von 1cm/sec zu bewegen. Eine Fahrt kann man es aber nicht wirklich nennen, es ist mehr ein Gehoppel. Aber er bewegt sich exakt mit 1cm/sec, sowohl auf Teppich als auch auf glattem Untergrund. Das Testprogramm ist angehängt.
Das Prinzip ist, dass er sich alle 0.3sec um 3mm fort bewegt. Die 3mm entsprechen einem Encoder-Tick. Damit er die Haftreibung auch bei schwerem Gelände überwindet, ist eine PWM von 120 eingestellt. Dadurch bewegt er sich ruckartig. Mit dem PWM-Wert kann man noch variieren, aber zu klein darf er nicht werden, sonst läuft er nicht an und zu gross auch nicht, sonst macht er gleich 2 Ticks auf einmal.
Mit dem Testprogramm kann man per Tastendruck die Geschwindigkeit von 0.2cm/sec bis 5cm/sec verändern. Siehe dazu den Sourcecode.
Waste
Code:
/*******************************************************************************
*
* Description: Schleichfahrt
*
*****************************************************************************/
#include "asuro.h"
#include <stdlib.h>
int main(void)
{
unsigned char flagl, flagr, links, rechts, weiter, sw;
unsigned int data[2], dt;
unsigned long zeit;
Init();
MotorDir(BREAK,BREAK);
MotorSpeed(120,120);
OdometrieData(data);
OdometrieData(data);
if (data[0] > 600) flagl = TRUE; // Flag setzen
else flagl = FALSE;
if (data[1] > 600) flagr = TRUE; // Flag setzen
else flagr = FALSE;
dt=300;
zeit=Gettime();
zeit += dt;
while(1){
if (Gettime() > zeit){
links = FWD; rechts = FWD;
MotorDir(FWD,FWD);
weiter = 1;
while(weiter){ // fahre einen Schritt
OdometrieData(data); // messe Odometrie
if ((data[0] < 550) && (flagl == TRUE)) {flagl = FALSE; links = BREAK;}
if ((data[0] > 650) && (flagl == FALSE)) {flagl = TRUE; links = BREAK;}
if ((data[1] < 550) && (flagr == TRUE)) {flagr = FALSE; rechts = BREAK;}
if ((data[1] > 650) && (flagr == FALSE)) {flagr = TRUE; rechts = BREAK;}
MotorDir(links,rechts);
if ((links == BREAK) && (rechts == BREAK)) weiter = 0;
}
zeit += dt;
}
sw = PollSwitch();
if (sw & 0x01)
dt = 60; //5cm/sec
if (sw & 0x02)
dt = 100; //3cm/sec
if (sw & 0x04)
dt = 150; //2cm/sec
if (sw & 0x08)
dt = 300; //1cm/sec
if (sw & 0x10)
dt = 600; //0.5cm/sec
if (sw & 0x20)
dt = 1500; //0.2cm/sec
}
while(1);
return 0;
}
Lesezeichen