diff --git a/ADIS_tinyK22_SplitFlap/source/application.c b/ADIS_tinyK22_SplitFlap/source/application.c index 1fa4d08..bd31d75 100644 --- a/ADIS_tinyK22_SplitFlap/source/application.c +++ b/ADIS_tinyK22_SplitFlap/source/application.c @@ -73,7 +73,7 @@ void App_Init(void){ void App_Run(void){ PRINTF("Initializing split flap motors.\n"); - bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 2); + bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 20); PRINTF("Init of motors done. Success = %s\n\n", successfulInit ? "true" : "false"); // if init failed => stop diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.c b/ADIS_tinyK22_SplitFlap/source/splitflap.c index 8e6cd13..75e63bc 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.c @@ -59,7 +59,7 @@ SF_Handle_t SF_Init(SF_Config_t* instance, int id){ return splitflap; } -bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments){ +bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, uint16_t offsetSteps){ int numStepsMoved = 0; // move out of sensor @@ -68,30 +68,28 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments){ McuWait_Waitms(20); } - // turn until sensor is on + // turn until sensor is on and not reached one full rotation already (timeout) while(SF_GetMagSensorAtZeroPosition((SF_t*)instance) == false && numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND ){ McuULN2003_IncStep(((SF_t*)instance)->motor); McuWait_Waitms(20); numStepsMoved++; } - // one more segment if not already one round + // offset after init if(numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND){ - // +0.5 so that the rounding is done correctly - int8_t offsetSteps = offsetSegments * SPLITFLAP_STEPS_ONE_ROUND/SPLITFLAP_AMOUNT_OF_SEGMENTS; // (int8_t)((float)offsetSegments*SPLITFLAP_STEPS_PER_SEGMENT + 0.5); for(int i=0; i < offsetSteps; i++){ McuULN2003_IncStep(((SF_t*)instance)->motor); McuWait_Waitms(20); - numStepsMoved++; } } McuULN2003_SetPos(((SF_t*)instance)->motor, 0); McuULN2003_PowerOff(((SF_t*)instance)->motor); + // success if less than one rotation return numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND; } -void SF_MoveSteps(SF_Handle_t instance, int32_t steps){ +void SF_MoveSteps(SF_Handle_t instance, uint32_t steps){ // run move with acceleration & deceleration McuULN2003_AccelerationStart(((SF_t*)instance)->motor); while(steps>0){ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.h b/ADIS_tinyK22_SplitFlap/source/splitflap.h index 0a28ac3..7132b85 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.h +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.h @@ -52,11 +52,12 @@ SF_Handle_t SF_Init(SF_Config_t* instance, int id); /* Moves split flap slowly to zero position. * returns true if the move was successful, false if not * (depending on if the sensor was hit before one round) - * with the offsetSegments parameter, the amount of segments to offset can be given */ -bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments); + * offsetSteps: amount of steps to offset from magnet sensor positive flank position + * After moving to zero position, the current position of the motor is set to 0 */ +bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, uint16_t offsetSteps); -/* split flap moves number of steps maybe uint16_t? */ -void SF_MoveSteps(SF_Handle_t instance, int32_t steps); +/* split flap moves number of steps (uint, since only forward moves are allowed) */ +void SF_MoveSteps(SF_Handle_t instance, uint32_t steps); /* get mag sensor state. returns true if sensor is at zero position, otherwise false */ bool SF_GetMagSensorAtZeroPosition(SF_Handle_t instance);