Задача алгоритма, вычислить частоту входного сигнала.
Затем умножить ее или разделить, и выдать на другой пин ардуино конвертированную частоту. Генерация реализована через tone
И вроде все OK, когда на вход подается реальная частота.
Но если от входа отключить сигнал, то на выходе появляется меандр 30Гц(вижу его осциллографом). Хотя в исходнике прописано условие, если частота меньше 40ГЦ, то noTone.
Код: Выделить всё
int Htime; // целочисленная переменная для хранения времени высокого логического уровня
int Ltime; // целочисленная переменная для хранения времени низкого логического уровня
float Ttime; // переменная для хранения общей длительности периода
float frequency_in_raw; // переменная для хранения частоты входной
float frequency_in_avg; // переменная для хранения частоты входной
float frequency_in_avg_rez; // переменная для хранения частоты входной
float frequency_out; // переменная для хранения частоты
int i=0;
void setup()
{
// устанавливаем скорость передачи данных последовательного соединения.
Serial.begin(9600);
pinMode(2,INPUT);
}
void loop()
{
for(i=0;i<3;i++)
{
Htime=pulseIn(2,HIGH); // прочитать время высокого логического уровня
Ltime=pulseIn(2,LOW); // прочитать время низкого логического уровня
Ttime = Htime+Ltime;
frequency_in_raw=1000000/Ttime; // получение частоты из Ttime в микросекундах
frequency_in_avg+=frequency_in_raw;
Serial.println(frequency_in_raw);
}
if (i=4)
{
frequency_in_avg_rez= frequency_in_avg/3;
frequency_in_avg=0;
Serial.println(frequency_in_avg_rez);
Serial.println(' ');
i=0;
}
frequency_out=frequency_in_avg_rez*5; //коэффициент корреляции
Serial.println(frequency_out);
Serial.println('.');
// delay(5);
if (frequency_in_avg_rez<40 && frequency_in_avg_rez>4000)
{
noTone(8);
}
if (40<frequency_in_avg_rez)
{
tone(8, frequency_out);
}
}

