Двухканальный usb осциллограф на stm32 — miniscope v2c

Miniscope v2c

Very cheap low-speed dual channel PC/USB oscilloscope with STM32 (STM32F103C8T6) microcontroller.

  • follows miniscope v2b idea, using miniscope v4 application as PC GUI,
  • using very cheap STM32F103 MCU in LQFP48 package ($4),
  • single-sided PCB suitable for homemade prototyping using toner transfer method,
  • sampling: 2×461 kSps (2×300 kSps with older firmware), 8 bit, real-time data streaming to PC (USB full-speed),
  • UART bootloader (less convenient that USB SAM-BA from Atmel),
  • single sensitivity range, 0. 6.6V and non-standard 20 kOhm input impedance (unfortunately with larger resistances channel crosstalk and ADC input current leak effects are visible — some R2R opamp would be good addition; note: resistance can be increased when using newer firmware that is using independent ADCs for channel A and channel B).

Some low amplitude signals (300 mV p-p) recorded with miniscope v4:

Components should cost less than $10 total (with homemade PCB).

Single-sided Eagle PCB, 66mm x 36mm


Goldpin header and BOOT pushbutton are used to load firmware via UART.

STM32F103C8T6: LQFP48 package

CDC class example — same path as with miniscope v2 — from STM was selected as a base project to speed-up USB device related programming. This example has project files for IAR, Keil, RIDE, HiTOP and TrueSTUDIO, so using one of these IDEs would be an advantage. Unfortunately I haven’t found any of these appropriate. RIDE and HiTOP evaluation versions have restrictive licenses (valid support contract requirement after 7 days and no commercial usage respectively). IAR or Keil evaluation/lite version licenses have restrictions on output size and it wouldn’t be a problem in a small project, but they have pretty big disk space requirements (

3 GB as I recall) and their installers don’t allow much customization. Same goes with TrueSTUDIO.

As a result I’ve chosen CooCox toolchain — 115 MB download for IDE + gcc,

800 MB disk space usage after installation, no license restrictions.

Firmware loading

PCB has no JTAG/SWD connector so firmware has to be uploaded with UART bootloader. To enter bootloader mode press and hold BOOT pushbutton while pressing RESET pushbutton. PC loader (STM «Flash Loader Demo») seems to work with no problems with USB-UART converter. MCU bootloader pins are 5V tolerant, so either 3.3V or 5V RS232-UART/USB-UART converter can be used.

RESET pushbutton can be removed — microcontroller will go into bootloader mode also if it would be powered on (USB would be connected) when BOOT is held down.

Since there is no USB 1k5 pull-up control USB need to be re-plugged to force re-enumeration after reset of new firmware loading.

Some basic project to test MCU and buzzer: stm32scopeTest.7z.

Tips on USB transfer speed

Use CDC example as a template. There are two BULK endpoints. For better transfer speed CDC example would require small modifications.

  1. Change VCOMPORT_IN_FRAME_INTERVAL to lower value. I’m not sure if value = 1 is suitable when transfer needs to be bidirectional, so I’ve used value = 2. It won’t make much difference though.
  2. Increase USART_RX_DATA_SIZE. I’ve used 8192 bytes (2 x 4 kB), but I think that there would be no speed difference with values above 4096 B (maximum number of data would be transmitted in every or almost every frame).
  3. Modify Handle_USBAsynchXfer so it wouldn’t transmit data unless half of the USART_Rx_Buffer would be full. Thus after each SOF maximum number of bytes would be sent. If there is a chance that buffer would be filled with low speed or not filled at all for some time then some kind of timeout would be needed here that would cause transmitting whatever is in buffer already — you may know this problem if you’ve used USB to UART converters before.

On a PC side make sure that application is constantly ready to accept new data. Make sure that thread that is reading data is working with higher priority than others. I’ve used libusb, so I’ve used combination of usb_submit_async/usb_reap_async to enqueue multiple read requests, each time requesting reading of 4096 B. I guess with WinUSB that could be made with overlapped I/O. Miniscope v2b/v2c dll interface library passes than data through FIFO to GUI application.

I wasn’t interested in high PC to device speed, so I haven’t any tips on reverse direction. Miniscope v2c (very similar to v2b) is streaming data to PC at maximum speed all the time. Transfers in reverse direction are insignificant (ID request, changing analog gain or analog coupling).

Firmware and miniscope v4 dll interface

  • 2012.04.16 Initial release, NOT RECOMMENDED:
    stm32scope_20120416.7z
    miniscope_v2c_dll_20120416.7z
  • 2012.04.21 Lots of fixes to both dll and firmware:
    stm32scope_20120421.7z
    miniscope_v2c_dll_20120421.7z
    • FIXED: framing error in dll code causing trace discontinuity when recording and displaying multiple continuous data buffers,
    • few fixes and improvements related to USB TX queue (i.e. more optimal memory allocation between ADC buffer and USB TX FIFO) in firmware and RX queue in dll,
    • extended buffer sizes list to 128 kB.
  • 2012.04.28 miniscope_v2c_dll_20120428.7z
    • FIXED: if trigger was in continuous mode but stopped (Run/Stop) single manual trigger caused working as if Run was pressed.
  • 2012.04.29 Putting available hardware to better use — using both ADCs in simultaneous mode allowed to increase sampling speed from 2×300 to 2×461 kSps and increasing S/H time to 13.5 cycles at the same time. Although ADCs can still work faster increasing speed further would not allow to keep real-time USB full-speed streaming to PC which is essential feature making it possible to use large sample buffer sizes and record signal continuously.
    stm32scope_20120429.7z
    miniscope_v2c_dll_20120429.7z
  • 2012.06.07 FIXED: no buzzer sound at startup (delay loops removed at o3 optimization).
    stm32scope_20120607.7z
  • 2012.10.06 Thanks to Openmoko assigning USB PIDs to open source projects miniscope v2c has got it’s own unique VID = 0x1d50, PID = 0x604f pair.
    stm32scope_20121006.7z
    miniscope_v2c_dll_20121006.7z
  • 2012.12.16 Added device library built with Code::Blocks/MinGW, stm32scope_cb.7z as a reference project. Tested only for a moment, previous (Turbo C++ project) library version should be preferred in general.
    2020.07.15 Updated Code::Blocks/MinGW project source: stm32scope_cb_20200714.7z. As newest Code::Blocks 20 comes with 64-bit MinGW and is missing 32-bit Windows libraries — use Code::Blocks 16.
  • 2013.09.16 Updated device library, miniscope_v2c_dll_20130916.7z:
    • FIXED: occasional data loss (with log: «RX FIFO overflow») observed when thread was suspended by OS for larger times than requested; strangely this was behavior was observed with no consistency, with light system load and when debugger/IDE was not running,
    • extended samples buffer sizes list up to 1MS (x 2 channels).
  • 2017.01.21 Updated device library, miniscope_v2c_dll_20170121.zip, DLL is now partially configurable without recompiling as sensitivity ranges can be changed using JSON file created in dll directory (miniscope_v2c_capabilities.cfg). This is default file content, that defines single gain range (25.78 mV/bit or 6.6V/256 per bit): File below adds two additional sensitivity ranges (50 mV/bit and 100 mV/bit — without firmware support it relies only on some manual switch), accepts inverted signal with «0» in the middle (inverting amplifier that shifts voltage so oscilloscope can measure positive and negative voltages), using value = 127 — value formula for samples received from device. There is also AC coupling added (just for reference, not making much sense without support in firmware actually). Using JSON editor is recommended as invalid JSON content would be overwritten by DLL.
    Note: floating point numbers with lots of not-so-significant digits are actually effect of reading and writing back by JSON library in DLL with lack of proper rounding.
    Note 2: in this setup «bitsPerSample» reported to GUI is changed to 8 bits, that is real number of ADC bits used. 9 bits in default setup just give better default zoom when oscilloscope is able to measure only positive voltages. This also sets correct range for trigger level.
    In this version slope trigger was also changed to simpler one, with less filtering. While previous version might be more stable in time it was also prone to not firing with some signals, in particular slowly changing.
  • 2019.08.10 Firmware as EmBitz project: stm32scope_embitz_20190810.zip
  • 2019.08.11 Firmware + dll set with base sampling frequency lowered to 292kSps (this seems to eliminate FIFO/USB overflow problems resulting in lack of data continuity): stm32scope_embitz_20190811.zip, miniscope_v2c_dll_20190811.zip.
Читайте также  Как достать нужную информацию?

Although windows driver (libusb-win32) is included in dll archive using Zadig is actually easier and it is only sensible option for 64-bit Win8/Win10:

Important: make sure libusb-win32 is selected as driver in Zadig (WinUSB might be default).

Follow-ups

PCB version with LM1117 3.3V regulator and few layout changes made with Pulsonix EDA software by Quang Duy: http://mritx.blogspot.com/2014/07/low-speed-dual-channel-pcusb.html.

Alternative hardware

Apparently ebay (and most likely any other shopping site of your choice) is flooded with very cheap ($5 including shipping) Maple-like minimalistic STM32F103C8T6 boards. While I haven’t tested them they seem like good choice to run this firmware. Don’t forget that USB-UART (or RS232-UART if you have RS232 in your PC) converter is required to load program to microcontroller.

STM32F103C8T6 board

Sitemap

«Cookie monsters»: 5759184 Parse time: 0.181 s

Простой USB осциллограф — Miniscope v2c

Дата публикации: 04 октября 2013 .

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

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

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

Принципиальная схема 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 кОм подтягивающих резисторов, его необходимо заново подключить после прошивки.

Советы по передаче данных по 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 запроса, изменение аналогового усиления).

Небольшой обзор USB осциллографа Hantek 6022BE. Сравненение с самодельным осциллографом на базе STM32.

  • Цена: $53.24
  • Перейти в магазин

Всем привет. Сегодня я хочу рассказать о достаточно доступном USB осциллографе Hantek 6022BE. Данный прибор, будет очень полезен (зачастую незаменим) всем тем кто занимается радиолюбительством и до сих пор не имеет осциллографа.
Рассказ буду вести с точки точки зрения любителя, особо не работавшего с осциллографами ранее. Поехали!

Сей аппарат был куплен, если верить названию, в официальном магазине Hantek на aliexpress, с выбором локальной доставки со склада в России. Ценник у продавца на момент покупки был весьма гуманный и остался таким же по сей день.
Доставка заняла около недели (Нижегородская область). Товар вручил курьер.
Самое интересное и смешное, то что аппарат с доставкой из Китая стоил даже чуть дороже (почти на 100р) чем с локальной, более быстрой доставкой. Сейчас всё точно так же, не особо понятно почему, ведь локальная доставка обычно дороже…

Внешний вид прибора:

Сори за медленный автофокус.

Один из щупов (второй точно такой же):

Мануал от щупа:

Питание:

Красный коннектор вероятно сделан для устройств выдающих очень маленький ток по USB (например каких то старых ноутбуков). На моей материнке, которая выдаёт строго по стандарту USB 2.0 не более 500мА тока, всё нормально заводится при подключении лишь чёрного коннектора (он же и интерфейсный).

Основные характеристики:

Каналы: 2
Полоса пропускания: 20 МГц (разрядность 8 бит).
Частота дискретизации: 48 Ms/s.
Размер буфера — 1Ms.
Точность ±3 %.
Макс.вход ±5В. (Пиковая защита входа 35В).
Интерфейс: USB 2.0 (питание от USB).
Щуп: PP-80 *2
Габариты: 200мм*100мм*35мм
Вес: 0.3 кг.

Установка и инструкция по эксплуатации.

Я тестировал прибор под Windows 7. Судя по отзывам, с дровами под Windows 10 могут возникнуть проблемы (не проверял).
В комплекте с прибором идёт небольшой диск, но так как привод у меня есть лишь на одном из старых компов, а переставлять его лень, скачал всё необходимое по ссылке на майкросовтовскую файлхранилку: onedrive.live.com/?cid=6c60a056648d9011&id=6C60A056648D9011!107

Как видим, всё необходимое есть. Драйвер встаёт без проблем. На сайте hantek.ru можно скачать русскоязычную инструкцию: www.hantek.ru/products/mans/HT6022BL_RUS.pdf

Подключение и калибровка прибора.

Запускаем утилиту.

После установки драйвера и ПО, согласно инструкции, необходимо произвести калибровку прибора по встроенному калибровочному генератору.
Отображение сигнала до калибровки:

Берём подстроечную крутилку и подкручиваем регулятор в щупе. Делитель щупа в положении X10 (при всем моих измерениях показанных в данном обзоре делитель x10).

Добиваемся примерно такой картинки:

Прибор готов к эксплуатации.

Отмечу, что есть возможность запуска ещё несколько модернизированной версии утилиты:

В качестве проверочного тестирования, я исследую ШИМ сигнал полученный с Arduino.
За основу взят простенький код с изменением яркости светодиода по сопротивлению переменного резистора. Здесь данная опция не нужна, поэтому я закомментирую ненужное и пропишу значение для ШИМ в ручную.

Читайте также  Рефлектометр для измерений ксв в диапазоне частот 1-60 мгц

Вот что получилось:

Всё работает так как и должно.

Кроме этого приборчика, у меня имеется самодельный осциллограф на STM32, собранный по схеме от Tomasz Ostrowski: tomeko.net/index.php?lang=en, о котором я как то упоминал здесь.

Вот русская версия статьи про осциллограф со схемой: cxem.net/izmer/izmer103.php

Как видно, деталей очень мало. Можно взять за основу готовый модуль на основе STM32F103C8T6, который стоит всего 100рублей, но потребуется ещё и программатор: aliexpress.com/item/ST-Link-st-link-V2-for-STM8S-STM8L-STM32-Cortex-M0-Cortex-M3-SWIM-JTAG-SWD/32322884886.html

За пол часа можно будет «изготовить» этот осциллограф.

Делал (если можно так сказать, так как работы кроме программирования платы почти нет) я этот осциллограф с год назад, по быстрому, ради теста возможностей и спортивного интереса, поэтому выглядит он весьма не брежно и очень печально, но работает:

Делайте сразу нормально!

Со временем, начал питать его от банки 18650 и готового линейного стаба на 3.3В на AMS1117, к которому подпаял электролит небольшой ёмкости, так как это минимизировало помехи, даже с учётом того как тяп ляп собран сей девайс, не имеющий корпуса (есть пластиковый а надо бы алюминиевый).

Так же, повесил небольшой отечественный конденсатор по питанию на саму плату. Делители в обоих каналах вот такие:

P.S. Утилита обработчик рассчитана на делители указанные в схеме.
Диоды как на схеме не паял, нужно будет найти похожие и доделать всё как предполагалось.

Работает аппарат так же в двух канальном режиме, с максимальной частотой дискретизации 450Khz. Встроенный USB контроллер совместим лишь со стандартом USB 1.1.

И так, решил сравнить самоделку и обозреваемый заводской прибор:

Как видно, при таких достаточно простых измерениях, результаты похожи. Естественно возможности самоделки и удобство ограничены.

После получения прибора как раз подвернулся случай его проверки, друг принёс автомагнитолу (по сути комп) с большим жк дисплеем, в которой почему то перестала работать подсветка. С помощью осциллографа «пощупал» затворы транзисторов, понял что питание на них не подаётся, т.е. выявил что проблема точно не в них.

Итог.
Подводя черту, могу сказать что прибор весьма годный, мне ещё только предстоит изучить все возможности данного аппарата при подходящем случае.
Конечно же, я понимаю что это достаточно простой приборчик, имеющий скромные характеристики и не способный тягаться даже с любительскими, не поверенными моделями стоимостью от

12к (у Китайцев с али). Но начинать с чего то нужно, и этот аппарат лучше чем ничего, особенно если пока что нет нужды в чём то более мощном.

Данный прибор явно существенно лучше того же DSO138, построенных на STM32, хоть и стоит почти в три раза дороже.
Считаю что лучше взять именно Hantek 6022BE если нужен готовый аппарат, либо собрать на «побаловаться» самодельный осциллограф на STM32, который обойдётся весьма дёшево и будет быстр в изготовлении, и по сути будет неким бюджетным аналогом DSO138, и немного прокачает ваши навыки.
Вероятно, прибор в такой реализации так же более выгоден чем заводские портативные осциллографы, например DS202, стоимость которого в два раза выше.

К минусам прибора, я могу отнести узкий диапазон измерения напряжения, до 50В в обе стороны (насколько я понимаю увеличить нельзя, так как не факт что щупы с большим делителем подойдут к прибору). Но, справедливости ради, вероятно не всем потребуется измерять напряжение больше 50В. Полоса пропускания зависит от выбранного значения вольт/деление (чем меньше значение тем уже полоса).
Так же, как я понял, нет развязки по переменному току и внешней синхронизации.

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

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

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

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

Принципиальная схема 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 запроса, изменение аналогового усиления).

Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

МикроконтроллерSTM32F10XCXT61
STM32F103?IC1
Линейный регуляторLF331
D1-D4
Диод ШотткиBAT424
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
ДроссельBL01RN1A1
SG1
ПьезоизлучательF/TMB1
S1, S2
КнопкаЗамыкающая2
X1
РазъёмUSB1
JP2
РазъёмPLS-41
ВходыJP3
РазъёмPLS-31
UARTДобавить все

PROGCONT.RU

Форма входа

Дешёвый и простой USB осциллограф на STM32F103C8.

Ссылка на видео в YouTube Данный проект это своего рода подарок для тех у кого нет возможности приобрести осциллограф, что бы его реализовать вам понадобится настольный компьютер, дешевая отладочная плата на STM32F103C8, USB-UART конвертер, пары диодов шоттки и не много резисторов.
Для тех заинтересовался качаем архив от сюда Oscilloscope_AAW_v00 или с Яндекс диск в котором находится программа под WINDOWS( на 7 и 10 работает точно), два файла прошивки контроллера HEX и BIN.
Основные параметрами осциллографа это то, что частота выборки от 2.222KHz до 4MHz и исследуемые напряжения могут находится в диапазоне от 0 до 50 вольт, о возможностях читаем ниже в описании программы.
Ознакомление начнём конечно со схемы которая очень проста.

Читайте также  Методика проверки трансформаторов (3 способа)

Внимание! Должен быть установлен .NET Framework 4.5 и выше, разрешение монитора 1280х768 и выше, если не отображаются боковые кнопки управления значит не установлен видеодрайвер.

Компоненты:
1) отладочная плата на STM32F103C8;
2) USB-UART конвертер для обмена информацией между контроллером и компьютером, желательно на микросхеме CH340G;
3) входной резистор для ограничения тока 4.7K и мощностью не меньше 2Вт;
4) два диода шоттки 1N5819 для защиты от перенапряжения и обратных выбросов тока;
5) делителей напряжение состоящий из четырёх маломощных резисторов 550, 1.2К, 2.3К и 4.7К;

Инструкция и описание работы программы.

Порядок настройки устройства:
1) прошиваем контроллер прошивкой из папки stm32f103c8_bin_hex;
2) устанавливаем драйвера если есть необходимость для USB-UART конвертера;
3) собираем устройство согласно схеме, питание для отладочной платы можно взять от USB-UART конвертера и подключаем к компьютеру;
4) запускаем программу Oscilloscope_AAW_v00.exe из папки Oscilloscope_AAW_v00, если установлен антивирус то он может запустить проверку так как данной программы нет в его базе, для исключения данной процедуры добавьте программу в его исключение;
5) если сделано вами всё правильно то программа автоматически найдёт подключенное устройство, настроит его и отобразит к какому COM порту было подключено. Если этого не произошло проверьте соединение и питание устройства, исправьте ошибки и нажмите кнопку CONNECT, должен все настроится;

Описание элементов индикации и управления.

Описание элементов:
1) информация подключение к COM порту и кнопка подключения, если при старте программы или во время работы произойдет разрыв связи нажмите её, программа попытается переподключиться;
2) индикатор сканирование, зелёный цвет идёт сканирование и красный нет;
3) информация генератора, кнопка со стрелкой включение-выключения и выбор частоты 1KHz, 10KHz и 100KHz;
4) выбор режима работы осциллографа:
AUTO-автоматический или непрерывное сканирование;
TRIGG UP-старт сканирования по возрастанию сигнала;
TRIGG DOWN-старт сканирования по спаду сигнала;
5) делитель входного сигнала через резисторы;
6) информация о продолжительность задержки и ручка управления ей;
7) множитель для ручки управления задержкой;
8) режим работы:
RUN-обычная работа осциллографа;
PAUSE-сканирование остановлено, осциллограф в ожидание, можно использовать для одиночных пусков захвата или логического анализатора. Запуск одиночного сканирования осуществляется с помощью нажатия на кнопки AUTO, TRIGG UP и TRIGG DPOWN.
9) при наведение стрелки мыши на осциллограмму можно изменять:
a) нажатие на правую кнопку мыши и перетаскивая осциллограмму влево или право можно просмотреть её в буфере размером 3000 выборок;
b) нажатие на левую кнопку мыши можно перетащить осциллограмму вверх или вниз;
c) колёсиком мыши регулируется программное увеличение или уменьшение осциллограммы, нажатие на него возвращает истинный размер.

Для использования генератора подключите его выход PA6 к входу осциллографа, так вы сможете проверить его работу.

STM32F103C8T6 — делаем осциллограф. Часть 3

А описание некоторых ключевых особенностей под катом.

Аналоговая часть

Почти всё как было описано во второй части, кроме источника двухполярного питания. ОУ потребляют значительный ток (порядка 10 мА) и как не пытался схемами умножителей напряжения на диодах и конденсаторах получить приемлемых результатов — не удалось. Поэтому для положительного напряжения поставил вот такой модуль на основе МТ3608:

настроенный на 10 В выходного напряжения. А отрицательное напряжение получаю путём инвертирования положительного с помощью LT1054.

Про размер кода

В первой части я писал, что памяти потребляется очень много. Теперь я дошёл до того, что программа не влазит в память и изучил этот вопрос подробней.

CooCox CoIDE выводит информацию о размер программы в таком виде:

где

  • text — размер сегмента с кодом, векторами прерываний и константами только на чтение;
  • data — размер сегмента с инициализированными не нулём переменными;
  • bss — размер сегмента с неинициализированными и инициализированными нулём переменными.

Вся программа занимает:

  • флеш — text + data + 10..50 байт
  • ОЗУ — data + bss + 10..50 байт

Теперь посмотрим на что тратится память. Делаем новый проект и компилируем:

Чтобы использовать макросы типа GPIO_BSRR_BS9 надо подключить файл stm32f10x.h.
Чтобы подключить файл stm32f10x.h надо в репозитоях добавить компонент STM32F10x_MD_STDLIB, который подтягивает за собой cmsis_core. В итоге для программы, записывающей одно значение в регистр получаем:

Далее меня интересуют функции типа sprintf и sscanf. Чтобы их использовать надо определить некоторые функции типа _sbrk и возможно некоторых других. Я взял готовый файл (есть в архиве с проектом). Добавляем 1 вызов sscanf и получаем:

Режимы работы

Реализовал 3 режима по принципу действия: непрерывный, пакетный и логический и 3 по количеству каналов: 1, 2 и 4-х канальный.
МК имеет 9 аналоговых входов, но я не представляю когда мне может понадобиться больше 4-х каналов.

Непрерывный

Тут всё просто: в главном цикле МК считываем данные АЦП и передаём их на ПК, где можем строить непрерывный график. Недостаток — ограничение скорости со стороны канала МК -> ПК. Чтобы его обойти реализовал ещё 2 режима.

Пакетный

В этом режиме МК вначале набирает данные, потом пачкой передаёт на ПК. Опционально его можно разгонять. Про разгон подробно писал в предыдущих частях.

В этом режиме возможна синхронизация. Причём можно анализировать сигнал до выполнения условия. Для реализации такого функционала пришлось изменить режим работы DMA на кольцевой, использовать прерывание заполнения половины буфера и использовать буфер вмещающий в 2 раза больше данных, чем в передаваемом пакете.

В отличие от проектаbaghear у меня триггер программный. Преимущества такого решения:

  • Меньше деталей, а значит меньше цена и проще монтаж;
  • Возможность в будущем реализовать более сложные триггеры, а не просто «сигнал в A канале стал больше Х».

В одноканальном режиме оба АЦП по очереди преобразуют значение одного канала.
В двухканальном — каждый АЦП преобразует свой канал запускаясь одновременно с другим.
В 4-х канальном — у каждого АЦП есть 2 канала, которые он преобразует. Старт обоих АЦП одновременный.
Очевидно, что скорость частота преобразования канала обратнопропорциональна количеству каналов.

Логический анализатор

Самый быстрый режим. Примерно 20 MSPS на каждом канале. Самый быстрый код для этого режима выглядит так:

и так далее на весь буфер.
Значение переменной i в этом случае вычисляются на этапе компиляции и в итоге из dataBuffer.u8[++i] = GPIOA->IDR; получается всего 2 операции — загрузить данные в регистр из порта и сохранить данные в память по заранее посчитанному адресу. Никакими циклами такой производительности достичь не получилось.

Программа для ПК

Главные, на мой взгляд, измение — переход на OpenGL. С ним графики рисовать стало проще (для меня это оказалось неожиданно, но там всё действительно просто и кратко!), рисуются они быстрее и получаются гораздо красивей, чем были раньше.

Проект не завершён, есть глюки, допиливать ещё много чего, но каких-то прорывов уже не предвидится. Для более быстрых систем нужно другое железо, например, отдельный АЦП + ПЛИС + память — а это уже будет гораздо дороже и сложнее монтировать.

Почитав комментарии к статье «История одного осциллографа на stm32» сразу отвечу на некоторые вопросы:

  • Дисплей прикручивать не собираюсь т.к.:
    • Он стоит денег, а комп есть.
    • По качеству будет хуже, чем на большом экране ПК.
    • Создавать и изменять пользовательский интерфейс на C# проще, чем паять и перепаивать.

  • Я не планирую его доводить коммерческого продукта и продавать.
  • Делал для 2-х целей: освоить МК и сделать себе цифровой осциллограф.

Архив с проектом
Если у кого появятся вопросы, а тут не зарегистрированы, пишите в почту: adefikux на gmail точка com.