more precise movements

This commit is contained in:
2020-03-20 14:28:53 +03:00
parent 29db5fa278
commit 15c63a3d8f
2 changed files with 25 additions and 31 deletions

View File

@@ -6,6 +6,8 @@ constexpr unsigned int stsUpdDelay{10};
constexpr float defRPM{2}, defEggLength{60}, defEggDia{45}, xLimit{85};
constexpr float defYDegPerMM{360 / (PI * defEggDia)},
defXDegPerMM{xLimit / defEggLength};
constexpr int adjustDelay{100};
constexpr int timer2Div {8};
constexpr int ticksPerSecond{F_CPU / (timer2Div * 255)};
#endif

View File

@@ -12,7 +12,9 @@ int curRPM = defRPM;
bool needAdjust;
int calculateDelay(float rpm, int stepsPerRevolution) {
return ((float)1000 * (float)60) / (rpm * (float)stepsPerRevolution);
//Delay between steps in a timer routine
// Delay = (ticks/sec)/(rpm/60 * steps/rev)
return ((float)ticksPerSecond * (float)60) / (rpm * (float)stepsPerRevolution);
}
void adjustRPM() {
@@ -127,47 +129,37 @@ void setup() {
pinMode(A0, OUTPUT);
digitalWrite(A0, true);
OCR2A = 250;
TCCR2A |= (1 << WGM20) | (1 << CS22);
TCCR2A |= (1 << WGM20) | (1 << CS21);
TIMSK2 |= (1 << OCIE2A);
wdt_enable(WDTO_8S);}
volatile unsigned int tick = 0;
volatile bool armed = false;
/*
We use our own timer for more precise timings
And it ticks only when armed, to ensure
that steppersRoutine() doesn't skip a single tick
*/
ISR(TIMER2_COMPA_vect) {
if (armed) {
tick++;
armed = false;
}
wdt_enable(WDTO_8S);
}
volatile unsigned int tick = 0;
void steppersRoutine() {
if (!armed) {
if (tick % adjustDelay == 0) {
adjustRPM();
}
if (tick % eggStepperDelay == 0) {
eggStepper.doStep();
}
if (tick % servoStepperDelay == 0) {
servoStepper.doStep();
}
armed = true;
}
if (eggStepper.getRemainingSteps() == 0 &&
servoStepper.getRemainingSteps() == 0) {
executing = false;
}
}
/*
We use our own timer for more precise timings
And it ticks only when armed, to ensure
that steppersRoutine() doesn't skip a single tick
*/
ISR(TIMER2_COMPA_vect) {
tick++;
steppersRoutine();
}
void loop() {
if (newCommand) {
execCommand(command);
}
steppersRoutine();
}