Форум РадиоКот 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, а как будет правильно? кодер из меня такой себе, даже и не спорю. ![]() просто условие 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/ |