stepper state engine
This commit is contained in:
150
src/main.c
150
src/main.c
@ -533,60 +533,130 @@ int main() {
|
||||
printf("POS: %02d\n", positionSwitch);
|
||||
}
|
||||
|
||||
if (timeValidCnt > 0) {
|
||||
if (step != 0) {
|
||||
step = 0;
|
||||
if ((timeValidCnt > 0) && (step != 0)) {
|
||||
step = 0;
|
||||
|
||||
static uint8_t currentMinutePosition = 0;
|
||||
uint8_t minuteStepPosition = clock.minute * STEPS_PER_MINUTE;
|
||||
static uint8_t stepperState = 0;
|
||||
|
||||
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) {
|
||||
PORTA |= (1 << PA1);
|
||||
|
||||
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);
|
||||
_delay_us(50);
|
||||
PORTC &= ~(1 << PC3);
|
||||
stepperState = 1;
|
||||
}
|
||||
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 {
|
||||
PORTA &= ~(1 << PA1);
|
||||
printf("f ");
|
||||
minuteDirection = 1;
|
||||
PORTC &= ~(1 << PC2);
|
||||
}
|
||||
|
||||
static uint8_t currentHourPosition = 0;
|
||||
uint8_t hourStepPosition = clock.hour * STEPS_PER_HOUR;
|
||||
stepperState = 2;
|
||||
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) {
|
||||
PORTA |= (1 << PA0);
|
||||
printf(" H: ");
|
||||
|
||||
printf("H: ");
|
||||
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);
|
||||
stepperState = 5;
|
||||
} 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) {
|
||||
tack = 0;
|
||||
|
||||
|
Reference in New Issue
Block a user