stepper state engine

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

View File

@ -533,60 +533,130 @@ 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 currentMinutePosition = 0; static uint8_t stepperState = 0;
uint8_t minuteStepPosition = clock.minute * STEPS_PER_MINUTE;
static uint8_t currentMinutePosition = 0;
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) {
PORTA |= (1 << PA1);
printf("M: "); printf("M: ");
if (currentMinutePosition > minuteStepPosition) {
printf("b ");
currentMinutePosition--;
PORTC |= (1 << PC2);
} else {
printf("f ");
currentMinutePosition++;
PORTC &= ~(1 << PC2);
}
printf("d: %d, c: %d\n", minuteStepPosition, currentMinutePosition);
PORTC |= (1 << PC3); stepperState = 1;
_delay_us(50); }
PORTC &= ~(1 << PC3); break;
case 1:
// switch on the minute motor and set the direction
PORTA |= (1 << PA1);
minuteStepPosition = clock.minute * STEPS_PER_MINUTE;
if (currentMinutePosition > minuteStepPosition) {
printf("b ");
minuteDirection = -1;
PORTC |= (1 << PC2);
} else { } else {
PORTA &= ~(1 << PA1); printf("f ");
minuteDirection = 1;
PORTC &= ~(1 << PC2);
} }
static uint8_t currentHourPosition = 0; stepperState = 2;
uint8_t hourStepPosition = clock.hour * STEPS_PER_HOUR; break;
case 2:
// move one step
printf("d: %d, c: %d, ", minuteStepPosition, currentMinutePosition);
currentMinutePosition += minuteDirection;
PORTC |= (1 << PC3);
_delay_us(50);
PORTC &= ~(1 << PC3);
if (currentMinutePosition == minuteStepPosition) {
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) {
PORTA |= (1 << PA0); printf(" H: ");
printf("H: "); stepperState = 5;
if (currentHourPosition > hourStepPosition) {
printf("b ");
currentHourPosition--;
PORTC |= (1 << PC0);
} else {
printf("f ");
currentHourPosition++;
PORTC &= ~(1 << PC0);
}
printf("d: %d, c: %d\n", hourStepPosition, currentHourPosition);
PORTC |= (1 << PC1);
_delay_us(50);
PORTC &= ~(1 << PC1);
} else { } else {
PORTA &= ~(1 << PA0); // done
printf("\n");
stepperState = 0;
} }
break;
case 5:
// switch on the hour motor and set the direction
PORTA |= (1 << PA0);
hourStepPosition = clock.hour * STEPS_PER_HOUR;
if (currentHourPosition > hourStepPosition) {
printf("b ");
hourDirection = -1;
PORTC |= (1 << PC0);
} else {
printf("f ");
hourDirection = 1;
PORTC &= ~(1 << PC0);
}
stepperState = 6;
break;
case 6:
// move one step
printf("d: %d, c: %d, ", hourStepPosition, currentHourPosition);
currentHourPosition += hourDirection;
PORTC |= (1 << PC1);
_delay_us(50);
PORTC &= ~(1 << PC1);
if (currentHourPosition == hourStepPosition) {
stepperState = 7;
}
break;
case 7:
// switch off the hour motor
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;