Имеется:
Платка 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) истинно. Фильтр дребезга там в принципе не работает, можно его убрать, результат такой же.
Есть какие-то мысли куда копать?