stepper state engine

This commit is contained in:
hg
2013-01-28 10:42:20 +01:00
parent 2576f8854f
commit c820a6f9fc

View File

@ -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;