Было в наличии две платы STM32F407 Discovery, а также микросхемы AD8066 и TDA8708. Вот и решил куда-нибудь их пристроить. Это чисто мое хобби, поэтому программы для STM32F407 и конкретно этот код для осциллографа я писал где-то полгода, может чуть больше. Местами там, возможно, получился «говнокод», потому что со временем уже сам забывал, что и где находится… Может быть, когда-нибудь поправлю код. Немного помогал и искусственный интеллект.
При сборке можно обойтись без TDA8708, но тогда не будет режима T10. Можно даже не использовать операционный усилитель AD8066, а подавать сигнал напрямую на вход PA1 платы Discovery. В таком режиме на максимальной развертке («из коробки») можно стабильно видеть сигнал частотой до 300 кГц с амплитудой от 0 В до 3,3 В (либо более высокие напряжения, если подключить через делитель).
Программа написана на C++ с использованием Code::Blocks IDE и библиотеки wxWidgets под операционную систему Linux. Для визуализации осциллограмм использовался OpenGL. Думаю, проект без проблем соберется и скомпилируется под Windows, а также должен подойти для Raspberry Pi.
Программа осциллографа поддерживает все основные функции:
- Синхронизация сигнала: доступен ждущий режим (Trigger) с возможностью одиночного захвата и остановки осциллограммы (Single shot). Предусмотрены настройки уровня синхронизации, гистерезиса и смещения.
- Измерение параметров: автоматическое определение частоты и амплитуды входящего сигнала.
- Курсорные измерения мышью: выделение области по горизонтали (левой кнопкой мыши) показывает время в мкс, мс или секундах; выделение по вертикали (правой кнопкой мыши) измеряет напряжение выделенного участка.
- Масштабирование и навигация: осциллограмму можно «поставить на паузу», сохранить и, или увеличить по осям X и Y. Увеличенный сигнал можно двигать в любом направлении (скроллинг по X/Y). Также поддерживается развертывание окна программы на весь экран.
- Смещение нуля: программное смещение нуля служит только для удобства сдвига графика на экране и не меняет реальные значения. Настоящий (аппаратный) ноль выставляется потенциометром. В схеме можно задействовать и ЦАП (DAC), но потенциометра вполне достаточно.
- Анализ спектра: в программу встроен спектроанализатор (БПФ/FFT).
- Временная развёртка: диапазон составляет от 247 секунд на весь экран (в режиме T0) до 52 мкс на весь экран (в режиме T10).
Буфер аналогового сигнала рассчитан на 4092 значения, что даёт 2046 12-битных точек аналогового сигнала на осциллограмме. Linux работает нестабильно, если использовать ровно 4096 значений. Кроме того, для работы контроллера в режиме DCMI требуется выравнивание данных по границе 4 слов (word align), поэтому размер буфера был скорректирован: 4096 − 4 = 4092 значения.
Входной делитель. Я использовал галетный переключатель, работает вполне нормально. В моём случае я убрал конденсатор 1C2, для 1C5 взял 330 пФ, для 1C8 — 2700 пФ, а для 1C9 — 3300 пФ. Однако номиналы в любом случае придётся подбирать индивидуально под конкретную плату. Настройка (компенсация делителя) производилась по прямоугольному сигналу в диапазоне частот от 1 Гц до 4 МГц. Рекомендую для начала спаять устройство строго по этой схеме, а уже затем подбирать конденсаторы, так как в вашем случае из-за паразитной емкости монтажа номиналы будут немного отличаться. (Кстати, автора этой исходной схемы я не знаю):
В качестве прототипа был взят проект, по которому я изначально и собирал этот осциллограф. Тогда я изрядно помучился с подбором конденсаторов на галетном переключателе, поэтому в этот раз решил попробовать схему, указанную выше. Тот первый осциллограф сейчас вполне нормально работает у меня на даче, я запустил его под Linux OS, но он работает и под Windows.
(Автор оригинального прототипа: www.stanson.ch/index.php?page=proj&proj=USB-oscope)
Схема входа аналогового сигнала
Диоды D1 — обычные высокочастотные диоды с напряжением открытия 0,5–0,7 В и минимально возможной емкостью. У меня была целая горсть таких диодов без маркировки, поэтому я поставил их.
Нюансы выбора операционного усилителя
- Если используется AD8066: резистор R6 нужно взять номиналом 3,3 кОм, а между 6-й и 7-й ножками микросхемы запаять конденсатор емкостью 1,5 пФ.
- Микросхема AD823 подойдет в том случае, если вы не планируете использовать внешний АЦП TDA8708.
- Также я тестировал LM6172 и AD812. Микросхема LM6172 мне понравилась, но при двухполярном питании ±5 В на выходе не хватает амплитуды. Если вы делаете вариант без внешнего АЦП TDA8708 (используя только встроенный АЦП микроконтроллера), то лучше всего подойдет LM6172 (или LM6271), но тогда нужно поднять напряжение питания ОУ до ±7,5 В.
Подключение и защита выходов
- Тот самый выход «Out» нужно подать на вход Discovery PA1 через делитель напряжения примерно в 3,3/5 раза (например, используя резисторы ~330 / 510 Ом). При этом вход PA1 необходимо обязательно защитить от отрицательного напряжения: для этого подключается диод Шоттки (например, BAT42), где катод идет к PA1, а анод — на GND.
- Этот же выход «Out» через резистор 300 Ом подключается к 20-й ножке TDA8708. Вход АЦП (20-ю ножку) также нужно защитить от отрицательного напряжения с помощью диода Шоттки (например, BAT42): катод подключается к 20-й ножке TDA8708, а анод — к GND.
Организация питания и операционные усилители
Микросхему ICL7660 можно использовать только в связке с AD823 (или другим экономичным ОУ) и при условии, что вы не используете внешний АЦП TDA8708. Для более мощных операционных усилителей, таких как LM6172, AD812 или AD8066, у ICL7660 просто не хватит выходного тока.
В своём проекте для формирования двухполярного питания я применил два изолированных DC-DC преобразователя NME0505D (на ток до 200 мА), которые выдают линии +5 В (Analog +5V) и -5 В. Полученную с преобразователей аналоговую землю (Analog GND) соединил с реальной землей платы Discovery (GND) через резистор номиналом 10 Ом.
Тактирование и разгон АЦП
В качестве источника тактового сигнала используется 5-вольтовый кварцевый генератор KXO-01-1 на 40.0000 МГц, сигнал с которого подается на 5-ю ножку TDA8708. По технической документации (datasheet) максимальная частота для TDA8708 составляет 32 МГц, однако в реальности микросхема без каких-либо проблем работает на частоте 40 Мгц.
Подавление шумов в цепях питания
В моей схеме питание TDA8708 организовано немного иначе, чем в прототипе, ради снижения уровня шумов:
- Кварцевый генератор и цифровая часть TDA8708 запитаны напрямую от +5 В шины USB.
- Аналоговая часть TDA8708 питается от изолированных преобразователей — Analog +5V и Analog GND. Это позволило существенно уменьшить цифровые наводки на графике осциллограммы.
Идею подключить АЦП через аппаратный интерфейс цифровой камеры DCMI (Digital Camera Interface) микроконтроллера STM32F407 я почерпнул из статьи на Хабре https://habr.com/ru/articles/482506/. Сам код оттуда не копировал — взял только саму оригинальную идею и общий принцип реализации.
Поскольку это была совершенно новая для меня схема, требовавшая постоянных тестов и отладки, весь осциллограф я собрал на макетной плате (на «монтажке»). Само собой, с точки зрения высокочастотной схемотехники получилось неидеально и не очень красиво: расстояния между компонентами большие, везде оставлял запас платы, так как изначально не знал, что и как буду использовать, плохо длинные линий данных D0–D7 и clock. И выводы элементов вокруг операционного усилителя AD8066 получились слишком длинными. Тем не менее, устройство успешно работает. Выглядит, может, и не эстетично, но пересобирать заново готовую рабочую схему уже не буду, припаяю нормально, красиво подбираемые резисторы и конденсаторы и всякие перемычки, отмою от флюса и покрою лаком.
Автор проекта: Арнольд Черняков













