РадиоКот >Схемы >Цифровые устройства >Защита и контроль >

Теги статьи:

Радиомодули для беспроводной передачи данных. Часть 1.

Автор: Сергей Безруков (aka Ser60), sergeilb60@mail.ru
Опубликовано 22.10.2014
Создано при помощи КотоРед.

Эта статья первая из планируемой серии статей, посвящённых изготовлению и использованию радиомодулей для субгигагерцового диапазона, основанных на микросхемах приёмников/передатчиков фирм Silicon Laboratories и Texas Instruments. Описанные конструкции работают в диапазоне 915 мгц, но при соответствующей замене пассивных компонентов и коррекции кода управляющего МК эти модули можно будет использовать и в диапазонах 315/430/860 мгц.

Начнём с самой, пожалуй, простой микросхемы передатчика Si4012 фирмы Silicon Labs с розничной ценой в 1 USD. Микросхема выпускается в корпусе с всего 10 выводами и развивает мощность на выходе до +11 dBm (12.5 mW) при модуляции OOK или 2-FSK и скорости передачи до 100 kbaud. Одной из особенностей микросхемы является возможность работы без кварцевого кристалла. Патентованная технология фирмы обеспечивает достаточную для некоторых приложений точность установки и стабильность частоты в широком диапазоне температур. Но мы не будем экономить на широкораспространённом кристалле на 10 мгц и включим его в схему. Иллюстрации в статье увеличиваются щелчком мышкой.

РЧ тракт микросхемы имеет дифференциальный выход с ОК, нагрузкой которого является дроссель L5. Дроссели L3,L4 служат для распределения питания на дифференциальные выходы, а компоненты C1-C5,L1,L2 образуют антенный фильтр и балун (balun) для согласования высокого выходного импеданса микросхемы с асимметричной 50-омной нагрузкой. Номиналы конденсаторов C1-C7 в пикофарадах, а дросселей L1-L5 в наногенри. Взяты они из [1], где также приведены номиналы для других диапазонов частот. Дроссель L6 – ферритовая бусина. При острой необходимости его можно исключить из схемы. В качестве антенны я использовал кусок одножильного медного провода диаметром 0.5 мм и длиной в четверть волны (около 82 мм). Не утверждая, что показанный на схеме балун обеспечивает идеальное согласование с такой антенной, результаты на практике получились вполне удовлетворительные, см. ниже

Выводы на правой по схеме стороне микросхемы предназначены для связи с МК. К выводу 6 можно подключить LED (по желанию) для индикации работы передатчика. Отмечу, что LED не требует токоограничительного резистора, т.к. в микросхеме имеется встроенный перестраеваемый генератор тока. Конфигурация передатчика и загрузка в него данных для передачи производится по SMBus интерфейсу. Этот интерфейс совместим с I2C за исключением некоторых нюансов, которые в нашем случае несущественны. Подробнее о сравнении этих интерфейсов можно прочитать, например, в [2]. Вывод 7 передатчика может быть сконфигурирован на запрос различных прерываний для МК. Наконец, вывод 8 служит для перевода микросхемы в спящий режим с низким токотреблением. Достигается это путем подтяжки вывода к напряжению питания. Перевод также можно осуществить командами по шине SMBus при условии, что вывод 8 соединён с общим проводом. О рациональности такого решения см. ниже.

Модуль собран на плате размером 24×14 мм и толщиной 0.8 мм. Фольга на обратной стороне платы используется в качестве общего провода. Зелёными кружками на эскизе платы показаны переходные отверстия (via) диаметром 0.3 мм с нижнего слоя земли на верхний. В них вставлены отрезки медного провода, распаянные с обеих сторон платы. На верхней стороне платы имеется одна проволочная перемычка. С обратной стороны платы выходит коннектор (header) с шагом 2.54 мм. Файл платы для системы Eagle прилагается.

 

Все пассивные компоненты типоразмера 0402. Применять детали типоразмера 0603 и выше в РЧ трактах таких устройств фирмы не рекомендуют из-за большей индуктивности их выводов по сравнению с 0402. Я, правда, не проверял на практике насколько это существенно. Красный LED в корпусе 0603, размеры корпуса кварцевого кристалла 3.2×2.5 мм, его нагрузочная ёмкость 12 пФ. Микросхема сконфигурирована на формирование входной ёмкости 3 пФ на выводе 1, что в сочетании с C6 обеспечивает номинальную нагрузку кристаллу.

В качестве управляющего МК я использовал модель семейства Tiny Gecko с архитектурой ARM Cortex-M3 фирмы Energy Micro, которая уже около года входит в состав Silicon Labs. Далее я подробно опишу работу с передатчиком, так что вы сможете применить его со своим любимым МК. Схема включения моего МК особенностей не имеет и пояснений не требует. Разъём в правой части схемы служит для программирования МК и внутрисхемной отладки.

Для облегчения настройки модуля фирма предлагает в свободном доступе 2 программных продукта. Первый – это Wireless Development Suite (WDS). Её можно использовать с демонстрационными платами фирмы, или просто отдельно просимулировать работу разных радио-чипов. В последнем случае система генерирует код на языке С для использования чипа в установленном режиме и может открыть созданный на лету проект для МК серии С8051 фирмы в Silicon Labs IDE. Вот так выглядит окно контроля передатчика Si4012 в WDS:

Второй продукт – это спредшит (spreadsheet) специально для Si4012, где можно установить требуемые параметры передатчика и получить значения для загрузки в его регистры. Работа со спредшитом описана в [3]. Наконец, имеется документ [4] с описанием тестовых программ под разные ситуации.

Для настройки Si4012 я использовал упомянутый спредшит, показанный ниже. В левой колонке “User Input” при работе на штыревую антенну следует заполнить только 2 средние таблицы. В первую из них заносим желаемую выходную мощность (11 dBm) и рабочую частоту (у меня 903 мгц). Номиналы обоих конденсаторов следует установить в 0. Они предназначены для настройки чипа при работе с печатной рамочной антенной. Во второй таблице выбираем вид модуляции (в статье рассматривается только FSK), bit rate, и девиацию частоты.

Чем больше bit rate, тем скорее передастся сообщение и тем меньше будет работать передатчик, что хорошо для снижения токопотребления. С другой стороны, при больших скоростях передачи следует расширять полосу пропускания приёмника, из-за чего падает его чувствительность и избирательность, так что нужен компромисс. Для передачи небольшого объёма информации достаточно bit rate в 1.2 kbaud.

С девиацией дело обстоит несколько сложнее. Она тоже зависит от bit rate и её следует увеличивать с ростом последнего. Выбор девиации также сильно зависит от приёмника. Обратите внимание, что несмотря на установку девиации 11.1 кгц, фактическое её значение, показанное в колонке “Calculated Results” оказалось 12.29 кгц. Отличие произошло из-за дискретности установки частот синтезатора передатчика. Следующее по убыванию возможное значение девиации 9.89 кгц (при рабочей частоте 903 мгц), т.е. дискрет изменения девиации 2.4 кгц и зависит от частоты. Для экспериментов в качестве приёмника я использовал CC1101 фирмы Texas Instruments (о нём подробнее пойдет речь в другой раз, а пока см. [6]), у которого, также из-за дискретности синтезатора, возможные значения девиации 9.52, 10.31, 11.1, 11.9, 12.7 кгц, и т.д. После подбора фактических значений частоты и девиации, данные из третьей колонки спредшита, показанные на зелёном фоне, следует загрузить в Si4012.

Команды управления Si4012, как и у других радио-чипов фирмы, разделены на 2 класса: собственно команды, и настройки (properties). Первые предназначены для оперативного контроля чипа, например включить или выключить LED, начать передачу, изменить состояние, прочитать флаги прерываний. Всего имеется 13 комманд, см. детали в ДШ. Настройки служат для установки параметров передачи, например рабочей частоты, частоты кристалла, выходной мощности, интенсивности LED.

Посылка команды в Si4012 по интерфейсу SMBus начинается с засылки адреса чипа (0хЕ0), после чего следует код команды и некоторое число параметров, описанных в ДШ. После засылки команды следует считать байт статуса, содержащий готовность чипа к принятию новой команды и код ошибки, если такая произошла. Ряд команд, например чтение product/revision ID предполагают приём нескольких байтов данных после байта статуса. Некоторые команды (например, начать передачу), исполняются асинхронно и бит готовности в статусе лишь показывает готовность чипа к приёму новой команды (например, прекратить передачу), но не означает завершение исполнения предыдущей. Интерфейс SMBus поддерживает тактирование на частотах 100 или 400 кгц, но чип иногда автоматически тормозит МК, не допуская перегруз себя данными. Торможение (clock stretching) осуществляется путём притягивания чипом на короткое время линии SCL к земле. Это следует учитывать в программе МК, особенно если используется программный драйвер SMBus/I2C. В этом случае перед формированием каждого импульса на линии SCL следует проверять её состояние. Аппаратные модули I2C многих современных МК предполагают возможность торможения ведомым устройством и автоматически адаптируются без участия пользователя. Вот, к примеру, как выглядит осциллограмма разрешения прерывания по окончании передачи пакета и установки интенсивности LED. Нерегулярность на линии SCL – результат торможения МК передатчиком.

На этом-же примере показан протокол обмена данными. Так, для разрешения прерывания в Si4012 сначала засылается его SMBus адрес 0xE0, затем код команды 0х63 с последующей маской прерывания 0х08, предназначенной для индикации завершения передачи пакета. По окончании этой посылки следует сформировать сигнал STOP и далее запросить чтение из чипа байтом 0хЕ1. Принятый байт статуса 0х80 символизирует об отсутствии ошибок и готовности Si4012 к приёму следующей команды. Важно подчеркнуть, что для перехода от записи данных к чтению статуса необходимо сформировать сигнал STOP (красный квадратик). Без него последующий сигнал START (зелёный кружок) не воспринимается Si4012 как повторный START при переходе от записи к чтению.

Пример выше также иллюстрирует установку (property) интенсивности LED. Для этого в Si4012 после его адреса 0хЕ0 посылается команда установки property 0х11 с последующим кодом property (в этом случае также 0х11) и его значением 0х03 – максимальная интенсивность LED, см. ДШ. Последние 2 байта – чтение статуса – такие-же как и после отправки команды.

После того, как мы разобрались с интерфейсом передатчика, можно приступить к разработке тестового приложения. Итак, мы хотим с интервалом в одну секунду передавать пакет, скажем, из 5 байт, где первый байт – номер пакета, а остальные 4 пусть пока будут фиксированными и соответствуют строке “ABCD”. Цель приложения – принять пакет на стороне приёмника (чип CC1101) и оценить дальность связи. Раз в игру вступает приёмник, поговорим сначала немного о нём. Прежде всего, почему СС1101? Объясняется это простотой общения с приёмником с помощью CC-debugger и продвинутои системы SmartRF Studio от Texas Instruments. При этом ничего и программировать не надо. Модуль приёмника, подключенный через CC-debugger к компьютеру, показан ниже. В качестве антенны у приёмника также использован отрезок провода длиной 82 мм. Подробнее обо всём этом хозяйстве в другой раз, сейчас-же необходимо понять в каком формате следует посылать данные приёмнику.

В приёмнике на чипе СС1101, помимо всего прочего, реализована автоматическая обработка пакетов с распознаванием битов преамбулы и синхрослова, проверкой длины сообщения, и автоматической проверкой CRC (Cyclic Redundancy Check) пакета. Само собой, всё это следует добавить на стороне передатчика к передаваемым данным. Многие передатчики (в частности и от Silicon Labs, о которых речь пойдет в следующий раз) автоматически дополняют пакет преамбулой, синхрословом, CRC и пр. на аппаратном уровне. Нам-же, с Si4012, предстоит это сделать самим программно. Следуя требуемой структуре пакета для СС1101, мы должны передать в него следующую последовательность байтов (шестнадцатиричные числа):

0хАА 0хАА 0хАА 0хАA 0хD3 0х91 0хD3 0х91 0х05 XX 0х41 0х42 0х43 0х44 YY ZZ

Первые 4 байта пакета – это преамбула, т.е. чередующаяся последовательность нулей и единиц 10101010... для синхронизации во времени выборок битов приёмником с их посылкой передатчиком. Следующие 4 байта – две копии синхрослова D3 91, позволяющего приёмнику отделить биты преамбулы от информационной части пакета (можно ограничиться и одним синхрословом). Синхрослово может быть практически любым, но известным приёмнику до посылки пакета. Мы его изменять не будем. Байт 05 в данном случае это длина информационной части пакета, в которой байт ХХ – номер пакета. Следующие 4 байта (41 42 43 44) – ASCII коды символов строки “ABCD”.

Пакет завершают два байта контрольной суммы CRC (YY и ZZ, где YY – старший байт), соответствующие информационной части пакета, начиная с байта его длины 05 и кончая последним байтом 44. Вообще, CRC можно и не передавать, отменив в приёмнике её проверку, но давайте всё сделаем как следует. В СС1101 аппаратно реализована проверка CRC на основе широко используемого полинома CRC16 (x16 + x15 + x2 + 1). Этот полином также используется и в других приёмниках/передатчиках фирм Silicon Labs и TI. Вдаваться в подробности вычисления CRC выходит за рамки настоящей статьи, за деталями можно обратиться к [5]. В прилагаемой программе формирование пакета и вычисление CRC производится функциями Compose_Package() и Compute_CRC16() в файле main.s.

Разобравшись с тем, что следует передавать, чтобы нас поняли на приёмном конце, мы вплотную подошли к программированию алгоритма приложения. Основная программа (метка start в файле main.s) начинается с конфигурирования периферии МК (тактовый генератор, GPIO, модуль I2C, и таймер). Затем программа входит в бесконечный цикл с периодическим пробуждением с интервалом в 1 сек. от таймера. На каждой итерации цикла вызывается продпрограмма Send_Package() для формирования и отсылки пакета. По-окончании посылки Si4012 переводится в режим сна shutdown с низким токопотреблением, а МК – в режим сна deep sleep. Пока всё просто.

Насколько низко токопотребление передатчика в режиме сна? Согласно ДШ, оно должно быть около 10 нА, но мне никак не удавалось опуститься ниже 56 мкА. Оказалось, что вывод 8 у Si4012 оснащён внутренним подтягивающим резистором сопротивлением около 120К. При заземлении этого вывода для активизации передатчика ток через подтягивающий резистор и определяет минимальное потребление. Как я отмечал выше, выключать чип можно либо по шине SMBus, либо манипулируя напряжением на выводе 8 (в следующий раз я-бы так и сделал). В первом случае сэкономим на одной линии интерфейса с МК, но получим высокое потребление в режиме сна. В любом случае, в активном режиме к токопотреблению добавится ток через резистор подтяжки. Однако, при потреблении около 22 мА в режиме передачи с выходной мощностью +11 dBm эта добавка незначительна. Попутно отмечу, что при тактировании Si4012 от кварцевого кристалла, его генератор потребляет примерно на 1.5 мА больше, чем без него. Переводить чип в режим сна между посылками не обязательно. Если этого не делать, время выхода Si4012 на рабочий режим существенно сокращается, но за счет ощутимо большего токопотребления в режиме покоя (начиная от 620 мкА в зависимости от состояния).

Итак, перед посылкой пакета Si4012 следует пробудить. Для этого мы посылаем по шине SMBus 1 байт с адресом чипа 0хЕ0. В режиме глубокого сна интерфейс SMBus передатчика обесточен, и чип не подтверждает битом ACK прием этого байта. На пробуждение из сна чипу требуется около 14 мс (установлено экспериментально, для другого экземпляра чипа это время может быть несколько иным). Вместо ожидания можно повторять посылку байта адреса чипа 0хЕ0 до тех пор пока он не ответит сигналом ACK. На осциллограмме ниже чип не подтверждает первый байт при пробуждении, но спустя некоторое время (14 мс в моем случае) подтверждает следующий.

Первая посылка с битом NAK увеличенно выглядит так:

... а вторая – так:

Как видно по второй посылке, чип ответил сигналом ACK на свой адрес и начал тормозить линию SCL (clock stretching). Кстати, вторая посылка после ожидания 14 мс не обязательно должна быть пробуждающей – вместо неё в Si4012 можно загрузить и что-нибудь полезное.

Разобравшись с пробуждением передатчика из глубокого сна, нас ожидает следующая «засада»: оказывается, Si4012 в режиме сна (и только в нём) забывает все свои настройки на частоту и пр. Объясняется это тем, что в целях снижения токопотребления большинство блоков чипа обесточивается. Это относится и к его области RAM, хранящую настройки. Поэтому, первым делом при пробуждении мы должны заново задать все его параметры. Реализуется это подпрограммой Si4012_setup(), которая загружает в передатчик следующие последовательности байтов:

• Частота кристалла и его нагрузочная ёмкость (у меня менее 14 пФ): 0xE0, 0x11, 0x50, 0x00, 0x98, 0x96, 0x80, 0x01.
• Вид модуляции FSK и девиация ±12 кгц: 0xE0, 0x11, 0x20, 0x01, 0x05.
• Bit rate (1.2 kbaud): 0xE0, 0x11, 0x31, 0x00, 0x0C, 0x04.
• Рабочая частота + девиация (903.012 мгц): 0xE0, 0x06, 0x11, 0x40, 0x35, 0xD2, 0xDE, 0xA0.
• Выходная мощность (+11 dBm): 0xE0, 0x08, 0x11, 0x60, 0x01, 0x4D, 0x00, 0x00, 0x7D, 0xCC.
• Разрешeние прерывания по окончании передачи пакета: 0xE0, 0х83, 0х08.
• Установка высокой интенсивности LED: 0xE0, 0х11, 0х11, 0х03.

Завершение конфигурации передатчика сигнализируется включением LED: 0xE0, 0x13, 0x01. При подготовке к передаче из других режимов заново засылать в чип всю конфигурацию не требуется. Теперь мы, наконец-то, готовы собственно к передаче информации. Для этого сначала в RAM МК следует сформировать пакет как рассказано выше, и загрузить его в FIFO передатчика: 0xE0, 0х11, 0х66 и далее все байты пакета. Объём FIFO 256 байт, что более чем достаточно для наших целей. Перед загрузкой пакета в FIFO её следует очистить от возможного мусора: 0xE0, 0х65.

Итак, передаваемый пакет загружен в FIFO передатчика, но ещё не передан. Мы узнаем об окончании передачи падением уровня сигнала на выводе IRQ, который следует сначала вывести на высокий уровень, прочитав флаги прерывания передатчика. Это производится подачей команды чтения флагов 0хЕ0, 0х64, 0хЕ1, XX, YY. Последние 2 байта передаются Si4012 в MK, где XX – как всегда байт статуса, а YY – байт флагов прерывания. После прочтения этого байта все флаги в передатчике сбрасываются и уровень напряжения на выводе IRQ устанавливается в лог. 1. Вместо ожидания прерывания можно просто периодически считывать флаги прерывания до установки желаемого. Передача пакета начинается подачей соответствующей команды: 0хЕ0, 0х62, 0х00, 0х10, 0х00, 0х00, 0х00. Здесь 0х10 – длина пакета, а следующие 2 байта из нулей говорят передатчику оставаться в активном режиме, чтобы иметь возможность подать следующие команды. В нашем случае это команды гашения LED (0хЕ0, 0х13, 0х00), сброса флагов прерываний (0хЕ0, 0х64, 0хЕ1, XX, YY), и отправки чипа в сон (0х60, 0х01, 0х00). После отправки последней команды не следует читать из чипа статус – он уже спит и не ответит. Можно и автоматически отправить Si4012 в глубокий сон по окончании передачи пакета. Для этого передачу следует инициировать последовательностью 0хЕ0, 0х62, 0х00, 0х10, 0х01, 0х00, 0х00. Здесь третий с конца байт (0х01) определяет состояние чипа после отправки пакета. В этом случае и LED сам погаснет, т.к. во сне генератор тока LED отключен, а при пробуждении передатчик всё-равно забывает все свои настройки и заменяет их дефолтными, в которых драйвер LED деактивирован. При автоматической отправке в сон не следует разрешать прерывания, т.к. иначе получим лишнее потребление через подтягивающий резистор на выводе IRQ. Это упрощает коммуникацию и благоприятно сказывается на токопотреблении всей схемы. МК тоже можно усыпить, не дожидаясь завершения отправки пакета.

Я отметил здесь не весь функционал заложенный в Si4012. Без внимания остались состояния его внутреннего автомата FSM, возможность периодической проверки напряжения питания встроенным АЦП, автоматическое начало передачи при определенном уровне заполнения FIFO, упомянут лишь 1 из 8 флагов прерывания. Совсем не обсуждались режим модуляции OOK, безпакетная передача данных, и работа на рамочную антенну, и пр. Однако, мы получили представление о возможностях Si4012, остальное приложится в рабочем порядке.

А сейчас самое время со знанием дела дописать тестовую программу и опробовать её. Прилагаемые исходники и файл проекта предназначены для системы Keil µViSion, версия 5.11. После запуска программы LED на плате передатчика должен мигать с периодом 1 гц. На приёмном конце SmartRF Studio показывает периодическое наличие сигнала на установленной в приёмнике рабочей частоте. Приёмник и передатчик при этом находятся у меня в разных углах стола на расстоянии около 1.5 м друг от друга.

А вот так выглядит окно приёма пакетов в Studio. Показаны все 5 информационных байтов пакета. Напомню, что первый из них – это 8-битный номер пакета. Отрицательное число после вертикальной черты справа – это уровень RSSI в точке приёма. Все пакеты прошли тест на совпадение контрольной суммы, иначе в окне Studio была-бы указана ошибка CRC.

Спектр излучения передатчика при передаче пакетов оценивался с помощью анализатора SA430. Красная кривая в его окне соответствует излучению в данный момент сканирования, а зелёная показывает максимум излучения на соответствующей частоте за время наблюдения. В этом эксперименте анализатор регистрирует сигнал принятый на его Whip-антенну. К сожалению, анализатор работает только на частотах до 1 ггц, так что с ним я не могу оценить спектр гармоник излучаемого сигнала.

Ниже показан тот-же сигнал при большем разрешении. Удалось поймать момент передачи 0.

В заключении, пожалуй, о самом главном – тесте на дальность связи. Для этого приёмник с управляющим МК на макетке, показанной ниже (LCD в этом проекте не используется), был установлен на открытой веранде дома на высоте около 3 м над землей. Плата в правой части на макетке содержит стабилизатор на 3.3 В, разъем и выключатель питания.

Приём вёлся на модуль на основе СС1101, показанный выше. Приёмник был подключен к лаптопу через CC-debugger и его плата находилась на клавиатуре лаптопа. С лаптопом в руках я отошёл от дома на 372 м, согласно Google Maps. В точке приёма, отмеченной на карте красным маркером, уровень RSSI, показанный SmartRF Studio, находился в пределах -95... -100 dBm. Приём пакетов был уверенным (чувствительность приёмника при bit rate в 1.2 kbaud около -112 dBm). Прямой видимости между приёмником и передатчиком не было. Как видно из карты, они разделены несколькими домами и деревьями.

Напомню, что из-за дискретности синтезаторов частот в приёмнике и передатчике, девиация частот при модуляции FSK у них несколько отличалась (соответственно 11.9 и 12.29 кгц). Лучших результатов удалось добиться понизив девиацию до 5.15 и 5.25 кгц, соответственно, и, таким образом, уменьшив различие между ними. С такими установками и антеннами можно рассчитывать на дальность уверенной связи порядка 450-500 м.

В следующей части статьи будет рассказано о радиомодуле на основе более продвинутого (и сложного) трансмиттера Si4461 фирмы Silicon Labs.

Литература

1. Si4012 Antenna Interface and Matching Network Guide, AN727, Silicon Labs.
2. Comparing the I²C Bus to the SMBus. AN476, Maxim Integrated.
3. Si4012 Calculator Spreadsheet Usage, AN564, Silicon Labs.
4. Si4012 Programming Guide, AN746, Silicon Labs.
5. CRC Implementation, DN502, Texas Instruments.
6. С. Безруков: Радиоканал передачи данных на A110LR09A.


Файлы:
архив


Все вопросы в Форум.