Двухканальный USB осциллограф на STM32 — Miniscope v2c

Ниже представлен проект недорого USB осциллографа с применением STM32 микроконтроллера. Особенности устройства:
— использование очень дешевых STM32F103 микроконтроллеров в LQFP48 корпусе.
— односторонняя печатная плата, удобная для изготовления в домашних условиях.  
— выборка 2x461kSps (2x300kSps в старых версиях), 8 бит, передача данных по USB в реальном времени.
— прошивка по UART.
— диапазон рабочих напряжений 0 — 6.6 Вольт.  Нестандартное входное сопротивление 20 кОм (к несчастью, большее значение вызывает помехи на АЦП. Возможно, это можно исправить использованием ОУ. Обратите внимание: сопротивление может быть увеличено при использовании новой прошивки, которая использует отдельный АЦП для каждого канала).

Сигнал 300 мВ снятый при помощи miniscope v4:

Осциллограммы в miniscope v4

Общая стоимость компонентов не превысила 10$.

Принципиальная схема USB-осциллографа:

Принципиальная схема USB-осциллографа

Печатная плата — односторонняя, размер 66мм x 36мм.

Печатная плата

Печатная плата

Среда разработки

Для разработки miniscope v2 необходимо было выбрать среду разработки для STM микроконтроллеров. В этом файле лежат примеры проекта для IAR, Keil, RIDE, HiTop и TrueSTUDIO. К сожалению, не один из них мне не подошел. RIDE и HiTop требуют покупки лицензии через 7 дней. Пробные версии IAR и Keil имеют ограничение на размер кода и забирают очень много дискового пространства. То же самое с TrueSTUDIO.

В результате я выбрал CooCox, дистрибутив которого весит 115 МБ и около ~ 800 МБ после установки и распространяется бесплатно.

Прошивка микроконтроллера

На плате нет JTAG/SWD разъема, так как прошивка должна быть загружена по UART. Чтобы войти в режим загрузки, нажмите и удерживайте кнопку BOOT при нажатии кнопки RESET. Программа STM «Flash Loader Demo» без проблем работает с USB-UART переходником. Нормальное напряжение на выводах микроконтроллера 5В, поэтому можно использовать 5 или 3.3В RS232-UART/USB-UART переходник.

Кнопка RESET может быть удалена — микроконтроллер переходит в режим загрузки при нажатой кнопке BOOT если USB подключен.

Так как USB подключено без 1.5 кОм подтягивающих резисторов, его необходимо заново подключить после прошивки.  

Проект для тестирования микроконтроллера и зуммер: stm32scopeTest.7z

Советы по передаче данных по USB

Используйте CDC в качестве шаблона. Есть две конечных точки BULK. Для повышения скорости CDC потребуются небольшие изменения.
1. Уменьшите значение VCOMPORT_IN_FRAME_INTERVAL. Я не уверен, что значение = 1 подходит при двунаправленной передаче, поэтому я поставил значение = 2.
2. Увеличение значения USART_RX_DATA_SIZE. Я использовал 8192 байт (2 х 4 Кб), но я думаю, что существенной разницы при использовании  4096 байт.
3. Изменение Handle_USBAsynchXfer, т.к. он не будет передавать данные, если USART_Rx_Buffer будет полный. Таким образом, после каждого номера SOF будет отправлен максимальный по номеру байт.

Убедитесь, что на ПК приложение постоянно готово к приему данных. Убедитесь, что приоритет чтения для него выше,  чем у других приложений. Я использовал libusb, поэтому я использовал сочетания usb_submit_async / usb_reap_async для задания очереди запросов чтения.

Я не интересовался высокой скорость передачи данных с ПК, поэтому у меня нет советов по этому поводу. Miniscope v2c оправляет данные на ПК с максимально возможной скоростью. Данные отправляемые с ПК незначительны (ID запроса, изменение аналогового усиления).

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Микроконтроллер STM32F10XCXT6 1 STM32F103?
IC1 Линейный регулятор LF33 1
D1-D4 Диод Шоттки BAT42 4
C1 Электролитический конденсатор 10 мкФ 1
C2 Электролитический конденсатор 100 мкФ 1
C3, C4, C6-C9, C13 Конденсатор 100 нФ 7
C5 Электролитический конденсатор 22 мкФ 1
C10, C12 Конденсатор 2
C11, C14 Конденсатор 47 пФ 2
C15, C16 Конденсатор 22 пФ 2
R1-R3, R7, R10 Резистор 10 кОм 5
R4, R8 Резистор 27 Ом 2
R5, R6 Резистор 100 Ом 2
R9 Резистор 1.5 кОм 1
Q1 Кварц 8 МГц 1
L1 Дроссель BL01RN1A 1
SG1 Пьезоизлучатель F/TMB 1
S1, S2 Кнопка Замыкающая 2
X1 Разъём USB 1
JP2 Разъём PLS-4 1 Входы
JP3 Разъём PLS-3 1 UART