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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ferio
Прорезались зубы
Сообщения: 204
Зарегистрирован: Вт мар 31, 2009 09:14:47

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

Сообщение 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);
    }

}
Последний раз редактировалось ferio Ср июн 10, 2020 20:23:59, всего редактировалось 2 раза.
Реклама
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

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

Сообщение BlackKilkennyCat »

Нормальная среда разработки предупредила бы нерадивого кодера, что, например, возможна ситуация, когда frequency_in_avg_rez ничего не присвоится. А поскольку оно (да и не только оно) ни разу не проинициализированно (кто ваще придумал эту инициализацию?), то его значение в этом случает известно лишь богу (или богам, если их более одного).
Меня здесь больше нет
Реклама
ferio
Прорезались зубы
Сообщения: 204
Зарегистрирован: Вт мар 31, 2009 09:14:47

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

Сообщение ferio »

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

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

Сообщение BlackKilkennyCat »

frequency_in_avg_rez принимает значение единственный раз, если выполняется какое-то условие if (i=4)
если оно не выполнится (а оно не выполнится, так как в цикле i<3), чему будет равно значение?
Меня здесь больше нет
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18637
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Реклама
ferio
Прорезались зубы
Сообщения: 204
Зарегистрирован: Вт мар 31, 2009 09:14:47

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

Сообщение ferio »

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

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


кроме того, не срабатывает ли постоянно ватчдог?
как это определить? среда ардуино вообще не дает фьзами оперировать, поэтому неизвестно включен он, или выключен как таковой.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18637
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Хотя я соврал, здесь вообще необходимо не &&, а ||
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
ferio
Прорезались зубы
Сообщения: 204
Зарегистрирован: Вт мар 31, 2009 09:14:47

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

Сообщение 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);
    }
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

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

Сообщение BlackKilkennyCat »

[uquote="ferio",url="/forum/viewtopic.php?p=3853433#p3853433"]но ведь условие if (i=4) не может быть не выполненным, так передним for(i=0;i<3;i++).[/uquote]
если i = 3 что будет с циклом?
Меня здесь больше нет
ferio
Прорезались зубы
Сообщения: 204
Зарегистрирован: Вт мар 31, 2009 09:14:47

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

Сообщение ferio »

BlackKilkennyCat, кажется понял. нужно if (i=3)
исправил, но все равно на выходе 30ГЦ, когда пустой вход
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

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

Сообщение BlackKilkennyCat »

нет. смотрите внимательно, какие значения может принять i, если оно должно быть меньше 3
Меня здесь больше нет
ferio
Прорезались зубы
Сообщения: 204
Зарегистрирован: Вт мар 31, 2009 09:14:47

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

Сообщение ferio »

0-1-2 :?

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

Добавлено after 3 hours 41 second:
Разобрался .
Но появился другой вопрос. С помощью tone нельзя генерировать меандр ниже 31ГЦ.
Как правильнее реализовать генерацию 10гц. Нужен диапазон от 10 до 200гц.
ferio
Прорезались зубы
Сообщения: 204
Зарегистрирован: Вт мар 31, 2009 09:14:47

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

Сообщение ferio »

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

Вернуться в «Разные вопросы по МК»