Changeset 588 for branches/atorf/NXC/MotorControl2/NextGenMotor.nxc
- Timestamp:
- 05/13/09 16:38:49 (4 years ago)
- Files:
-
- 1 modified
-
branches/atorf/NXC/MotorControl2/NextGenMotor.nxc (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/atorf/NXC/MotorControl2/NextGenMotor.nxc
r587 r588 43 43 44 44 #define LASTSTEPBRAKINGDEG 2 45 #define ENDGAMEBRAKINGSTARTDIST 10 45 46 46 47 … … 133 134 134 135 long absBrakingDist; 136 long brakingStartSpeed; 137 long brakingStartTacho; 135 138 136 139 long loopStartTick; … … 141 144 long err_1 = 0; // prev. error (t = - T) 142 145 long curPIDPowerUpscaled = absPower * PIDUPSCALING; 146 long newAbsPower; 143 147 144 148 // speed stuff … … 201 205 curSpeed = ((MotorTachoCount(port) - TachoCountLog[SpeedLogIndex]) * 1000) / (CurrentTick() - TickCountLog[SpeedLogIndex]); 202 206 207 //TODO optimize speed logging by using only 2 history values and toggling between them 208 203 209 // record speedlog data to previous index... 204 210 i = SpeedLogIndex - 1; … … 234 240 235 241 absBrakingDist = GetAbsBrakingDistFromAbsSpeed(abs(curSpeed)); 236 if ( abs(tacho limit - MotorTachoCount(port)) <= absBrakingDist ) {242 if ( abs(tachoTarget - MotorTachoCount(port)) <= absBrakingDist ) { 237 243 // ok, we're close enough, start braking! 238 244 curStage = STAGE_BRAKING; 245 // record this for later down (for speed lookup) 246 brakingStartSpeed = curSpeed; 247 brakingStartTacho = powerSgn * (tacholimit - absBrakingDist); 239 248 //TODO disable SPEED REG if needed!!! 240 249 }//end if … … 253 262 if (curStage == STAGE_BRAKING) { 254 263 255 //TODO set x, initSpeed256 257 264 // shift/calculate all errors for current cycle 258 265 err_1 = err_0; 259 err_0 = curSpeed - GetIdealSpeedFromPos( x, initSpeed, absBrakingDist);266 err_0 = curSpeed - GetIdealSpeedFromPos(abs(MotorTachoCount(port) - brakingStartTacho), brakingStartSpeed, absBrakingDist); 260 267 261 268 … … 264 271 + (KP * err_1); 265 272 273 266 274 //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 267 286 268 287 #ifdef ENABLEDEBUGGING_REMOTE … … 282 301 waitEndTick = loopStartTick + LOOP_DURATION; 283 302 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 286 309 }//end while 287 310 … … 293 316 294 317 // fast inner loop now! 318 // don't forget TIMEOUT or something, avoid possible lock up 295 319 296 320 }//end if
