Страница 1 из 1

Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 19:28:33
ferio
Бьюсь безуспешно второй день с функцией tone в ардуинке.
Задача алгоритма, вычислить частоту входного сигнала.
Затем умножить ее или разделить, и выдать на другой пин ардуино конвертированную частоту. Генерация реализована через 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);
    }

}

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 19:37:45
BlackKilkennyCat
Нормальная среда разработки предупредила бы нерадивого кодера, что, например, возможна ситуация, когда frequency_in_avg_rez ничего не присвоится. А поскольку оно (да и не только оно) ни разу не проинициализированно (кто ваще придумал эту инициализацию?), то его значение в этом случает известно лишь богу (или богам, если их более одного).

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:13:06
ferio
BlackKilkennyCat, а как будет правильно? кодер из меня такой себе, даже и не спорю. :roll:
просто условие if (frequency_in_avg_rez<40 & frequency_in_avg_rez>4000) по моему мнению подразумевает, что функция tone срабатывает при заданном диапазоне этого самого frequency_in_avg_rez

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:17:39
BlackKilkennyCat
frequency_in_avg_rez принимает значение единственный раз, если выполняется какое-то условие if (i=4)
если оно не выполнится (а оно не выполнится, так как в цикле i<3), чему будет равно значение?

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:22:22
ARV
& здесь неуместно, нужно &&

и я рекомендую записывать все выражения при помощи скобок

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:23:19
ferio
но ведь условие if (i=4) не может быть не выполненным, так передним for(i=0;i<3;i++).

здесь идет подсчет среднего значения на основании трех измерений.


кроме того, не срабатывает ли постоянно ватчдог?
как это определить? среда ардуино вообще не дает фьзами оперировать, поэтому неизвестно включен он, или выключен как таковой.

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:23:51
ARV
Хотя я соврал, здесь вообще необходимо не &&, а ||

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:26:20
ferio
ARV, исправил, уже так. масло масленное, но результат тот же. на выходе при пустом входе 30гц

Код: Выделить всё

if (frequency_in_avg_rez<40 || 4000<frequency_in_avg_rez)
    {
    noTone(8); 
    }
    
    if (40<frequency_in_avg_rez || frequency_in_avg_rez<4000)
    {
   tone(8, frequency_out);
    }

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:27:39
BlackKilkennyCat
[uquote="ferio",url="/forum/viewtopic.php?p=3853433#p3853433"]но ведь условие if (i=4) не может быть не выполненным, так передним for(i=0;i<3;i++).[/uquote]
если i = 3 что будет с циклом?

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:30:36
ferio
BlackKilkennyCat, кажется понял. нужно if (i=3)
исправил, но все равно на выходе 30ГЦ, когда пустой вход

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 20:31:48
BlackKilkennyCat
нет. смотрите внимательно, какие значения может принять i, если оно должно быть меньше 3

Re: Arduino функция tone (некорректная работа)

Добавлено: Ср июн 10, 2020 23:37:45
ferio
0-1-2 :?

ps. самое интересное, что работает) но пока реальный сигнал на входе.

Добавлено after 3 hours 41 second:
Разобрался .
Но появился другой вопрос. С помощью tone нельзя генерировать меандр ниже 31ГЦ.
Как правильнее реализовать генерацию 10гц. Нужен диапазон от 10 до 200гц.

Re: Arduino функция tone (некорректная работа)

Добавлено: Чт июн 11, 2020 09:48:57
ferio
Всем спасибо. Вопрос снят.