- Регистрация
- 24.08.2021
- Сообщения
- 3 323
- Реакции
- 4 465
- Баллы
- 138
- Адрес
- очень далеко от России
- Имя
- Валерий
- Станок
- CNC 6040
- Плата
- самодельная
Вот мне интересно, каким образом ты умудрился сгенерить три импульса на шаговик за один период энкодера? В коде который у меня импульсы генерятся делением количества импульсов энкодера за оборот шпинделя на коэффициент шага.
C++:
void IRAM_ATTR threadEncoderA_isr() {
//generate stepper pulses between encoder ticks
if (digitalRead(encPinA) == LOW) {
//-------STOP PRESSED FROM PENDANT -> EXIT
if(stopPressed) {
appState = 0;
esp_timer_start_once(trdTimer, trdTimerDelUs);
threadDetachInterruptA();
return;
}
//-------FIRST ENCODER TICK -> JUST GET TIME
if(encTickN == 0) {
enc_t0 = esp_timer_get_time();
encTickN++; return;
}
//------CURRENT THREAD PASS FINISHED -> DETACH ENCODER INTERRUPTS AND STOP STEPPER PULSE GENERATION
if(encTickN >= trdEncTicksCalc + 1) {
appState = 0;
esp_timer_start_once(trdTimer, trdTimerDelUs); //continue with next thread pass
threadDetachInterruptA();
return;
}
eNew:
encTickNew = true;
//------GET LAST INTERVAL BETWEEN ENCODER TICKS
enc_t1 = esp_timer_get_time(); enc_dt = enc_t1 - enc_t0; enc_t0 = enc_t1;
encTickN++;
//DELAY BETWEEN STEPPER PULSES
strPlsDiff = strPlsDiff + strPlsDiff0;//accumulate decimal difference
int n = strPlsTickInt;
if(strPlsDiff >= 1000) {//enough difference accumulated -> generate one more pulse slightly increasing pulse frequency
n++; strPlsDiff = strPlsDiff - 1000;//generate one more pulse to compensate decimal difference
}
if(n <= 0) return;//small thread pitch -> no pulse generation, continue accumulation up to n=1
strPlsDel = enc_dt/n - STEP_PULSE_WIDTH;
//GENERATE STEPPER PULSES
for (int16_t i = 1; i <= n; i++) {
if(i == 2) encTickNew = false;
GPIO.out_w1ts = pMaskX; ets_delay_us(STEP_PULSE_WIDTH); GPIO.out_w1tc = pMaskX;
strPlsSentX++;
if(encTickNew && i > 1) {strPulseLost++; goto eNew;}//new encoder tick arrived -> stop generation to avoid crash
if(i == n) return;//no delay after last pulse
ets_delay_us(strPlsDel);
}
} //if (digitalRead(encPinA) == LOW)
}
Ваши сообщения автоматически объединены: