Модуль ESP32-S3
Обвязка модуля:
Считаю герцы так, всё работает отлично (attachInterrupt висит на 11 и 12 пинах)
void IRAM_ATTR ISR(){
HZ = (1000000.0/(micros()-TIME_TIK)); // измеряем частоту
TIME_TIK = micros();
}
void HERTZ(TFT_eSprite *MAIN, char PARAMETER)
{
if (PARAMETER == 'L')
{
pinMode(45, INPUT); // 45 пин высокий импеданс
pinMode(46, OUTPUT); // выводим на 46 пин 0
digitalWrite(46,0); // устанавливая его в 0(включаем нижний резистор делителя)
digitalWrite(45,0);
attachInterrupt(12, ISR, FALLING);
}
else if (PARAMETER == 'R')
{
pinMode(46, INPUT); // 45 пин высокий импеданс
pinMode(45, OUTPUT); // выводим на 46 пин 0
digitalWrite(46,0);
digitalWrite(45,0); // устанавливая его в 0(включаем нижний резистор делителя)
attachInterrupt(11, ISR, FALLING);
}
Serial.println(HZ);
}
пока я не вызываю функцию GET_VOLT на эти пины 11 и 12:
float GET_VOLT(uint8_t PIN)
{
int32_t VOLTS = 0;
for(uint8_t i = 0; i <= 4; ++i)
VOLTS += analogReadMilliVolts(PIN);
return VOLTS / 5000.0f;
}
void OHMETER(TFT_eSprite *MAIN)
{
pinMode(46, OUTPUT); // пин выход
pinMode(45, OUTPUT); // пин выход
digitalWrite(46,1);
digitalWrite(45,0);
// измеряем напряжение на верхнем конце делителя
//**************************************************************
float R1 = GET_VOLT(10);
// измеряем напряжение на верхнем щупе
//**************************************************************
float R2 = GET_VOLT(12);
// измеряем напряжение на нижнем щупе
//**************************************************************
float R3 = GET_VOLT(11);
Serial.print(R1);
Serial.print(R2);
Serial.println(R3);
}
После этого прерывание attachInterrupt перестаёт работать.
Если в коде закомментировать
float R2 = GET_VOLT(12);
float R3 = GET_VOLT(11);
эти строчки, то attachInterrupt работает исправно.
Пояснение: функции HERTZ
и OHMETER
одновременно не вызываются, по очереди, сначала HERTZ
, потом OHMETER
потом снова HERTZ
и после этого attachInterrupt перестаёт работать.