TEA5767 для всех – добавляем FM радио в свои конструкции.

Радиомодули на базе специализированных микросхем давно перестали быть в новинку. Для создания радиоприемника на подобных модулях нужно лишь правильно подключить антенну, питание, УМЗЧ и как-то управлять им по двухпроводной шине I2C. Вот с управлением и возникают чаще всего проблемы.

В этой заметке, я расскажу, как легко и просто добавить радиомодуль на TEA5767 в свои конструкции. Про любителей готовых решений я тоже не забыл – чуть ниже, я представлю свой вариант тюнера на TEA5767 со схемой, прошивкой и описанием. 

Начнём с распиновки модуля:
Микросхема TEA5767 представляет собой однокристальный УКВ ЧМ приемник с интегрированными функциями преобразования частоты, УПЧ и демодуляции. В качестве гетеродина используется управляемый синтезатор частоты. Для тактирования используется внешний кварцевый резонатор, работающий либо на частоте 32.768 кГц, либо на 13МГц.  Чувствительность радиоприёмника по документам 3.5 мкВ, ширина полосы 200 кГц, диапазон принимаемых частот от 76 до 108 МГц. Есть функция автопоиска радиостанций. Напряжение питания 3.3В, ток потребления около 10 мА. 

Для управления используется шина I2C и два адреса: 0xC0 и 0xC1, на запись и чтение соответственно. Данные о частоте и других настройках передаются в виде последовательности из адреса и 5 байт конфигурации. Для настройки радиоприемника на желаемую станцию. Необходимо вычислить слово PLL, 14-битное значение передающееся по шине в первом и во втором байтах.
 
Таблица битов конфигурации радиомодуля. Щёлкните на картинку для увеличения.

Обратите внимание на PLL13-PLL0 - это и есть слово PLL.  Для вычисления значения, в даташите указаны сразу две формулы – для частоты синтезатора ниже или выше принимаемой. За это установку режима вычитания частот отвечает бит HLSI: 1 – частота синтезатора выше принимаемой, 0 – ниже.

void getPLLWord(float freq)
{
unsigned int freqB;
char freqHi, freqLo;
freqB = 4 * (freq * 1000000 + 225000) / 32768;
freqHi = freqB >> 8;
freqLo = freqB & 0xFF;
data[0] = freqHi;
data[1] = freqLo;
}
Функция вычисления значения PLL и записи получившегося значения в 1 и 2 байты. Для удобства, в начале кода необходимо создать массив типа char из 5 элементов. Переменная freq содержит в себе частоту желаемой станции в МГц. 32768 – частота тактирующего кварца в Гц, если на вашем модуле установлен  кварц в 13МГц, то поменяйте значение на 13000000.

if (main_freq < max_freq){      //если не максимум
      main_freq+=0.1;           //тогда увеличиваем частоту
      getPLLWord(main_freq);    //генерируем слово
      data_transmit();          //передаем по шине
   }
Так как переменная freq является локальной для функции getPLLWord, вместо нее в основной программе используется  переменная main_freq. Изменение частоты приема изменяется путём сложения или вычитания 0.1 от значения переменной main_freq. Таким образом реализован шаг настройки частоты в 100 кГц. Советую так же определить в начале кода константы max_freq и min_freq  используемые для проверки достижения границ диапазона.

Функция data_transmit(); отвечает за передачу данных на микросхему по шине I2C

void data_transmit(void)
{
    int i;
    i2c_start();
    i2c_write(TEA_write);
    for (i=0;i<5;i++){
         i2c_write(data[i]);
    }
    i2c_stop();
}
Думаю, здесь всё понятно - массив при помощи цикла поэлементно передается по шине на радиомодуль. Константа TEA_write содержит адрес для записи микросхемы TEA5767. Её можно не создавать, а использовать адрес напрямую. 

Управление приглушением (установка бита MUTE) выглядит так:

mute ^= 1;
      if (mute){
           data[0] |= 0x80;     //установка 1
       }
       else{
           data[0] &= ~0x80;    //установка 0
       }
Переменная mute в служит флагом включения режима приглушения. Её тип - bit (аналог bool). Данный фрагмент устанавливается в обработку нажатий на кнопку "Приглушение".

Точно так же можно управлять и другими настройками. Для вычисления значений воспользуйтесь калькулятором либо конвертером из двоичной системы в шестнадцатеричную. 

Для удобства использования, настроенная частота и другие настройки должны  записываться в ЕЕПРОМ – энергонезависимую память контроллера. Частоту при включении радиоприемника необходимо проверять, чтобы не выходила за рамки диапазона. Конечно, это лишнее, но всё же, лучше подстраховаться. Другие настройки так же должны быть считаны при старте. Нижеследующий код устанавливается перед основным циклом программы, и исполняется только один раз.

//при старте системы
if ((ee_freq >= min_freq) && (ee_freq <= max_freq)){
    main_freq = ee_freq; // читаем данные из EEPROM
}
getPLLWord(main_freq); //генерируем слово
data[2] = 0x18;        
data[3] = 0x10;
data[4] = 0x40;
data_transmit();           //передаем всё по шине
Настройки трёх последних байт установите свои – данные значения я использовал в своём проекте, который представлю чуть ниже.

Совет: делайте запись в память по таймеру – радиостанций много, и вам не всегда может нравиться то, что там передают, и вы конечно же, захотите переключить. А запись в память при каждой смене частоты приведет к быстрому износу ресурса чтения/записи энергонезависимой памяти микроконтроллера.  

if (wr_timer > 0){
      wr_timer--;
      if ((wr_timer==0) && (ee_freq != main_freq))
       {
         ee_freq = main_freq;
       }
  }
Этот кусочек кода нужно поместить в обработчик прерывания по таймеру. Значение переменной wr_timer (тип int) задается при каждом изменении частоты заново.  При обнулении, как вы уже догадались, происходит запись.
 
Теперь о других настройках. Бит XTAL устанавливает частоту тактовки микросхемы: 1 – 32.768, 0 – 13МГц. BL устанавливает стандарт диапазона приема: 76 до 90 МГц (1) или 88-108 МГц (0). 

Так как в микросхеме есть встроенный стереодекодер, есть и биты управления им: MS – моно/стерео (1 или 0 соответственно), ML – приглушить левый, MR – приглушить правый. Есть еще один интересный бит- SMUTE. Он отвечает за приглушение шумов эфира. Это значит, что привычного шипения при перенастройке вы уже вряд ли услышите. Правда и слабо принимаемых станций вы тоже вероятнее всего не услышите. 

Бит HCC отвечает за установку режима обрезки высоких частот звукового сигнала.

Управление автопоиском производится битами SM – флаг начала поиска станций, SUD – направление поиска: 1 вверх по диапазону, 0 вниз. Биты SSL отвечают за остановку автопоиска. При достижении определенного уровня сигнала поиск останавливается (см. даташит). Если автопоиск не нужен, оставьте эти биты равными 0. 

А теперь переходим к схемам и готовой конструкции! Перед вами принципиальная схема радиоприёмника на базе модуля TEA5767. Управляется данная конструкция микроконтроллером ATMEGA8. Тактовая частота микроконтроллера - 1МГц от внутреннего генератора.  Кнопка SW1 включает/отключает режим приглушения. Установленная частота спустя пол минуты записывается в EEPROM микроконтроллера. При включении происходит считывание данных о последней настроенной частоте. Диапазон принимаемых частот 87-108 МГц. Шаг перестройки по частоте 100 кГц. Напряжение питания конструкции 5В. Общий ток потребления на максимальной громкости не более 300 мА. 

Настройка на частоту желаемой радиостанции производится при помощи инкрементального энкодера (подойдет модуль для Ардуино). Частота индицируется на 7-мисегментном индикаторе. Встроенная в энкодер кнопка задействована под управление приглушением. На схеме есть неточность – емкость конденсатора C5 лучше выбрать более 1000 мкФ.  Громкость регулируется резистором R4. 

Антенна подключена к модулю не напрямую, а через колебательный контур L1C2. Это необходимо для лучшего согласования антенны и входных цепей микросхемы. Так же колебательный контур играет роль фильтра от внедиапазонных помех – контур настроен на частоту 98 МГц – середина диапазона. Катушка L1 намотана на оправке диаметром 5 мм проводом диаметром 0,4 мм и имеет 9 витков. Отвод делается от 3 витка катушки. 

Как я заметил в ходе испытаний и тестов, с контуром L1C2 радиоприёмник принимает намного лучше, даже без антенны, чем если просто подключить антенну ко ВЧ входу модуля. 

УМЗЧ построен на микросхеме TDA2822, включенной по мостовой схеме. Диапазон воспроизводимых частот ограничивается диапазоном динамика в интервале 180-12500Гц. Выходная мощность УМЗЧ около 0.7 Вт. Приёмник воспроизводит передачи в режиме моно. Связано это с конструктивными особенностями выбранного мной корпуса. Если необходимо воспроизведение стерео, в 3-м байте бит MS устанавливается в 0, а УМЗЧ в таком случае собирается по канальной схеме.

В принципе, вместо ATMEGA8 можно использовать платформу Ардуино – кусочки кода у вас уже есть, а исходники на С я выложу ниже. Переделка кода, я уверен, для вас не составит труда.


Вид готовой платы радиоприёмника. Перемычки и пустое место – думал нужны будут транзисторные ключи. Ошибся. Они там даром не нужны. Плату переделывать не стал, но рисунок платы поправил.

Теперь граблях, забытых в высокой траве. При использовании динамической индикации в динамике слышен писк. Раздражающий писк. Это наводки от линий соединения индикатора и микроконтроллера, проникающие в УМЗЧ. По этой же причине, выше было рекомендовано увеличить емкость буферного конденсатора в цепи питания микросхем. Проблему с писком я решил отключением индикатора спустя 15 секунд после настройки на нужную радиостанцию. Можно так же разнести линии питания индикатора и УМЗЧ при разводке платы как можно дальше или использовать сдвиговые регистры.

Еще был кратковременный непонятный звук при включении. Вероятно, это связано с передачей данных по шине и начальной настройкой модуля TEA5767. Решил проблему задержкой включения звука на 3 секунды после включения радиоприемника.


Переделке подвергся радиоприёмник Альпинист 417. Все узлы, как вы видите,  свободно размещаются внутри корпуса.

Антенна припаивается к стандартному разъему на корпусе. Общий провод (минус) питания так же припаивается к разъёму заземления на корпусе. В случае если вещательные радиостанции находятся очень далеко, к этим разъемам можно будет подключить внешнюю антенну. Также не помешает добавить в конструкцию радиоприёмника установить внешнюю телескопическую антенну.

В целом радиоприёмник воспроизводит радиопередачи довольно в хорошем качестве, с частоты не уходит. Система АРУ работает адекватно - все радиостанции звучат с одинаковой громкостью. На распространённые бытовые помехи, типа включенной энергосберегающей лампочки не реагирует. Также проверял вероятность излучения сигнала синтезатора обратно в антенну. Результат – никаких заметных помех приёмник не создаёт.


Вот и всё что я хотел рассказать и показать. Добавить дополнительную опцию FM радиоприёмника в свою конструкцию теперь не составит особого труда. Ниже, я размещу ссылки на готовые прошивки и исходники к ним. Надеюсь материал, изложенный мною выше будет вам полезен. 
Спасибо за терпение и за внимание!

  1. Архив с исходниками - здесь (177 кБ)
  2. Исходники этой же конструкции, только с кнопками вместо энкодера можно скачать здесь (161 кБ) - добавлено 13.02.2022
  3. Прошивки готовой конструкции вот в этом архиве
  4. Рисунок печатной платы в формате Sprint Layout.
Возможно вас заинтересует:
...

Ремонт радиоприёмника Океан 209 - от замены лампочек до FM

Океан 209 - старый добрый друг многих советских семей. Правда порою, подобным друзьям не находится места в новой жизни, поэтому их убирают в кладовку, а то и вовсе отдают на запчасти. Вот и ко мне в руки попал Океан, в еле живом состоянии. Прежние хозяева отдали его мне на детали, а я его восстановил, и теперь он живёт в моей мастерской, ловит FM, поёт и светит шкалой.

Читать больше