stepper state engine
This commit is contained in:
106
src/main.c
106
src/main.c
@ -533,59 +533,129 @@ int main() {
|
|||||||
printf("POS: %02d\n", positionSwitch);
|
printf("POS: %02d\n", positionSwitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timeValidCnt > 0) {
|
if ((timeValidCnt > 0) && (step != 0)) {
|
||||||
if (step != 0) {
|
|
||||||
step = 0;
|
step = 0;
|
||||||
|
|
||||||
|
static uint8_t stepperState = 0;
|
||||||
|
|
||||||
static uint8_t currentMinutePosition = 0;
|
static uint8_t currentMinutePosition = 0;
|
||||||
uint8_t minuteStepPosition = clock.minute * STEPS_PER_MINUTE;
|
uint8_t minuteStepPosition = 0;
|
||||||
|
int8_t minuteDirection = 0;
|
||||||
|
|
||||||
|
static uint8_t currentHourPosition = 0;
|
||||||
|
uint8_t hourStepPosition = clock.hour * STEPS_PER_HOUR;
|
||||||
|
int8_t hourDirection = 0;
|
||||||
|
|
||||||
|
switch (stepperState) {
|
||||||
|
case 0:
|
||||||
|
// is current minute position different from desired one?
|
||||||
if (currentMinutePosition != minuteStepPosition) {
|
if (currentMinutePosition != minuteStepPosition) {
|
||||||
|
printf("M: ");
|
||||||
|
|
||||||
|
stepperState = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// switch on the minute motor and set the direction
|
||||||
PORTA |= (1 << PA1);
|
PORTA |= (1 << PA1);
|
||||||
|
|
||||||
printf("M: ");
|
minuteStepPosition = clock.minute * STEPS_PER_MINUTE;
|
||||||
|
|
||||||
if (currentMinutePosition > minuteStepPosition) {
|
if (currentMinutePosition > minuteStepPosition) {
|
||||||
printf("b ");
|
printf("b ");
|
||||||
currentMinutePosition--;
|
minuteDirection = -1;
|
||||||
PORTC |= (1 << PC2);
|
PORTC |= (1 << PC2);
|
||||||
} else {
|
} else {
|
||||||
printf("f ");
|
printf("f ");
|
||||||
currentMinutePosition++;
|
minuteDirection = 1;
|
||||||
PORTC &= ~(1 << PC2);
|
PORTC &= ~(1 << PC2);
|
||||||
}
|
}
|
||||||
printf("d: %d, c: %d\n", minuteStepPosition, currentMinutePosition);
|
|
||||||
|
stepperState = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// move one step
|
||||||
|
|
||||||
|
printf("d: %d, c: %d, ", minuteStepPosition, currentMinutePosition);
|
||||||
|
|
||||||
|
currentMinutePosition += minuteDirection;
|
||||||
|
|
||||||
PORTC |= (1 << PC3);
|
PORTC |= (1 << PC3);
|
||||||
_delay_us(50);
|
_delay_us(50);
|
||||||
PORTC &= ~(1 << PC3);
|
PORTC &= ~(1 << PC3);
|
||||||
} else {
|
|
||||||
PORTA &= ~(1 << PA1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t currentHourPosition = 0;
|
if (currentMinutePosition == minuteStepPosition) {
|
||||||
uint8_t hourStepPosition = clock.hour * STEPS_PER_HOUR;
|
stepperState = 3;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
// switch off the minute motor
|
||||||
|
PORTA &= ~(1 << PA1);
|
||||||
|
|
||||||
|
stepperState = 4;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
// is current hour position different from desired one?
|
||||||
if (currentHourPosition != hourStepPosition) {
|
if (currentHourPosition != hourStepPosition) {
|
||||||
|
printf(" H: ");
|
||||||
|
|
||||||
|
stepperState = 5;
|
||||||
|
} else {
|
||||||
|
// done
|
||||||
|
printf("\n");
|
||||||
|
stepperState = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
// switch on the hour motor and set the direction
|
||||||
PORTA |= (1 << PA0);
|
PORTA |= (1 << PA0);
|
||||||
|
|
||||||
printf("H: ");
|
hourStepPosition = clock.hour * STEPS_PER_HOUR;
|
||||||
|
|
||||||
if (currentHourPosition > hourStepPosition) {
|
if (currentHourPosition > hourStepPosition) {
|
||||||
printf("b ");
|
printf("b ");
|
||||||
currentHourPosition--;
|
hourDirection = -1;
|
||||||
PORTC |= (1 << PC0);
|
PORTC |= (1 << PC0);
|
||||||
} else {
|
} else {
|
||||||
printf("f ");
|
printf("f ");
|
||||||
currentHourPosition++;
|
hourDirection = 1;
|
||||||
PORTC &= ~(1 << PC0);
|
PORTC &= ~(1 << PC0);
|
||||||
}
|
}
|
||||||
printf("d: %d, c: %d\n", hourStepPosition, currentHourPosition);
|
|
||||||
|
stepperState = 6;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
// move one step
|
||||||
|
|
||||||
|
printf("d: %d, c: %d, ", hourStepPosition, currentHourPosition);
|
||||||
|
|
||||||
|
currentHourPosition += hourDirection;
|
||||||
|
|
||||||
PORTC |= (1 << PC1);
|
PORTC |= (1 << PC1);
|
||||||
_delay_us(50);
|
_delay_us(50);
|
||||||
PORTC &= ~(1 << PC1);
|
PORTC &= ~(1 << PC1);
|
||||||
} else {
|
|
||||||
|
if (currentHourPosition == hourStepPosition) {
|
||||||
|
stepperState = 7;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
// switch off the hour motor
|
||||||
PORTA &= ~(1 << PA0);
|
PORTA &= ~(1 << PA0);
|
||||||
|
|
||||||
|
stepperState = 8;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
// done
|
||||||
|
printf("\n");
|
||||||
|
stepperState = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
stepperState = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (tack != 0) {
|
if (tack != 0) {
|
||||||
tack = 0;
|
tack = 0;
|
||||||
|
Reference in New Issue
Block a user