Show
Ignore:
Timestamp:
05/13/09 16:38:49 (4 years ago)
Author:
atorf
Message:
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/atorf/NXC/MotorControl2/NextGenMotor.nxc

    r587 r588  
    4343 
    4444#define LASTSTEPBRAKINGDEG 2 
     45#define ENDGAMEBRAKINGSTARTDIST 10 
    4546 
    4647 
     
    133134 
    134135    long absBrakingDist; 
     136    long brakingStartSpeed; 
     137    long brakingStartTacho; 
    135138 
    136139    long loopStartTick; 
     
    141144    long err_1 = 0;  // prev.   error (t = - T) 
    142145    long curPIDPowerUpscaled = absPower * PIDUPSCALING; 
     146    long newAbsPower; 
    143147 
    144148    // speed stuff 
     
    201205        curSpeed = ((MotorTachoCount(port) - TachoCountLog[SpeedLogIndex]) * 1000) / (CurrentTick() - TickCountLog[SpeedLogIndex]); 
    202206 
     207        //TODO optimize speed logging by using only 2 history values and toggling between them 
     208 
    203209        // record speedlog data to previous index... 
    204210        i = SpeedLogIndex - 1; 
     
    234240         
    235241            absBrakingDist = GetAbsBrakingDistFromAbsSpeed(abs(curSpeed)); 
    236             if ( abs(tacholimit -  MotorTachoCount(port)) <= absBrakingDist ) { 
     242            if ( abs(tachoTarget -  MotorTachoCount(port)) <= absBrakingDist ) { 
    237243                // ok, we're close enough, start braking! 
    238244                curStage = STAGE_BRAKING; 
     245                // record this for later down (for speed lookup) 
     246                brakingStartSpeed = curSpeed; 
     247                brakingStartTacho = powerSgn * (tacholimit - absBrakingDist); 
    239248                //TODO disable SPEED REG if needed!!! 
    240249            }//end if 
     
    253262        if (curStage == STAGE_BRAKING) { 
    254263 
    255             //TODO set x, initSpeed 
    256  
    257264            // shift/calculate all errors for current cycle 
    258265            err_1 = err_0; 
    259             err_0 = curSpeed - GetIdealSpeedFromPos(x, initSpeed, absBrakingDist); 
     266            err_0 = curSpeed - GetIdealSpeedFromPos(abs(MotorTachoCount(port) - brakingStartTacho), brakingStartSpeed, absBrakingDist); 
    260267 
    261268 
     
    264271                                + (KP * err_1); 
    265272 
     273 
    266274            //TODO clip these values! 
     275            newAbsPower = curPIDPowerUpscaled / PIDUPSCALING; 
     276            if (newAbsPower > 100) { 
     277                newAbsPower = 100; 
     278            } else if (newAbsPower < 1) { 
     279                newAbsPower = 1; 
     280            }//end if 
     281             
     282            //finally set new power! 
     283            UpdatePower(port, sgn * newAbsPower); 
     284             
     285             
    267286 
    268287            #ifdef ENABLEDEBUGGING_REMOTE 
     
    282301        waitEndTick = loopStartTick + LOOP_DURATION; 
    283302        while (CurrentTick() < waitEndTick) { 
    284             // check tacho count... 
    285          
     303 
     304            if ( abs(tachoTarget - MotorTachoCount(port)) <  ENDGAMEBRAKINGSTARTDIST) { 
     305               curStage = STAGE_ENDGAME; 
     306               break; 
     307            }//end if 
     308             
    286309        }//end while 
    287310 
     
    293316         
    294317            // fast inner loop now! 
     318            // don't forget TIMEOUT or something, avoid possible lock up 
    295319             
    296320        }//end if