Содержание статьи
Как радиоприемники стали ширпотребом
Прогресс не стоит на месте: в течение предыдущего столетия стоимость радиоприемников снижалась, при этом их характеристики становились все лучше. Так, в 20-е годы XX века основной вклад в стоимость вносили радиолампы — вспомни хотя бы первый супергетеродин Армстронга, который мы уже упоминали, говоря об истории супергетеродина.
На момент своего появления он казался совершенно безумным, так как содержал восемь ламп — огромное количество для того времени. А ведь ему нужны были еще батарейки общим размером с небольшой чемодан!
В 1930-х подобный приемник уже был вполне реален и даже производился серийно, а кроме того, появились лампы косвенного накала, которые можно было запитать от сети. Да и цены стали не такие заоблачные. В итоге приемник стоил примерно как сейчас айфон, и его уже можно было поставить на стол, не рискуя сломать последний.
Следующий этап удешевления и миниатюризации проходил достаточно медленно, лампы дешевели и уменьшались в размерах, совершенствовалась схемотехника. Продолжалось это вплоть до 1960-х годов. А прорыв случился в начале пятидесятых, когда появились первые серийные транзисторы и на них построили первый серийный приемник Regency TR-1.
По характеристикам он уступал ламповым того времени и стоил заметно дороже, но его уже можно было положить в карман. А дальше транзисторы потихоньку дешевели, их параметры улучшались, а вместе с ними становились меньше и экономичнее приемники. Появились интегральные схемы, и где‑то к 1970-м годам количество транзисторов в устройстве перестало существенно влиять на цену. Все больший вклад в размер и цену стали вносить контуры промежуточной частоты и входные перестраиваемые цепи.
Очередной рывок произошел в начале восьмидесятых, когда инженерам фирмы Philips удалось уместить весь радиочастотный тракт в одну микросхему. А кроме того, за счет схемотехнических ухищрений избавиться от всех контуров, кроме гетеродинного. Микросхема получила название TDA7000, а прототип приемника, представленный в рекламных целях, выглядел довольно‑таки необычно.
Штука получилась на редкость удачная, поэтому вскоре появились TDA7021 (PDF) с поддержкой стереокодирования и TDA7088 (PDF), где добавилась возможность автопоиска станций. В последней микросхеме использовалась небольшая цифровая часть, которая за этот самый поиск отвечала. Впрочем, там все было устроено достаточно примитивно, но продержалась такая конструкция достаточно долго. Это именно те приемники, которые встраивали чуть ли не в зажигалки в начале 2000-х.
Российские разработчики хоть и отставали, но переняли опыт, в результате чего появилась знаменитые К174ХА34 (TDA7021), К174ХА42 (TDA7000) и очень забавная гибридная схема СХА058.
А вот на создание аналога TDA7088 ресурсов у отечественного производителя уже не хватило, или, скорее, стало не до того. В любом случае, сейчас все эти чипы считаются устаревшими и не производятся, за исключением клонов TDA7088, но и ему, видать, недолго осталось.
Сегодня наступила эра SDR/DSP-приемников, в которых основная обработка сигнала выполняется математически на оцифрованных данных, мы это уже обсуждали, когда собирали ZetaSDR. Но там обработка оцифрованного сигнала происходила на ПК. А можно ли обойтись без компьютера? Да легко: в 2001 году Philips выпустила чип TEA5767 (PDF), представляющий собой однокристальный цифровой приемник. Этот чип требовал минимум обвязки, имел цифровое управление и позиционировался (PDF) как удобный вариант для встраивания в различные гаджеты типа MP3-плееров и мобильных телефонов. Среди его достоинств — кварцевая стабилизация частоты и возможность декодировать стерео.
Чуть позже появился более совершенный чип RDA5807. Он избавился от последнего колебательного контура в обвязке. Собственно, там и обвязки‑то не осталось, при этом принимаемый диапазон был заметно расширен (64–108 МГц), появилась поддержка RDS. Чувствительность стала повыше, качество звука тоже, и, что самое удивительное, эта кроха способна тянуть 32-омные наушники без дополнительного усилителя. И все это меньше чем за десять рублей! А сверх того, чип имеет обратную совместимость с RDA5807, да и вообще способен работать без управляющего микроконтроллера. Но с контроллером все же веселее.
Но даже все перечисленное не предел: в чип можно запихнуть еще и ДВ/СВ/КВ‑приемник, как это сделано в KT0915 (PDF), AKC6951 (PDF) (тут еще и первые несколько каналов TV принимать можно) и SI473Х, о которых мы и будем говорить дальше.
Мы создадим современный радиоприемник, подобный современным коммерческим образцам, таким как PL330 и ETON SATELLIT. Но наше изделие будет при этом максимально простым и эффективным.
Почему SI4734
SI4735 отличается от других упомянутых чипов тем, что поддерживает патчи прошивки, а это открывает доступ к дополнительным функциям. Так, в сети есть патч, который позволяет принимать сигналы с SSB-модуляцией. Что в ней такого, спросишь ты? Да в общем, ничего особенного, просто на ней работают любители в КВ‑диапазонах, и их порой интересно послушать. И это, наверное, самый простой вариант такого приемника.
Хорошо, с SI4735 разобрались, а почему в заголовке значится SI4734? Дело в том, что все микросхемы SI473X совместимы «pin в pin» и отличаются только набором функций. Младшие модели (SI4730, SI4731) поддерживают длинные волны и FM, а старшие модели (SI4732, SI4735) поддерживают еще и короткие волны и RDS. SI4734 поддерживает КВ, но не умеет RDS. Кроме всего прочего, они здорово различаются по цене: SI4730 стоит примерно 100 рублей, SI4734 — 150, SI4735 — порядка 500 рублей. Правда, всего год назад они были минимум в три раза дешевле, ну да это известная сейчас проблема.
Патч официально поддерживает только SI4735, на ней я и хотел экспериментировать. Но купленный мною экземпляр оказался нерабочим, поэтому я поставил SI4734-D60, который имелся в загашнике. А заодно попробовал скормить этому чипу патч, и, к моему удивлению, он сработал. Так что, если тебе не нужен RDS, можно сэкономить.
Обрадовавшись такому успеху, я попробовал поковырять SI4730-D60, тем более что в сети проскальзывала информация, будто некоторые из этих чипов могут работать на КВ. Однако у меня они не заработали и патч на них тоже не встал. Очень вероятно, что патч сработает и на SI4732, поскольку китайцы часто добавляют эту микросхему в наборы своих приемников и заявляют о поддержке SSB.
Схемотехника
Для наших экспериментов мы соберем относительно несложную конструкцию, состоящую из двух блоков: блока управления и блока приемника. Блок управления соберем на STM32F030, добавим к нему энкодер, дисплей OLED и восемь кнопок. От кнопок можно вовсе отказаться, но с ними управлять приемником намного удобнее. За клавиатуру будет отвечать PCF8574, очень удобная микросхема — расширитель портов с I2C-интерфейсом. Введение расширителя портов хоть и усложняет схему, но упрощает разводку платы и опрос кнопок. Питать все это дело удобно с помощью LiPO-аккумулятора, поэтому добавим туда еще контроллер заряда и DC/DC-преобразователь на RT9136 для питания контроллера. Использование активного преобразователя целесообразно в плане повышения КПД.
Выходной мощности SI4735 недостаточно для раскачки стандартных 32-омных наушников, поэтому нужен аудиоусилитель, даже два, так как у нас стерео. В качестве усилителя использована микросхема TDA2822 (PDF) в стандартном включении. Это не лучший вариант по двум причинам: во‑первых, у нее слишком высок коэффициент усиления, а во‑вторых, на мой вкус, она слишком шумит. Лучше на эту роль подойдет LM4863 (PDF), но у меня ее не оказалось под рукой. Тем не менее TDA2822 недурно справляется со своей задачей.
В заводских решениях обычно используется УВЧ и магнитная антенна, мы же поступим проще: поставим на вход фильтр 5-го порядка с частотой среза и будем использовать полноразмерную антенну — все равно на штырь в квартире можно ловить только помехи, FM и пару китайских станций в хороший день. Что же касается FM-входа, то ему комфортно и без входных цепей. Кроме того, саму SI4734 вместе со входными цепями мы поместим в экран из жести (плата двухсторонняя, вторая сторона — сплошная медь), благо это совсем не сложно. Использование внешней полноразмерной антенны сильно снизит наводки от цифровой части и избавит от УВЧ.
Что касается этой самой цифровой части, то тут каких‑либо особенностей нет. Схема, платы и прочее лежат на GitHub. Вешать постоянно обновляющийся дисплей и клавиатуру на одну шину с SI4734 — не очень хорошая идея из‑за возможных помех, однако остановка контроллера и выключение дисплея на слух не вносит изменений. Отсюда можно сделать вывод, что в городе гораздо больший вклад в качество приема вносит зашумленность эфира.
Оформлено это в достаточно минималистичном стиле, впрочем, корпуса я делать никогда не любил. У меня получилось что‑то среднее между макетом и законченным устройством, но транспортировку и полевое использование приемник пережил не поморщившись.
info
Предвидя вопросы, скажу сразу, что управляющий блок можно собрать и на Blue Pill, и на ARDUINO, в последнем случае на Али можно купить уже собранную плату. Обойдется это примерно в 3000 рублей. А за дополнительные деньги к этому делу можно докупить корпус. Но это не наш метод, мы же собрались поковыряться с SI4734!
Прошивка
В сети достаточно руководств по сборке приемников на SI4735, однако большинство авторов делают акцент на схемотехнику и сборку на макете, после чего туда заливают один из вариантов готовой прошивки. Мы же попробуем разобраться, как написать такую прошивку самостоятельно почти с нуля, поэтому все нижесказанное достаточно легко перенести на любой другой микроконтроллер, лишь бы у него хватало памяти для хранения патча.
Итак, что же за зверь SI4734 и с чем его едят? Этот чип управляется по шине I2C, и каждая посылка представляет собой адрес микросхемы (с битом переключения запись/чтение), 1 байт команды и до 7 байт аргументов. У каждой команды свое количество аргументов, впрочем, даташит говорит, что посылки можно сделать и фиксированной длины, если вместо неиспользуемых аргументов слать 0x00
. Для наших целей понадобится не так много команд, поэтому мы можем позволить себе написать для каждой свою функцию. Результатом выполнения команды можно считать ответ, состоящий из байта статуса и до 7 байт собственно ответа, причем и здесь допускается унификация длины: можно читать по 8 байт, все неиспользуемые будут 0x00
.
Но тут есть нюанс: команда выполняется не мгновенно, а с задержкой, до истечения которой микросхема будет отвечать только нулями. Поэтому, когда нам необходим ответ, мы с некоторой периодичностью будем его считывать, пока первый байт ответа не будет равен 0x80
, что свидетельствует о завершении исполнения команды. Следом можно считать байты ответа и/или отправлять следующую команду.
Для отправки и чтения пакетов по I2C мы будем использовать уже известную нам команду библиотеки LibopenCM3 i2c_transfer7(
, где SI4734I2C
— используемая шина I2C (I2C1), а SI4734ADR
— семибитный адрес SI4734
. О бите записи/чтения за нас позаботится библиотека. В итоге работа с микросхемой вкратце будет представлять собой следующую последовательность действий: инициализация, настройка режима работы, настройка на нужную частоту. Все описанное ниже опирается на содержание документов AN332 «Si47XX Programming Guide» и AN332SSB.
Инициализация
Прежде всего SI4734 нужно инициализировать. Сделать это можно в одном из трех режимов: AM, FM или SSB. Перед началом инициализации документация рекомендует выполнить сброс. Делается это тривиально: надо ненадолго подтянуть к земле REST-пин SI4734. Для задержки используется совершенно ленивая функция, благо точность тут не имеет особого значения.
#define SI4734D60_RSTPORT GPIOA#define SI4734D60_RSTPIN GPIO7#define SI4734_RST_CLR() gpio_clear(SI4734D60_RSTPORT, SI4734D60_RSTPIN)#define SI4734_RST_SET() gpio_set(SI4734D60_RSTPORT, SI4734D60_RSTPIN)void delay(uint16_t ms){ uint64_t temp; temp=ms<<10; while(temp--)__asm__("nop");}void si4734_reset(){ SI4734_RST_CLR(); delay(10); SI4734_RST_SET(); delay(10);}
Для инициализации используется команда POWER_UP
, которая требует два параметра. Первый включает тактирование и определяет режим работы, а второй настраивает аудиовыходы. Мы используем часовой кварц и аналоговые выходы, поэтому для FМ применяются параметры 0x10
, 0x05
, а для АM — 0x11
, 0x05
. После отправки команды, опрашивая чип, дожидаемся ответа 0x80
. Обычно на это уходит один‑два запроса.
#define SI4734I2C I2C1#define SI4734ADR 0x11uint8_t si4734_fm_mode(){ // ARG1 (1<<4)|0 AN322 p130 // ARG2 00000101 uint8_t cmd[3]={POWER_UP,0x10,0x05}; uint8_t status, tray=0; i2c_transfer7(SI4734I2C,SI4734ADR,cmd,3,0,0); delay(1000); do{ i2c_transfer7(SI4734I2C,SI4734ADR,0,0,&status,1); tray++; if(tray==255) return 0xff; delay(50); }while(status!=0x80); return status;}uint8_t si4734_am_mode(){ // ARG1 (1<<4)|1 AN322 p130 // ARG2 00000101 uint8_t cmd[3]={POWER_UP,0x11,0x05}; uint8_t status, tray=0; i2c_transfer7(SI4734I2C,SI4734ADR,cmd,3,0,0); delay(1000); do{ i2c_transfer7(SI4734I2C,SI4734ADR,0,0,&status,1); tray++; if(tray==255) return 0xff; delay(50); }while(status!=0x80); return status;}
В ответ на команду POWER_UP
чип может выдать еще 8 байт, которые даташит рекомендует проверять, однако на это можно забить и даже их не считывать. На данном этапе уже можно проверить качество работы микросхемы: исправная вернет ответ 0x80
и запустит кварцевый генератор, что проверяется осциллографом. Если команды отправлены верно, а генератор не запустился, то, вероятно, чип битый.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»