ВОПРОС Токарный станок

Вот мне интересно, каким образом ты умудрился сгенерить три импульса на шаговик за один период энкодера? В коде который у меня импульсы генерятся делением количества импульсов энкодера за оборот шпинделя на коэффициент шага.
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)   
}
Ваши сообщения автоматически объединены:

 
Вот мне интересно, каким образом ты умудрился сгенерить три импульса на шаговик за один период энкодера?
Судя по "большому количеству букв в ответе ", здесь где то затесался умножитель на три ;)
 
Судя по "большому количеству букв в ответе ", здесь где то затесался умножитель на три ;)
Умножитель на 3 в последнем цикле от 0 до 2
Понял, что частота импульсов формируется таймерами. Возникают большие сомнения в синхронности и равномерности, если вдруг из-за нагрузки скорость шпинделя будет неравномерна и шпиндель "просядет". Я немножко не совсем вкурил, этот весь блок и есть обработчик ISR? И, да, не увидел условия направления отсчетов при изменении направления шпинделя. Или только в одну сторону крутится?
 
Понял, что частота импульсов формируется таймерами. Возникают большие сомнения в синхронности и равномерности, если вдруг из-за нагрузки скорость шпинделя будет неравномерна и шпиндель "просядет". Я немножко не совсем вкурил, этот весь блок и есть обработчик ISR? И, да, не увидел условия направления отсчетов при изменении направления шпинделя. Или только в одну сторону крутится?
Не, не таймерами, в ЕСП есть таймерные заморочки, поэтому обычные задержки. И формирование импульсов делается незадокументированными ЕСП-функциями. Которые, по сравнению с digitalWrite, работают раз в 5 быстрее.

Да, синхронность зависит от равномерности вращения шпинделя. Но на ошибку синхронизации влияет только разница временных интервалов между соседними парами штрихов энкодера. Я эту разницу измерял, для моего железа, если пересчитать ее в ошибку расстояний, она не больше микрона. Ну и на всякий случай поставил флаг encTickNew, который позволяет отловить сбой синхронизации. Много раз крутил шпиндель в разных режимах, сбоев не было.

Контролировать изменение направления мне не нужно, поэтому считывание с канала B не делается. Что позволяет сделать экономику более экономной.
 
  • Последнее редактирование:
Последнее редактирование:
формирование импульсов делается незадокументированными ЕСП-функциями. Которые, по сравнению с digitalWrite, работают раз в 5 быстрее.
Конечно DigitalWrite, как и DigitalRead несколько тугодумные, но есть же работа непосредственно с регистрами и прямая запись и чтение порта по маске, и, подозреваю, как раз это тот случай.
на ошибку синхронизации влияет только разница временных интервалов между соседними парами штрихов энкодера.
Насчет этого, как раз можно быть спокойным.
Контролировать изменение направления мне не нужно, поэтому считывание с канала B не делается.
А вот это напрасно, это может порождать ошибки.
В этом плане код который пользую свободен от вышеуказанного, и в управлении куда как проще.
 
  • Последнее редактирование:
Последнее редактирование:
Какие ошибки? Расскажи подробнее, с учетом того, что синхронизация мне нужна только для резьбы.
Ну, допустим, после прохода ты остановл шпиндель, а он по инерции отдернулся чутка назад, снимая натяги, а схема сосчитала вперёд, ошибка, однако. А при двустороннем счете это не должно быть, схема откат отминусует. Да и привычнее, таки, иногда с реверсом шпинделя работать. А таймер можно, конечно, использовать, но только для асинхронных подач и ускоренного хода суппортов.
Так то, чисто как ручной станок, без наворотов, код который у меня удобен, вот причесать бы его да перетащить на STMку или ESPшку, был бы огонь.
 
  • Последнее редактирование:
Последнее редактирование:
Ну, допустим, после прохода ты остановл шпиндель, а он по инерции отдернулся чутка назад, снимая натяги, а схема сосчитала вперёд, ошибка, однако.
Ну так у меня ЩД стоят как на продольной, так и на поперечной подаче. Поэтому в процессе нарезки резьбы шпиндель не останавливается. Кроме того, энкодер абсолютный, поэтому всегда есть возможность определить начальное положение шпинделя. Например, если после проверки глубины резьбы, оказалось, что надо сделать доп. проход.

Ставь ШД на поперечную подачу, и будет тебе счастье без костылей с остановкой шпинделя.
 
если после проверки глубины резьбы, оказалось, что надо сделать доп. проход
С этим, вроде, не возникало проблем, надо, значит подобрать не вопрос, главное ручонками не крутнуть продольку. А вот без остановки шпинделя тут никак, вот она, ошибочка, и набежала.
 
С этим, вроде, не возникало проблем,
На мелком токарнике, при работе по стали, иногда приходилось делать доп. проход. Из-за недостаточной жесткости. Или при нарезании острой резьбы.
 
Сравнивая разные алгоритмы ускорений, посмотрел, как выглядят последовательности коротких импульсов для управления ЩД. И разочаровался в своем осциллографе: пропускает короткие импульсы, зараза :( . Т.к. наметки импульсов имеют место, подозреваю программный баг, отрисовка не успевает.
1721341232064.png
А вот простой и дешевый логический анализатор все делает правильно. Да и анализ там сделан намного удобнее: навел мышку на импульс - и показывает все характеристики.
1721341340392.png
 
И к нему тоже есть вопросы, импульсы явно с плавающей длительностью.
Программно там задана генерация импульсов длительностью 5 us. Реальная длительность - 5.125 us. Разница - это удвоенное время записи в пин, которую я не учитывал.

Иногда (очень редко) появлялись импульсы 5.167 us. При питании ЕСП от ЮСБ.
1721509532301.png1721509538398.png
Запитал ЕСП от отдельного источника, долго искал, но удлинненных импульсов не нашел. Думаю, что анализатор работает правильно. И железка, и программа logic 2. А вот чего в ней не хватает - так это расчета статистики. Чтобы можно было автоматом найти максимальную и минимальную длину импульсов.
 
Добил в первом приближении коды нарезки резьбы. А перед тестированием в реальной работе почистил и настроил механику токарничка. И измерил люфты. На продольной подаче - стабильно 0.05мм, нормально. Проверил поперечную - чудеса, люфт практически ноль :eek:. Причем при настройке люфта поперечной подачи (которая делается наклоном гайки) особо и не старался. Только подрегулировал гайку так, чтобы рукой крутилось без напряга. Бывает же такое...
 
Сверху Снизу
Обнаружен блокировщик рекламы AdBlock

МЫ ДОГАДЫВАЕМСЯ, ЧТО РЕКЛАМА ВАС РАЗДРАЖАЕТ!

Конечно, Ваше программное обеспечение для блокировки рекламы отлично справляется с блокировкой рекламы на нашем сайте, но оно также блокирует полезные функции. Мы стараемся для Вас и не обязываем Вас донатить и скидывать денег на наши кошельки, чтобы пользоваться форумом, но реклама это единственное, что позволяет поддерживать проект и развивать его.

Спасибо за Ваше понимание!

Я отключил свой AdBlock    Нет, я не буду ничего отключать