Цифровой запоминающий осциллограф
RW9UAO, Сергей, Кемерово, [ rw9uao{sobaka}yandex.ru ]
Март 2006 г.
В сети постоянно слышны вопли «а давайте за 100 баксов сделаем цифровой осциллограф». Попадаются и более конструктивные идеи, а также более-менее работающие проекты. Я тоже решил воплотить в железе давно обдумываемую идею.Принцип работы.
Наша задача быстро оцифровать аналоговый сигнал, потом его можно неторопливо обработать и вывести на экран. На ПЛИС (ATF1502AS) подается тактовая частота 80 МГц, из которой с помощью последовательно включенных делителей на 2 (74393) формируется последовательно увеличивающаяся шина адреса для заполнения быстрой SRAM (W24257AK-15). В ПЛИС предусмотрен мультиплексор (74151), служащий для выбора скорости оцифровки сигнала или внешнего тактирования от микроконтроллера. Частота оцифровки делится счетчиком (74390) на 10 и 100. Тактовая частота подается на АЦП (ads831) и, в инвертированном виде, на сигнал /CS памяти (запись осуществляется по спаду сигнала /CS). Сигнал /OE микросхемы памяти замкнут на землю. Перед началом работы микроконтроллер (AT90S8515) сбрасывает счетчик адреса в 0, устанавливает режим записи памяти (сигнал /WR) и подает сигнал разрешения прохождения информации через буферный регистр (74НС573) от АЦП. По достижении счетчика адреса 32 кбайт, т.е. заполнении памяти, процесс оцифровки сигнала заканчивается. Выход буферного регистра переводится в Z состояние, память переводится в режим чтения, счетчик адреса сбрасывается в 0, вход счетчика адреса через мультиплексор переводится на тактирование от микроконтроллера. Последовательно увеличивая счетчик адреса, микроконтроллер передает данные из внешней памяти в компутер через UART на скорости 115 кбод. Попутно производится синхронизация по схеме pre-triggering. Компутер просто отрисовывает принятый буфер, добавлены функция масштабирования и FFT.
Когда решался вопрос о способе вывода картинки, было 2 варианта – графический ЖК модуль и компутер. ЖКИ 128х64 точки - маловат, 320х240 – дороговат. Компутер и так стоит на столе.
Способ передачи данных в компутер. Можно использовать LPT порт (не работает под w2k, wXP). Ethernet (не умею писать для виндов, да и скорость всего порядка 10 кбайт/сек). PCI (ну-ну), ISA (в современных компах нет). USB – специализированный контроллер отпадает (не хочется переходить на другой камень). Параллельный FTDI – отпал по причине непонятных мне драйверов и отсутствия самого камня в наличии. USB-RS232 на скоростях около 1,5 мбит – говорят что неустойчив, будем использовать обычный СОМ порт. На будущее планируется использование USB-RS232 от Prolink, тем более что он уже есть в наличии.
Среды разработки. Пользовательский интерфейс - Microsoft Visual C++ .NET. МК – ICCAVR + AVRStudio + JTAG + ISP. ПЛИС – MAX+plus II BASELINE + Atmel POF2JED + Atmel ISP CPLD programmer + Altera ByteBlaster. Плата АЦП нарисована в SprintLayout v4.
Для работы в качестве автономного спектр анализатора (avr\main2f.c) используется графический индикатор 64х64. Спектр анализатор реализован на честном дискретном преобразовании Фурье(DFT). Предел работы (полоса пропускания) – половина частоты дискретизации. В частном случае 48 МГц /100 /2 = 240 кГц. Что примерно соответствует ширине любительского диапазона 80 м. Полученная после смесителя первая промежуточная частота (1ПЧ) переносится дополнительным гетеродином вниз. Полученный спектр пропускается через ФНЧ и подается на АЦП. В трансивере применено преобразование вверх, ширина 1ПЧ – 250 кГц. ATmega128 на частоте 16 МГц обеспечивает примерно 2-3 fps, что вполне приемлемо. Следует отметить, что мощность сигнала «размазывается» по спектру. По-моему фигню сказал. Объясняю: имеем входной сигнал в 1 кГц, получаем «палку» высотой 100 точек. Теперь подадим входной сигнал той же амплитуды, но содержащий в себе несколько частот, например 1, 2, 3, 4, 5, 6 ,7 кГц. В результате получаем 7 «палок», но амплитудой в 20 точек. Уж не знаю с чем это связано 8)
Механизм pre-triggering (post-triggering). После нахождения адреса точки синхронизации можно от текущего адреса отнять (прибавить) 200 (середина экрана) или любое другое число, на которое нужно сдвинуть картинку (на экран выводится 400 точек из памяти) и получится, что точка синхронизации попадает в нужную нам точку экрана. Причем сама точка синхронизации может не быть в пределах видимого экрана. Таким образом, можно пролистать все 32 кбайт памяти и узнать, что же происходит до и после точки синхронизации.
Детали и конструкция.
Вся конструкция представляет собой несколько монтажных плат соединенных МГТФ. Микросхема памяти конструктивно расположена на монтажке с ПЛИС. Микросхема буфера с одной стороны впаяна в плату АЦП, с другой стороны в монтажку с МК. Используя микросхему серии 74НС можно запросто работать на 100 МГц, при использовании 74AS граничная частота передачи данных повышается до 300 МГц.
При желании, вместо ПЛИС можно использовать обычную логику, высокочастотную естественно.
Аналоговая входная часть с полосой пропускания 10 МГц по уровню -3 дб от какого-то старого советского осциллографа на транзисторах.
В качестве опорника очень удобно использовать ФАПЧ синтезатор на 40-80 МГц. Или твердотельные кварцевые генераторы. Например, я использовал ADF4360-8 с буферным усилителем и кварцевые генераторы на 74F04. В принципе пойдет даже трехточка.
Глюки.
Самый интересный глюк в даташите на АЦП. На картинке изображен буфер с Z состоянием. На самом деле его нет. Пришлось использовать дополнительную микросхему.
Т.к. я использовал память со скоростью работы 15 ns, у которой теоретический предел работы 66,6 МГц, то на тактовой частоте 80 МГц полезли ошибки. Пришлось снизить тактовую до паспортных 60 МГц.
Чтобы видеть правдоподобную картину необходимо, чтобы частота дискретизации была не в 2 раза больше частоты сигнала (согласно теореме Котельникова), а в 10. Иначе будет иметь место буржуйское слово aliasing. Так вот, реально можно работать с частотами не до 60/10 = 6 МГц, а примерно до 1,5 МГц. Картинка становится некрасивой, сжатой. При введении растяжки график покрывается зубчиками, сглаживание делать было лень. На скриншоте Pис.1 вверху осциллограмма, внизу – DFT.
Puc.1Частота «палки» - 1200 кГц. Частота дискретизации 4800 кГц. На скриншоте Pис.2 показан синусоидальный сигнал с частотой - 65 кГц. Частота дискретизации 4800 кГц. Второй вариант лучше выглядит, но требует большей частоты дискретизации.
Puc.2Не доведенная до ума синхронизация. Делал 2 варианта – аппаратный (компаратор, разрешающий запуск тактового генератора). И программный (следим за потоком данных и по достижении условия начинаем передавать в компутер). Схема простого варианта приведена на рисунке 3.
Puc.3Отличия схемы с аппаратным триггером на рисунке 4.
Puc.4На рисунке 5 приведена распиновка ПЛИС.
Puc.5Глюки наблюдаются при использовании любого из этих двух вариантов. Останавливаться на синхронизации не буду, т.к. это является know-how мат. аппарата и сильно отличается от простого captured_sample == trigger_value. Вкратце, если текущий отсчет равен значению срабатывания синхронизатора, то это не обязательно положительная полуволна синусоиды. Необходимо отслеживать нарастание ли это сигнала или это его спад. Для Фурье преобразования, кстати, синхронизация не обязательна.
Стробоскопические методы накопления сигнала не рассматриваем по причине сложности пикового детектора и синхронизатора. Тогда можно было бы смотреть сигналы в сотни мегагерц, но только имеющие периодическую структуру. Посмотреть наличие сигнала можно и на FFT. В данном случае до 60/2=30 МГц. Если частота плавно повышается, то «палка» едет до верхней границы частоты, а затем едет вниз по частоте.
Простота и удобство использования.
Авторы подобных конструкций видимо шутят. Я не стал вводить кнопки/ручки/другие органы управления для экономии времени создания макета. Теперь и вовсе не вижу смысла в доделке железа/софта. Да, синусоиду в пару килогерц посмотреть оно может, запомнить кусочек сигнала и прокрутить его (например, UART пакет байт в 50). Кстати памяти хватит на 15 ns х 32768 ~ 500 микросекунд, или 5 миллисекунд, или на 50 миллисекунд. Очень красиво получаются палки в FFT (для чего собственно все и заморачивалось). А так, проще купить подержанный советский аналоговый осциллограф с полосой в 10 МГц.
Цена вопроса.
Полгода на обдумывание идеи, пара месяцев не очень напряженной работы, неделя плотных занятий и два дня на разочарование. По железкам: АЦП – бесплатно (free samples program). ПЛИС – бесплатно (старая монтажка). Микроконтроллер – бесплатно (старая монтажка). Изготовление печатной платы АЦП – бакса 2 (обрезки стеклотекстолита, обложка журнала, немножко тонера). Входная аналоговая часть – 2 бакса (пиво за аренду). Щуп – бесплатно (от рабочего осциллографа). Затраты на Интернет, припой, электричество и написание софта будем считать нулевыми.
Исходники и схемы.
Описанного выше вполне достаточно (по крайней мере, я так думаю) чтобы при желании разобраться или повторить конструкцию. Скомпилированных бинарников, прошивок, печатных плат, собранных готовых изделий и т.д. автор высылать не собирается. В конце концов, посмотреть в исходнике для МК какой выход припаять к какому входу ПЛИС не так и сложно. Эта конструкция хоть и выходного дня (хотя, пожалуй, целого отпуска, а не пары дней), но не для едва владеющего паяльником человека. На вопросы типа «не прошивается» или «не компилируется» я так же отвечать не намерен. Я целенаправленно не открываю некоторые аспекты конструкции/программы, я не благотворительный фонд и не всенародный учитель чайников. Возможно, слишком грубо, но я действительно так думаю.
Процедура DFT заимствована у http://elm-chan.org (C)ChaN, 2005 и адаптирована под ICCAVR. Пример ее использования в файле (avr\osc2.c). В файле (avr\lcd.c) лежат процедуры необходимые для работы с ЖКИ модулем 128(64)х64 на контроллере KS0108B (самсунг).
Документация и исходники - dig_osc.zip (150 кб)