Се­год­ня я рас­ска­жу о том, как устро­ены сов­ремен­ные вещатель­ные при­емни­ки, на при­мере SI473X — семей­ства однокрис­таль­ных SDR-при­емни­ков. Заод­но напишем собс­твен­ную биб­лиоте­ку для управле­ния эти­ми чипами. Спро­сишь, зачем нам еще один при­емник? Что­бы поуп­ражнять­ся в их соз­дании, опро­бовать инте­рес­ную мик­росхе­му и, конеч­но же, узнать мно­го нового!
 

Как радиоприемники стали ширпотребом

Прог­ресс не сто­ит на мес­те: в течение пре­дыду­щего сто­летия сто­имость ради­опри­емни­ков сни­жалась, при этом их харак­терис­тики ста­нови­лись все луч­ше. Так, в 20-е годы XX века основной вклад в сто­имость вно­сили ради­олам­пы — вспом­ни хотя бы пер­вый супер­гетеро­дин Армстрон­га, который мы уже упо­мина­ли, говоря об ис­тории супер­гетеро­дина.

На момент сво­его появ­ления он казал­ся совер­шенно безум­ным, так как содер­жал восемь ламп — огромное количес­тво для того вре­мени. А ведь ему нуж­ны были еще батарей­ки общим раз­мером с неболь­шой чемодан!

В 1930-х подоб­ный при­емник уже был впол­не реален и даже про­изво­дил­ся серий­но, а кро­ме того, появи­лись лам­пы кос­венно­го накала, которые мож­но было запитать от сети. Да и цены ста­ли не такие заоб­лачные. В ито­ге при­емник сто­ил при­мер­но как сей­час айфон, и его уже мож­но было пос­тавить на стол, не рис­куя сло­мать пос­ледний.

Сле­дующий этап уде­шев­ления и мини­атю­риза­ции про­ходил дос­таточ­но мед­ленно, лам­пы дешеве­ли и умень­шались в раз­мерах, совер­шенс­тво­валась схе­мотех­ника. Про­дол­жалось это вплоть до 1960-х годов. А про­рыв слу­чил­ся в начале пятиде­сятых, ког­да появи­лись пер­вые серий­ные тран­зисто­ры и на них пос­тро­или пер­вый серий­ный при­емник Regency TR-1.

По харак­терис­тикам он усту­пал лам­повым того вре­мени и сто­ил замет­но дороже, но его уже мож­но было положить в кар­ман. А даль­ше тран­зисто­ры потихонь­ку дешеве­ли, их парамет­ры улуч­шались, а вмес­те с ними ста­нови­лись мень­ше и эко­номич­нее при­емни­ки. Появи­лись интеграль­ные схе­мы, и где‑то к 1970-м годам количес­тво тран­зисто­ров в устрой­стве перес­тало сущес­твен­но вли­ять на цену. Все боль­ший вклад в раз­мер и цену ста­ли вно­сить кон­туры про­межу­точ­ной час­тоты и вход­ные перес­тра­иваемые цепи.

Оче­ред­ной рывок про­изо­шел в начале вось­мидеся­тых, ког­да инже­нерам фир­мы Philips уда­лось умес­тить весь ради­очас­тотный тракт в одну мик­росхе­му. А кро­ме того, за счет схе­мотех­ничес­ких ухищ­рений изба­вить­ся от всех кон­туров, кро­ме гетеро­дин­ного. Мик­росхе­ма получи­ла наз­вание TDA7000, а про­тотип при­емни­ка, пред­став­ленный в рек­ламных целях, выг­лядел доволь­но‑таки необыч­но.

Прототип приемника на TDA7000
Про­тотип при­емни­ка на TDA7000

Шту­ка получи­лась на ред­кость удач­ная, поэто­му вско­ре появи­лись TDA7021 (PDF) с под­дер­жкой сте­реоко­диро­вания и TDA7088 (PDF), где добави­лась воз­можность авто­поис­ка стан­ций. В пос­ледней мик­росхе­ме исполь­зовалась неболь­шая циф­ровая часть, которая за этот самый поиск отве­чала. Впро­чем, там все было устро­ено дос­таточ­но при­митив­но, но про­дер­жалась такая конс­трук­ция дос­таточ­но дол­го. Это имен­но те при­емни­ки, которые встра­ива­ли чуть ли не в зажигал­ки в начале 2000-х.

Рос­сий­ские раз­работ­чики хоть и отста­вали, но переня­ли опыт, в резуль­тате чего появи­лась зна­мени­тые К174ХА34 (TDA7021), К174ХА42 (TDA7000) и очень забав­ная гиб­ридная схе­ма СХА058.

СХА058
СХА058

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

Се­год­ня нас­тупила эра SDR/DSP-при­емни­ков, в которых основная обра­бот­ка сиг­нала выпол­няет­ся матема­тичес­ки на оциф­рован­ных дан­ных, мы это уже обсужда­ли, ког­да собира­ли ZetaSDR. Но там обра­бот­ка оциф­рован­ного сиг­нала про­исхо­дила на ПК. А мож­но ли обой­тись без компь­юте­ра? Да лег­ко: в 2001 году Philips выпус­тила чип TEA5767 (PDF), пред­став­ляющий собой однокрис­таль­ный циф­ровой при­емник. Этот чип тре­бовал минимум обвязки, имел циф­ровое управле­ние и позици­они­ровал­ся (PDF) как удоб­ный вари­ант для встра­ива­ния в раз­личные гад­жеты типа MP3-пле­еров и мобиль­ных телефо­нов. Сре­ди его дос­тоинств — квар­цевая ста­били­зация час­тоты и воз­можность декоди­ровать сте­рео.

TEA5767 с полной обвязкой
TEA5767 с пол­ной обвязкой

Чуть поз­же появил­ся более совер­шенный чип RDA5807. Он изба­вил­ся от пос­ледне­го колеба­тель­ного кон­тура в обвязке. Собс­твен­но, там и обвязки‑то не оста­лось, при этом при­нима­емый диапа­зон был замет­но рас­ширен (64–108 МГц), появи­лась под­дер­жка RDS. Чувс­тви­тель­ность ста­ла повыше, качес­тво зву­ка тоже, и, что самое уди­витель­ное, эта кро­ха спо­соб­на тянуть 32-омные науш­ники без допол­нитель­ного уси­лите­ля. И все это мень­ше чем за десять руб­лей! А сверх того, чип име­ет обратную сов­мести­мость с RDA5807, да и вооб­ще спо­собен ра­ботать без управля­юще­го мик­рокон­трол­лера. Но с кон­трол­лером все же веселее.

RDA5807 с обвязкой
RDA5807 с обвязкой

Но даже все перечис­ленное не пре­дел: в чип мож­но запих­нуть еще и ДВ/СВ/КВ‑при­емник, как это сде­лано в KT0915 (PDF), AKC6951 (PDF) (тут еще и пер­вые нес­коль­ко каналов TV при­нимать мож­но) и SI473Х, о которых мы и будем говорить даль­ше.

Мы соз­дадим сов­ремен­ный ради­опри­емник, подоб­ный сов­ремен­ным ком­мерчес­ким образцам, таким как PL330 и ETON SATELLIT. Но наше изде­лие будет при этом мак­сималь­но прос­тым и эффектив­ным.

PL330
PL330
ETON SATELLIT
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,SI4734ADR ...), где SI4734I2C — исполь­зуемая шина I2C (I2C1), а SI4734ADR — семибит­ный адрес SI4734 0x11. О бите записи/чте­ния за нас позабо­тит­ся биб­лиоте­ка. В ито­ге работа с мик­росхе­мой вкрат­це будет пред­став­лять собой сле­дующую пос­ледова­тель­ность дей­ствий: ини­циали­зация, нас­трой­ка режима работы, нас­трой­ка на нуж­ную час­тоту. Все опи­сан­ное ниже опи­рает­ся на содер­жание докумен­тов 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 0x01, которая тре­бует два парамет­ра. Пер­вый вклю­чает так­тирова­ние и опре­деля­ет режим работы, а вто­рой нас­тра­ивает ауди­овы­ходы. Мы исполь­зуем часовой кварц и ана­лого­вые выходы, поэто­му для FМ при­меня­ются парамет­ры 0x10, 0x05, а для АM — 0x11, 0x05. Пос­ле отправ­ки коман­ды, опра­шивая чип, дожида­емся отве­та 0x80. Обыч­но на это ухо­дит один‑два зап­роса.

#define SI4734I2C I2C1
#define SI4734ADR 0x11
uint8_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 и запус­тит квар­цевый генера­тор, что про­веря­ется осциллог­рафом. Если коман­ды отправ­лены вер­но, а генера­тор не запус­тился, то, веро­ятно, чип битый.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Оставить мнение