15.5 Пример разработки 3: синтезатор частоты
==1065
В следующем примере разбирается типичная задача для микроконтроллера - обеспечение связи между передней панелью устройства ( или иным интерфейсом ) и некоторой схемой, которая управляется цифровым способом. На рис. 15.5 показан 2-канальный синтезатор частоты ( DDS ), собранный на ИМС AD9954 фирмы Analog Devices ( §7.1.8 ). Это одна из более чем 30 моделей аналогичного назначения. Микросхема создаёт синусоидальный сигнал с помощью таблицы значений амплитуды и цифро-аналогового преобразователя. Диапазон рабочих частот от 0 до 160 MHz с разрешением по частоте 32 разряда, что соответствует 0.1 Hz при частоте генератора 400 MHz . Есть и более быстрые синтезаторы, но эта модель выделяется высокой спектральной чистотой ( спасибо 14-разрядному ЦАПу ). На выходе получается синусоидальный сигнал с низким уровнем фазового шума и паразитных частотных компонент - “spurs” .
Рис. 15.5 Микроконтроллер - идеальное средство для организации интерфейса между исполнительным устройством с цифровым управлением ( здесь два синтезатора частоты и два аттенюатора ) и набором органов управления и отображения данных, составляющих интерфейс пользователя ( см. рис. 15.6 ). Последовательный порт µC позволяет добавить дистанционное управление
==1066
DDS кристалл ( ∼$25 ) тих и нем, пока не получит конфигурацию через 4-проводный SPI порт. Можно наладить связь между синтезатором и рабочей станцией, написать и запустить программу, которая настроит микросхему на нужную частоту, но интереснее собрать панель с ручными органами управления - энкодерами для подстройки частоты и амплитуды и дисплеем для отображения текущих значений ( рис. 15.6 ). Удобнее всего будет задействовать в этой задаче микроконтроллер, а дополнительное дистанционное управление можно организовать через USB или Ethernet.
Рис. 15.6 Синтезатор частоты на двух DDS по блок-схеме 15.5 с управляющими кнопками, энкодером и индикатором. Проект, схема, документация Джонатана Волфа (Jonathan Wolff), см. www.artofelectronics.com/synthesizer
На блок-схеме 15.5 микроконтроллер занимает центральное место, управляя через SPI порт синтезаторами и через похожий на SPI 2-проводный протокол аттенюаторами. Синтезаторам требуется чистый тактовый сигнал 400 MHz , который формирует внутренняя схема фазовой автоподстройки ( PLL ) из внешней опорной частоты 25 MHz ( внутренний множитель 16× ). От тех же 25 MHz можно запустить и микроконтроллер.
Со стороны пользователя стоят элементы для задания и подстройки параметров - кнопки и регулятор ( в качестве которого выступает «инкрементальный энкодер» ). Частота, амплитуда, фаза отображаются на вакуумном флуоресцентном дисплее ( VFD ) совместимом по разводке с ЖКИ аналогичного назначения. VFD дороже ЖКИ, но смотрится эффектнее. Дистанционное управление ведётся через последовательный порт контроллера, которому требуется только внешний преобразователь в уровни RS-232. Либо можно поставить внешнюю интерфейсную микросхему, типа FT232 для шины USB или XPort для Ethernet 23 .
Краткая аннотация на блок-схеме раскрывает некоторые детали взаимодействия компонентов. Скажем, энкодер создаёт пару прямоугольных сигналов, сдвинутых на 90° ( квадратурные сигналы ), по которым можно найти в каком направлении и на какой угол повернули ручку. Дешёвые энкодеры делают чисто механическими. Они требуют защиты от дребезга контактов. Оптический вариант, указанный на схеме, во-первых, служит гораздо дольше, а во-вторых, выдаёт наружу свободные от дребезга сигналы. Микропрограмма фиксирует состояние одного выхода в момент смены уровня на другом [* так определяется направление вращения ] .
==1067
Выбранные кнопки - механические и подвержены некоторому дребезгу контактов, защищаться от которого приходится программными методами, как в предыдущем примере. Каждая кнопка подключена по самой простой, хотя и довольно расточительной, схеме - к индивидуальной линии порта ввода-вывода ( и использует внутреннюю подтяжку ). В 100-ножечном корпусе выбранного контроллера есть 59 таких линий ( рис. 15.7 ), поэтому ужиматься не придётся. Более экономичная схема - матричное включение, в котором ключи ставятся на пересечении колонок и рядов. Для [* неполной, см. фото ] матрицы 3×4 потребуется на 4 линии меньше, чем при прямом подключении [* 11 - (3+4) ] . Рассмотрим разницу чуть позднее.
Рис. 15.7 Великолепный i8051 прошёл долгий путь от своего первого появления на публике в 1980 году, оброс дополнительными функциями и сократил длительность машинного цикла с 12 тактов у оригинальной разработки до 1 такта в моделях фирмы Silicon Labs. Иллюстрация взята из документации на C8051F060 ( интересно, что 328-страничный материал ничего не сообщает о назначении блока «SANITY CONTROL» )
15.5.1 Микропрограмма
Перечислим задачи микроконтроллера.
- Настроить порты ввода-вывода, UART, SPI, прерывания и сторожевой таймер.
- Загрузить в DDS и аттенюаторы последнюю сохранённую конфигурацию из постоянной памяти данных. Вывести те же параметры ( частоту, амплитуду, фазу ) в числовом виде на индикатор.
- Перейти к выполнению основного цикла: перезапустить сторожевой таймер, проверить энкодер на предмет вращения, кнопки на нажатие и флаг внешней команды ( устанавливается в обработчике прерывания UART ) на наличие, действовать соответственно.
- Независимо от основного цикла работает обработчик прерывания от UARTа. Он кладёт принятый символ в буфер, а если пришёл символ новой строки - признак конца команды - устанавливает флаг готовности внешней команды ( «serial_cmd» ).
Листинг 15.3 содержит программу на псевдокоде, а некоторые пояснения даются ниже.
Псевдокод 15.3 Синтезатор
Setup Ports: setports pushbuttons and rotary dial as input setports to attenuator as outputs setports to VFD as outputs or inputs set up UART: baudrate, 8N1, enable interrupts set up SPI port Automatic Reboot: enable brownout and watchdog timer (timeout=1s) Read Stored State: copy NV-stored state to active registers clear and reload VFD and DDS from active registers Main Loop kick the watchdog read switches and rotary dial if (any debounced switchbit has changed) if (freq, ampl, or phase), set new mode if (up/down arrow or rotary dial), increment/decrement that register refresh DDS or attenuator, and display if (serial_cmd bit) parse command, clear serial_cmd bit increment/decrement corresponding register refresh DDS or attenuator, and display repeat Main Loop Serial Interrupt Handler append character to line buffer if newline, set flagbit serial_cmd
15.5.1.A Некоторые замечания по схеме
- Блок-схема показывает достаточно простую цепь регулировки амплитуды. Цифровой аттенюатор обеспечивает диапазон 0...30 dB с шагом 0.5 dB . Можно получить гораздо лучшие цифры диапазона, величины шага и точности, если задействовать возможности микроконтроллера и его память данных. Синтезатор на фотографии имеет ещё 2 уровня регулировки амплитуды: опциональный фиксированный делитель на 30 dB , который расширяет диапазон до 60 dB , и тонкая подстройка в пределах ±6% через регулировку «опорного тока» в DDS ( с помощью цифрового потенциометра ), позволяющая получить разрешение 0.1 dB . Чтобы все эти манипуляции имели смысл, требуется ещё один шаг - калибровка прибора пользователем. Требуется занести значения уровня сигнала на нескольких частотах и пройтись по полному диапазону амплитуды, следуя указаниям микропрограммы. Данные калибровки хранятся в постоянной памяти и используются для линеаризации АЧХ.
- Выход DDS обновляется со скоростью внутреннего тактового сигнала ( здесь \(f_{REF}\)=400 MHz ), формируя ступенчатое приближение к синусоидальному сигналу. На выходе, кроме синтезируемой частоты с рабочим диапазоном 0...160 MHz , имеются внеполосные частотные компоненты с минимальной частотой \(f_{SPUR}=f_{REF}-f_{OUT}\) . Для их подавления используется фильтр нижних частот на выходе DDS. Здесь полезен многозвенный эллиптический LC фильтр с резким срезом на частоте \(f_c\)=180 MHz . ЦАП внутри DDS выдаёт дифференциальные токи , которые лучше всего чистить дифференциальным же фильтром. Пример такого ФНЧ приводится в справочных данных на AD9954.
==1068
- Если оба DDS запрограммированы на одну частоту, а тактовый сигнал общий, можно задать разность фаз между выходами. AD9954 позволяет задавать фазу с точностью 14 разрядов, т.е. с шагом 0.22° .
- В схеме используется прямое подключение кнопок: одна кнопка - одна линия ввода, что достаточно разумно, когда есть всего 11 кнопок, а у микроконтроллера 100 выводов. В качестве альтернативы можно использовать матричное включение ( рис. 15.8 ), в котором клавиши ставятся в точках пересечения рядов и колонок. На колонки подаются сканирующие сигналы, а ряды идут на входные линии портов с внутренними подтяжками. При опросе кнопок контроллер последовательно выдаёт НИЗКИЙ уровень на одну из колонок [* ВЫСОКИЙ на остальные ] и смотрит состояние рядов. Защита от дребезга - программная, как и в случае индивидуального подключения кнопок. Матрица удобна, если клавиш много, потому что требует для работы столько линий портов, сколько в сумме составляет число рядов и число колонок, а обслуживает при этом клавиши с общим числом, равным произведению указанных чисел. Иногда использовать матричное включение вынуждает внутренняя конфигурация клавиатуры. Скажем, именно так сделаны клавиатурные матрицы 4×4 . Предупреждение: матрица будет давать неправильное значение, если одновременно замкнуты три и более ключа. Разберитесь почему.
Рис. 15.8 Множество клавиш можно организовать в матрицу ( здесь 4×4 ). Такое включение сокращает число потребных линий ввода-вывода до \(N_{matrix}\)=r+c , где r - число рядов, а c - число колонок. При индивидуальном подключении кнопок понадобилось бы \(N_{indiv}\)=r×c линий
15.5.1.B Некоторые замечания по микропрограмме
==1069
- Микроконтроллер позволяет добавить в устройство дополнительные возможности, до которых трудно даже додуматься. Синтезатор на фотографии позволяет выбирать, как именно энкодер и клавиши управляют цифрами на экране. Стрелки «вправо-влево» выбирают цифру, требующую изменения, а «вверх-вниз» - изменяют цифру ( «+1/-1» ) с переносом или заёмом из соседних разрядов. Энкодер действует иначе. Меняя выбранную цифру, он одновременно обнуляет все цифры правее её. Это позволяет осуществлять быстрый набор числа, при перемещении от старшего разряда к младшему.
- Так же, как в случае компьютерной мыши, алгоритм обработки данных с энкодера учитывает скорость вращения, подстраивая величину шага и частоту смены показаний.
- Микропрограмма учитывает сохранённые результаты калибровки и корректирует параметры, полученные на предыдущих шагах. Микроконтроллер позволяет задавать режим качающейся частоты с несколькими вариантами её изменения: линейным, циклическим линейным, логарифмическим.
- Возможность обновления программы позволяет исправлять ошибки и добавлять новые возможности ( и новые ошибки ).
==1069
23 Дополнительный преобразователь интерфейсов для сети Ethernet выпускают компании Digi International, Ipsil, Connect One и WIZnet. <-