Например TDA7294

Форум РадиоКот :: Просмотр темы - Arduino функция tone (некорректная работа)
Форум РадиоКот
https://radiokot.ru/forum/

Arduino функция tone (некорректная работа)
https://radiokot.ru/forum/viewtopic.php?f=62&t=171246
Страница 1 из 1

Автор:  ferio [ Ср июн 10, 2020 19:28:33 ]
Заголовок сообщения:  Arduino функция tone (некорректная работа)

Бьюсь безуспешно второй день с функцией 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);
    }

}

Автор:  BlackKilkennyCat [ Ср июн 10, 2020 19:37:45 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

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

Автор:  ferio [ Ср июн 10, 2020 20:13:06 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

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

Автор:  BlackKilkennyCat [ Ср июн 10, 2020 20:17:39 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

frequency_in_avg_rez принимает значение единственный раз, если выполняется какое-то условие if (i=4)
если оно не выполнится (а оно не выполнится, так как в цикле i<3), чему будет равно значение?

Автор:  ARV [ Ср июн 10, 2020 20:22:22 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

& здесь неуместно, нужно &&

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

Автор:  ferio [ Ср июн 10, 2020 20:23:19 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

но ведь условие if (i=4) не может быть не выполненным, так передним for(i=0;i<3;i++).

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



Цитата:
кроме того, не срабатывает ли постоянно ватчдог?

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

Автор:  ARV [ Ср июн 10, 2020 20:23:51 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

Хотя я соврал, здесь вообще необходимо не &&, а ||

Автор:  ferio [ Ср июн 10, 2020 20:26:20 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

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);
    }

Автор:  BlackKilkennyCat [ Ср июн 10, 2020 20:27:39 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

но ведь условие if (i=4) не может быть не выполненным, так передним for(i=0;i<3;i++).

если i = 3 что будет с циклом?

Автор:  ferio [ Ср июн 10, 2020 20:30:36 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

BlackKilkennyCat, кажется понял. нужно if (i=3)
исправил, но все равно на выходе 30ГЦ, когда пустой вход

Автор:  BlackKilkennyCat [ Ср июн 10, 2020 20:31:48 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

нет. смотрите внимательно, какие значения может принять i, если оно должно быть меньше 3

Автор:  ferio [ Ср июн 10, 2020 23:37:45 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

0-1-2 :?

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

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

Автор:  ferio [ Чт июн 11, 2020 09:48:57 ]
Заголовок сообщения:  Re: Arduino функция tone (некорректная работа)

Всем спасибо. Вопрос снят.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/