TEA5767

Тема в разделе "Arduino & Shields", создана пользователем MaksOne, 15 дек 2019.

Метки:
  1. MaksOne

    MaksOne Нерд

    Доброго времени суток! Решил встроить 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(), но бесполезно. Уровень как зависает после перестройки, так и не меняется. В чем может быть причина? Почему режим моно/стерео всегда отображается актуальный, а уровень сигнала только тот, что был на момент перестройки частоты?
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Вы антенну отключали ? Это не меняет показания уровня ?
    2. В каких пределах значения уровня вообще меняются ?
     
    Последнее редактирование: 16 дек 2019
  3. MaksOne

    MaksOne Нерд

    Да, антенну отключал. Это была первая мысль проверить, меняется ли уровень сигнала. Ничего не происходит. А по поводу значений - в описании библиотеки сказано, что от 0 до 15. На деле где-то от 5 при отключенной антенне и ненастроенном приемнике, и до 14 при подключенной антенне и настройке на самую мощную станцию.
     
  4. parovoZZ

    parovoZZ Гуру

    а оно вообще умеет отслеживать уровень несущей?
     
  5. MaksOne

    MaksOne Нерд

    Да, судя по техническому описанию и коду в библиотеке 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 не должно быть то же самое?
     
  6. Airbus

    Airbus Радиохулиган Модератор

    А что уровень несущей должен резко менятся?
     
  7. parovoZZ

    parovoZZ Гуру

    ?
     
  8. MaksOne

    MaksOne Нерд

    Разумеется нет ) Но он не меняется от слова "совсем", даже когда отключаешь антенну. И, как я уже сказал, если подавать на модуль команду настройки на ту же самую частоту, на которую он настроен в данный момент, то уровень сигнала тоже скачет, показывая актуальное значение. А это значит, что он меняется, причём в пределах, достаточных для того, чтобы число от 0 до 15 менялось.
    Если настроиться на станцию, скажем, частотой 105.0 МГц, то при подключенной антенне уровень сигнала может показывать 14 из 15. Если отключить антенну и подать на приемник команду снова настроиться на эту же частоту (105.0), то уровень без антенны покажет где-то 5...7. Но, если не перестраивать приёмник, а просто подключать/отключать антенну, уровень сигнала почему-то не меняется. Чего не скажешь о том же "стерео/моно"
     
  9. MaksOne

    MaksOne Нерд

    Я имею ввиду, что ардуина получает от модуля ТЕА5767 информацию о типе сигнала "стерео/моно" в реальном времени, и в зависимости от качества сигнала информация меняется, в любой момент времени являясь актуальной. Информация об уровне сигнала ардуина запрашивает тем же самым образом, что и информацию о стерео/моно, но модуль выдаёт ответ только в момент перестройки приёмника.
     
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Посмотрел ДШ на микру. Написано что данные об уровне появляются через 10мс после настройки. Но ни слова о том постоянно ли происходит измерение. Может и нет. Цифровые процессы очень шумные, может их свели до минимума. Попробуйте мерить уровень несущей по сигналу AGC на 38й ноге АЦП-шкой Ардуины. Есть и еще одна точка.
     
    Последнее редактирование: 16 дек 2019
    MaksOne нравится это.
  11. MaksOne

    MaksOne Нерд

    Действительно? Видимо, я что-то упустил. Значит, только один раз через 10 мс после перестройки. Это ключевая информация по данному вопросу, за что я Вам благодарен. Кстати, нашёл видео только что, где кто-то демонстрирует работу приемника на теа5767 с индикатором уровня сигнала. У этого человека та же проблема (которая, как оказалось. и не проблема вовсе, а техническая особенность). (если интересно, вот ссылка:

    )
    По поводу AGC на 38-й, это хороший совет, спасибо. Попробую!