@sternthaler
Hier der Code von Move(..). Inspiriert von Travel(..) und Rotate(..).
Allerdings bereitet Move(..) nur vor.
Die einfache encoder-Regelung (auch inspiriert von Travel(..) bzw. Rotate(..)) ist in SIGNAL (SIG_OVERFLOW2) {..} eingehängt, ähnlich wie dies für IsrRC5() in der Lib gemacht wird.
Code:
/* @param leftSpeed left motor speed in ticks per second. positive = forward, negative = backward
* @param rightSpeed right motor speed in ticks per second. positive = forward, negative = backward
* @param distance [mm].
* Stop if sum(leftTicks, rightTicks) > abs(distance).
* Run in background if distance<=0.
* Forever if distance==0.
* @return err in number of summed ticks
*/
int Move(const int leftSpeed_, const int rightSpeed_, int distance_) {
int tmp;
Ta=0;
if(t1==0 || Gettime()-t1>1000) {
t1=Gettime();
EncoderReset();
}
// We want to have at least 3 ticks collected from slowest encoder side and timeslot.
// Deshalb, Suche sinnvolles Zeitintervall
// Idea: Ta=1000/(ticks/3)
tmp= abs( (abs(leftSpeed_)<abs(rightSpeed_)) ? leftSpeed_ : rightSpeed_ );
tmp= (tmp>0) ? 3*1000/tmp : 10;
if (tmp<10) tmp=10; //not to smal
if (tmp>300) tmp=300; //not to big
// Werte für Interruptroutine
measure=(distance_!=0);
distance=distance_*6/10;
leftSpeed=leftSpeed_;
rightSpeed=rightSpeed_;
Ta=tmp;
while(distance>0&&distance_>0&&leftSpeed!=0&&rightSpeed!=0) mSleep(1);
return distance;
}
Lesezeichen