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

ssdd

Members
  • Постов

    13
  • Зарегистрирован

  • Посещение

Электроника

  • Стаж в электронике
    3-5 лет

Достижения ssdd

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме
  • 10 лет  на форуме

Последние значки

0

Репутация

  1. Имеется: Платка ESP32 + обвес (оптопары PC817, питание, RF-модули и т.п.) Трехфазный асинхронный двигатель, с установленной на шкиве пластиной и вырезами Два индуктивных датчика Autonics PR12-4DN2, установленных со смещением относительно друг-друга Двигатель управляется частотником, команды на частотник идут с платы ESP32. Датчиками определяется дистанция, направление вращения и скорость. Фрагмент схемы: Фрагменты программы: #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 выглядит так: И все равно то же самое. В программе видно, что счетчик увеличивается только когда условия gpio_get_level(PIN_SENSOR1) истинно. Фильтр дребезга там в принципе не работает, можно его убрать, результат такой же. Есть какие-то мысли куда копать?
×
×
  • Создать...