diff --git a/inc/main.h b/inc/main.h index a5dde62..cb02140 100644 --- a/inc/main.h +++ b/inc/main.h @@ -49,9 +49,11 @@ #define SPEED_PIN PB2 // Pin 7/ADC1 #define BUTTON_PIN PB4 // Pin 3 - Button input +#define MOTOR_RAMPDOWN_DIST 16 #define MOTOR_PULSE 6 //uS motor base pulse + /*The timing of "ticks" is dependent on the AVR timer's counter register * so for an 8bit register the maximum value is 256. Given we stick with * a 1Mhz cpu frequency can use this formula to calculate the number of diff --git a/src/main.c b/src/main.c index 92aaaac..ff44432 100644 --- a/src/main.c +++ b/src/main.c @@ -142,11 +142,23 @@ void MotorMoveTo(uint8_t target) { uint8_t on_delay = ReadSpeed(); uint8_t pos = ReadFader(); + uint8_t delta = diff(target, pos); uint8_t idx = 0; - while (diff(target, pos) > 4) { - on_delay = ReadSpeed(); + while (delta > 0) { pos = ReadFader(); + delta = diff(target, pos); + + //Impliment a ramp down when near target position. + if(delta <= MOTOR_RAMPDOWN_DIST){ + //Ignore speed value and set for 50% speed. + on_delay = 127; + } + //Otherwise use the speed input. + else{ + on_delay = ReadSpeed(); + } + if (target > pos) { MotorMove(1); } else { @@ -161,6 +173,7 @@ void MotorMoveTo(uint8_t target) { for (; idx < 255; idx++) { _delay_us(MOTOR_PULSE); } + } return; @@ -271,7 +284,7 @@ static void UpdateButtonOutput(btn_state *b) { if (b->is_active) { /*If already in saved position then go back to original pos.*/ - if(diff(MotorGetSavedPos((uint8_t *)POSITION1_ADR), ReadFader()) < 4){ + if(diff(MotorGetSavedPos((uint8_t *)POSITION1_ADR), ReadFader()) <= 3){ MotorMoveTo(MotorGetSavedPos((uint8_t *)POSITION2_ADR)); } else{