Перейти к содержанию

ESP32 и считывание показаний с индуктивных датчиков Autonics PR12-4DN2


Рекомендуемые сообщения

Имеется: 

  • Платка ESP32 + обвес (оптопары PC817, питание, RF-модули и т.п.)
  • Трехфазный асинхронный двигатель, с установленной на шкиве пластиной и вырезами
  • Два индуктивных датчика Autonics PR12-4DN2, установленных со смещением относительно друг-друга

Двигатель управляется частотником, команды на частотник идут с платы ESP32.

Датчиками определяется дистанция, направление вращения и скорость. 

Фрагмент схемы:

 schem.thumb.png.70c8ff49e6bc59a5a4a0f5a8c8ee5551.png

Фрагменты программы:

#define PIN_SENSOR1 GPIO_NUM_34 // Вход датчика двигателя 1
#define PIN_SENSOR2 GPIO_NUM_35 // Вход датчика двигателя 2
  
unsigned long sens1, sens2;     // Для отладки (счетчик кол-ва срабатывания прерываний от датчика)
uint8_t debounce = 10;			// Дребезг датчиков, для примера. В основной программе достается с EEPROM/Wi-Fi

void setup(void)
{
    attachInterrupt(PIN_SENSOR1, sens1_signal, FALLING);
    attachInterrupt(PIN_SENSOR2, sens2_signal, FALLING);
}

void loop(void){

  #ifdef DEBUG_ENABLE
   if (millis() - timing > 1000)
      {
          Serial.print("s1: ");
          Serial.print(String(sens1));

          Serial.print(", s2: ");
          Serial.print(String(sens2));
      }
   }
}


void sens1_signal()
{
    if (millis() - ms_debounce1 >= debounce && gpio_get_level(PIN_SENSOR2)) {
        sens1++;
        cnt_motor++;			// Дистанция +
        cur_rot = ROT_FORW;		// Направление вращения - вперед
    }
    ms_debounce1 = millis();
}

void sens2_signal()
{
    if (millis() - ms_debounce2 >= debounce && gpio_get_level(PIN_SENSOR1)) {
        sens2++;
        cnt_motor--;			// Дистанция -
        cur_rot = ROT_BACK;		// Направление вращения - назад
    }
    ms_debounce2 = millis();
}

Проблема в том, что при вращении в одну сторону (например - вперед когда у нас увеличиваются sens1 и cnt_motor) происходит иногда срабатывание второго условия: т.е. увеличивается sens2 и соотв-но уменьшается cnt_motor. Примерно 5-10%. Т.е. если кол-во sens1 будет 500, то кол-вл sens2 будет 30-50. А должно быть 0.

 

Думал дело в наводках или датчиках. Снял всю систему. На Arduino собрал и запрограммировал генератор с частотой 20 Гц и примерно таким же сдвигом как с реальных датчиков. Через резистивный делитель подключил в ESP32. Осциллограмма с Arduino выглядит так:

Screenshot_2023-09-04-07-53-16.png.368d1c7de7109510913107e75c54d708.png

И все равно то же самое. 

В программе видно, что счетчик увеличивается только когда условия gpio_get_level(PIN_SENSOR1) истинно. Фильтр дребезга там в принципе не работает, можно его убрать, результат такой же.

Есть какие-то мысли куда копать?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Лично я бы, для начала, выкинул ардуйня ИДЕ, и запрограммил все это в VisualStudio, а потом, под отладчиком через JTAG уже бы ловил проблему. Ибо отлаживать софт по миганию диодов и текстовому выводу такое себе занятие. Тем более там даже готовый пример есть для энкодера с использованием pcnt.

А так, для начала, надо посмотреть сигнал непосредственно на выводах ESP. Ну и добавить еще дерганье ножкой при входе/выходе из прерывания. Для каждого прерывания. Как вариант - заходим в прерывание 1, пока мы в нем, срабатывает прерывание 2, но обработать мы его не можем, т.к. еще висим в прерывании. В итоге когда попадаем в прерывание 2, вывод первого датчика успевает подняться. Вообще, есть же готовая либа для энкодера https://www.arduino.cc/reference/en/libraries/esp32encoder/, почему бы не использовать ее? На первый взгляд написана неплохо.

 

 

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...