Доброго времени суток! Решил встроить FM модуль TEA5767 в свой КВ приемник, управляется ардуиной, библиотеку TEA5767.h качал отсюда: https://github.com/andykarpov/TEA5767 Код залил такой: Код (C++): #include <TEA5767.h> #include <Wire.h> #include <Button.h> #include <LiquidCrystal_I2C.h> TEA5767 Radio; LiquidCrystal_I2C lcd(0x27,16,2); double old_frequency; double frequency; int search_mode = 0; int search_direction; unsigned long last_pressed; unsigned long timing; Button button0 = Button(8); Button button1 = Button(9); void setup() { Wire.begin(); Radio.init(); Radio.set_frequency(106.2); lcd.init(); lcd.backlight(); } void loop() { unsigned char buf[5]; int stereo; int signal_level; double current_freq; if (Radio.read_status(buf) == 1) { current_freq = floor (Radio.frequency_available (buf) / 100000 + .5) / 10; stereo = Radio.stereo(buf); signal_level = Radio.signal_level(buf); lcd.setCursor(0,0); lcd.print(current_freq); lcd.setCursor(0,1); if (stereo) lcd.print("STEREO "); else lcd.print("MONO "); lcd.setCursor(7,0); lcd.print(signal_level); } if(button0.isPressed()) { Radio.set_frequency(current_freq-0.1); delay(100); if (current_freq < 87.5) {current_freq=87.5;} } if(button1.isPressed()) { Radio.set_frequency(current_freq+0.1); delay(100); if (current_freq > 108) {current_freq=108;} } delay(50); Всё вроде бы работает. Частота отображается, режим "стерео"/"моно" то же отображается, и периодически меняется в зависимости от качества сигнала, а вот текущий уровень сигнала (signal_level) на дисплее отображается только при изменении частоты. При прослушивании станции уровень сигнала "застывает" и не меняется. Пробовал отображать актуальный уровень сигнала с периодичностью в пол секунды с помощью функции millis(), но бесполезно. Уровень как зависает после перестройки, так и не меняется. В чем может быть причина? Почему режим моно/стерео всегда отображается актуальный, а уровень сигнала только тот, что был на момент перестройки частоты?
1. Вы антенну отключали ? Это не меняет показания уровня ? 2. В каких пределах значения уровня вообще меняются ?
Да, антенну отключал. Это была первая мысль проверить, меняется ли уровень сигнала. Ничего не происходит. А по поводу значений - в описании библиотеки сказано, что от 0 до 15. На деле где-то от 5 при отключенной антенне и ненастроенном приемнике, и до 14 при подключенной антенне и настройке на самую мощную станцию.
Да, судя по техническому описанию и коду в библиотеке TEA5767.h К тому же, в интернете миллион примеров, где ребята делают приемники с индикатором уровня на этом модуле. На фотографиях у них всё красиво, а вот видео работы, по которому можно было бы оценить измерение уровня в реальном времени, я, к сожалению, не смог найти. Когда я пытаюсь периодически (каждые пол секунды) с помощью функции millis() опрашивать модуль на предмет уровня сигнала командой signal_level = Radio.signal_level(buf); lcd.print(signal_level); уровень сигнала так же не меняется. Но стоит добавить сюда же команду установки рабочей частоты Radio.set_frequency(), то каждые пол секунды, когда на приемник поступает команда настройки на текущую частоту, уровень сигнала тоже начинает меняться каждые пол секунды соответственно. Может быть, я бы так и оставил, но приёмник заикается каждые пол секунды, даже если частота настройки при этом остаётся той же. Возможно, я бы смирился с этим, осознавая, что "так задумано" и никак иначе быть не может, но ведь функция отображения типа сигнала (стерео или моно) stereo = Radio.stereo(buf); if(stereo) lcd.print("STEREO ");else lcd.print("MONO "); работает исправно и отображается в реальном времени. Разве с функцией signal_level не должно быть то же самое?
Разумеется нет ) Но он не меняется от слова "совсем", даже когда отключаешь антенну. И, как я уже сказал, если подавать на модуль команду настройки на ту же самую частоту, на которую он настроен в данный момент, то уровень сигнала тоже скачет, показывая актуальное значение. А это значит, что он меняется, причём в пределах, достаточных для того, чтобы число от 0 до 15 менялось. Если настроиться на станцию, скажем, частотой 105.0 МГц, то при подключенной антенне уровень сигнала может показывать 14 из 15. Если отключить антенну и подать на приемник команду снова настроиться на эту же частоту (105.0), то уровень без антенны покажет где-то 5...7. Но, если не перестраивать приёмник, а просто подключать/отключать антенну, уровень сигнала почему-то не меняется. Чего не скажешь о том же "стерео/моно"
Я имею ввиду, что ардуина получает от модуля ТЕА5767 информацию о типе сигнала "стерео/моно" в реальном времени, и в зависимости от качества сигнала информация меняется, в любой момент времени являясь актуальной. Информация об уровне сигнала ардуина запрашивает тем же самым образом, что и информацию о стерео/моно, но модуль выдаёт ответ только в момент перестройки приёмника.
Посмотрел ДШ на микру. Написано что данные об уровне появляются через 10мс после настройки. Но ни слова о том постоянно ли происходит измерение. Может и нет. Цифровые процессы очень шумные, может их свели до минимума. Попробуйте мерить уровень несущей по сигналу AGC на 38й ноге АЦП-шкой Ардуины. Есть и еще одна точка.
Действительно? Видимо, я что-то упустил. Значит, только один раз через 10 мс после перестройки. Это ключевая информация по данному вопросу, за что я Вам благодарен. Кстати, нашёл видео только что, где кто-то демонстрирует работу приемника на теа5767 с индикатором уровня сигнала. У этого человека та же проблема (которая, как оказалось. и не проблема вовсе, а техническая особенность). (если интересно, вот ссылка: ) По поводу AGC на 38-й, это хороший совет, спасибо. Попробую!