Переделываем dso138, или сделать что-то похожее на инструмент из игрушки

Предыстория и введение

На Али продается за очень недорого интересная игрушка – осциллограф под названием DSO138. Он снискал уже довольно большую популярность среди любителей электроники, но параметры этого приборчика, увы, позволяют его более-менее полноценно использовать только для отладки очень низкочастотных схем. Собственно, он и не позиционируется как инструмент, а скорее, как DIY-kit для начинающих электронщиков.

Собран этот «игрушечный» осциллограф на микроконтроллере STM32F103, и при достаточно грамотном схемотехническом решении цифровой части, наличии довольно приличного цветного дисплея 320Х240 точек, и не самом поганом аналоговом тракте, все, увы, гробится очень слабыми АЦП на борту 32F103. Заявленная полоса в 200 кГц может быть признана таковой только с очень большой натяжкой. Да, наличие или отсутствие сигнала с такой частотой он покажет, но вот реально посмотреть что-то сверх этого не получиться.

Есть и еще несколько, так скажем, странных недоделок. Например, USB порт в наличии имеется, но использовать его можно только для подачи питания, на связь с компьютером он не работает. Причина? Скорее всего выбранная тактовая частота ядра микроконтроллера не бьется с 48 МГц, необходимыми для корректной работы USB. Сервисные функции, например, та же калибровка нуля, без которой жить просто невозможно, реализованы очень неудобно, да и хотелось бы, чтобы сервиса было побольше, например, была бы возможность измерения параметров сигнала с использованием курсоров.

При этом есть у 103-й серии чуть более старший брат – STM32F303, по ножкам совместим практически полностью, но по интересующим нас параметрам существенно лучше, на борту 4 АЦП с частотой преобразования 5 МГц (6 МГц с 10-ти битным разрешением). При таком раскладе, если использовать все 4 АЦП параллельно с 10-ти битным разрешением, можно получить временное разрешение до честных 24 MSPS (миллионов отсчетов в секунду). Стоит микроконтроллер тоже недорого, на том же Али можно легко найти за опять же весьма умеренные деньги. Понятно, что идея поменять микроконтроллер возникла практически сразу после того, как я этот самый DSO138 и попробовал.

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

Самый простой вариант создания карманного осциллографа

Если замеряемая частота находится в диапазоне слышимых человеческим ухом частот, а уровень сигнала не превышает стандартный микрофонный, то собрать осциллограф из планшета на «Андроид» своими руками можно без каких бы то ни было дополнительных модулей. Для этого достаточно разобрать любую гарнитуру, на которой должен обязательно присутствовать микрофон. Если подходящей гарнитуры нет, то потребуется купить звуковой штекер 3,5 мм обязательно с четырьмя контактами. Перед припаиванием щупов уточните распиновку разъема вашего гаджета, ведь их бывает два вида. Щупы необходимо подключить к пинам, соответствующим подключению микрофона на вашем устройстве.

Далее следует загрузить из «Маркета» программное обеспечение, способное замерять частоту на микрофонном входе и рисовать график на основе полученного сигнала. Таких вариантов довольно много. Поэтому при желании будет из чего выбрать. Как и говорилось ранее, не потребовалась переделка планшета. Осциллограф будет готов сразу же после калибровки приложения.

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.

Firmware and miniscope v4 dll interface

  • 2012.04.16 Initial release, NOT RECOMMENDED:stm32scope_20120416.7zminiscope_v2c_dll_20120416.7z
  • 2012.04.21 Lots of fixes to both dll and firmware:stm32scope_20120421.7zminiscope_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.7zminiscope_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
    .
    stm32scope_20121006.7zminiscope_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):
    {
       "Capabilities" : {
          "Coupling" : ,
          "Sensitivity" : 
       },
       "Other" : {
          "bitsPerSample" : 9,
          "signalInverted" : false,
          "signalOffset" : 0
       }
    }    
        

    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).

    {
       "Capabilities" : {
          "Coupling" : ,
          "Sensitivity" : 
       },
       "Other" : {
          "bitsPerSample" : 8,
          "signalInverted" : true,
          "signalOffset" : 127
       }
    }    
        

    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).

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

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 и получаем:

Сигнал какой частоты можно увидеть?

Теоретически можно увидеть 477 кГц. Отличить меандр от пилы, теоретически, можно на частотах 350 кГц и ниже. Практически же, более-менее комфортно можно наблюдать сигналы до 200 кГц. Размер клетки: 20 x 20 px.

«Частота развёртки» нашего осциллографа зависит от быстродействия АЦП. В STM32F103 разрядность АЦП фиксирована и равна 12. Это в полтора раза больше, чем нам нужно. В STM32F407, например, разрядность можно уменьшить, что сократит время измерений. АЦП STM32F407 можно перевести в режим triple interleaved mode и получить скорость измерений 7.2 MSPS (грубо рисовать сигналы до 1 MHz). Но F407 в три раза дороже F103, а плата с ним (development board) — раз в 6.

АЦП, встроенные в микроконтроллеры, обычно не отличаются высоким быстродействием, хотя есть, например, LPC4370 (12-bit at 80 MSPS). Очевидно, что когда нужна скорость, следует использовать специализированные микросхемы, например AD9283. Но быстро измерить сигнал недостаточно, полученные данные нужно успеть куда-то сохранить за время измерения. Те, у кого есть время и деньги, могут поэкспериментировать с AD9226 (65 MSPS) и STM32F103VCT6 + FPGA.

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

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

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

Принцип действия

Половина текста программы — это всевозможные инициализации. Принцип действия цифрового осциллографа прост и очевиден.

АЦП производит серию непрерывных последовательных измерений уровня сигнала. Полученные значения складываются в память средствами DMA. Каждый раз мы засекаем время и определяем продолжительность серии замеров. Так мы узнаём цену деления оси времени.

Анализируя записанные значения уровня сигнала, ищем первый экстремум, после чего рисуем сигнал на экране. Так мы пытаемся сделать подобие синхронизации. Она неплохо работает на гладких сигналах и практически бесполезна на широкополосных.

Даём пользователю насладиться картинкой в течение одной секунды, сами в это время опрашиваем кнопку. Кратковременное нажатие кнопки переключает диапазоны по кругу. Долгое нажатие меняет чувствительность. Затем всё повторяется.

Текст программы

  • main.c
  • lcd7735.c — Дисплей и SPI. Инициализация и функции.
  • delay.c — Счётчик: инициализация, функции пауз.
  • ADC.c — АЦП и DMA.
  • font7x15.h — Шрифт.

v. 1.02

Для компиляции я использую среду CooCox CoIDE. Не выложил сюда Кокс-проект, поскольку он содержит абсолютные пути к файлам. Проще создать новый, чем править все пути. После создания проекта не забудьте подключить библиотеки: RCC, GPIO, DMA, SPI, TIM, ADC.

Как создать CooCox CoIDE проект

  1. Запускаем IDE. Из меню: Project > New Project
  2. Вводим имя, запоминаем где лежит проект.
  3. Выбираем «Board», жмём «Next >»
  4. STM32 > STM32F103x > STM32F103C8T6 Core Development Board
  5. В окне «Repository» выбираем вкладку «Peripherals», подключаем библиотеки (см. рис.)
  6. Чтобы Кокс не ругался на stdio.h, задаём: View > Configuration > Link > Library: «Use Base C Library».
  7. Распаковываем скачанные файлы в папку проекта.
  8. Жмём «F7».
  9. Ликуем.
  10. Чтобы автор порадовался вашему триумфу, переводим ему 50 рублей на пиво.

Прошивал при помощи программатора-отладчика ST-Link V2. Можно и без него, через USB-Serial адаптер.

Использованы материалы:Проект шотландского мастера PingumacpenguinAdafruit DisplaySTM32 Сохранение данных АЦП с помощью DMA

Если у вас есть комментарий по существу, дополнение, которое поможет сделать проект лучше или просто хотите поделиться фотографией своего изделия — присылайте.

Микроконтроллеры  
1999-2021 Advanced Research

Самодельная приставка с Bluetooth-модулем

Если же требуется более широкий диапазон частот, то приведенным выше вариантом ограничиться не получится. Тут на помощь приходит новый вариант — отдельный гаджет, представляющий собой приставку с аналогово-цифровым преобразователем, обеспечивающий передачу сигнала в цифровом виде. Аудиотракт смартфона или планшета в данном случае уже не задействуется, а значит, можно достигнуть более высокой точности измерений. По сути, на этом этапе они представляют собой только портативный дисплей, а вся информация собирается уже отдельным устройством.

Собрать осциллограф из планшета на «Андроид» с беспроводным модулем можно самому. В сети есть пример, когда похожее устройство еще в 2010 году реализовывалось с помощью двухканального аналогово-цифрового преобразователя, созданного на базе микроконтроллера PIC33FJ16GS504, а в качестве передатчика сигнала служил Bluetooth-модуль LMX9838. Устройство получилось довольно функциональным, но сложным в сборке, поэтому для новичков его сделать будет непосильной задачей. Но, при желании, найти подобный проект на тех же радиолюбительских форумах не проблема.

Плюсы и минусы вышеприведенной схемы

К плюсам такого решения однозначно можно отнести простоту и дешевизну сборки. Старая гарнитура или один новый разъем практически ничего не стоят, а времени потребуется всего несколько минут.

Но у этой схемы есть ряд существенных недостатков, а именно:

  • Малый диапазон измеряемых частот (в зависимости от качества звукового тракта гаджета колеблется в пределах от 30 Гц до 15 кГц).
  • Отсутствие защиты планшета или смартфона (при случайном подключении щупов к участкам схемы с повышенным напряжением можно в лучшем случае сжечь микросхему, отвечающую за обработку аудиосигнала на вашем гаджете, а в худшем — полностью вывести из строя ваш смартфон или планшет).
  • На очень дешевых устройствах присутствует значительная погрешность в измерении сигнала, достигающая 10-15 процентов. Для точной настройки оборудования такая цифра недопустима.

Готовые варианты приставок с Bluetooth

Инженеры не дремлют, и, кроме кустарных поделок, в магазинах появляется все больше приставок, выполняющих функцию осциллографа и передающих сигнал через Bluetooth-канал на смартфон или планшет. Осциллограф-приставка к планшету, подключаемая посредством Bluetooth, зачастую имеет следующие основные характеристики:

  • Предел измеряемой частоты: 1МГц.
  • Напряжение на щупе: до 10 В.
  • Радиус действия: около 10 м.

Этих характеристик вполне достаточно для бытового применения, и все же в профессиональной деятельности иногда возникают случаи, когда и этого диапазона катастрофически не хватает, а реализовать больший с медлительным протоколом Bluetooth попросту нереально. Какой же выход может быть в этой ситуации?

USB-осциллографы

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

Однако, учитывая его ограничения, этот вариант подойдет далеко не всем. В таком случае может использоваться USB-осциллограф, который обеспечит такие же характеристики, как и приставка с передачей сигнала по Wi-Fi. Стоит отметить, что такие приборы иногда работают с некоторыми планшетами, которые поддерживают технологию подключения внешних устройств OTG. Само собой, ЮСБ-осциллограф также пытаются сделать самостоятельно, причем довольно успешно. По крайней мере, именно этой поделке посвящено большое количество тем на форумах.

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).

История одного осциллографа на stm32 +23

  • 07.07.16 14:18


baghear

#278198

Гиктаймс


Из песочницы

11700

Производство и разработка электроники

Чуть больше года назад, мне в голову пришла мысль о том, что хорошо бы было сделать осциллограф. Тогда мне хотелось, чтобы это было независимое устройство с собственным TFT дисплеем, да и вообще, идея разобраться с TFT дисплеями, мне казалась очень перспективной. Спустя некоторое время на али был заказан TFT размером 3.2 дюйма с драйвером SSD1289.
На тот момент у меня уже был опыт программирования микроконтроллеров AVR, поэтому решил запустить дисплей на моём любимом Atmega16. Дойдёт ли дело до создания осциллографа тогда ещё не знал, но то что буду в своих проектах использовать TFT знал точно, поэтому не стал искать сторонние библиотеки, а решил написать свою, которой пользуюсь и по сей день. 
После того, как получилось инициализировать дисплей, стало понятно, что на Atmega16 сделать осциллограф не получится. Уж очень медленный он для дисплея такого размера. И что-то внутри подсказывало мне, что пора переходить на STM32, но оно же и останавливало меня. В общем, процесс обдумывания был недолгим и на али была заказана плата с STM32F103VET6 на борту. Но кроме причины описанной выше, была ещё одна причина перейти на STM32 – встроенный 12 битный АЦП на 1Msps, который можно использовать для оцифровки сигнала.
 
К моему удивлению, после нескольких недель работы с STM32 стало понятно, что в них нет ничего сложного и я перестал понимать, почему не перешёл на них раньше. Перенести код, написанный для AVR, на STM32, не составило труда, но не давала покоя мысль о том, что мне необходимо, чтобы дисплей работал на максимальной скорости, а для этого надо было разобраться с FSMC. На самом деле и тут оказалось всё просто — это заняло у меня одни выходные. На этом подготовительные мероприятия с дисплеем были закончены и можно было переходить непосредственно к реализации осциллографа.
 
Первоочередной задачей было научиться выводить сигнал на дисплей, для этого накапливал необходимое количество выборок АЦП, затем выводил их на экран, заливал экран чёрным цветом и так по кругу. Кстати, уже тогда для сохранения данных в буфер использовал DMA.
 
Первый шаг был сделан и меня переполняла радость и гордость за проделанную работу. Далее, хотелось, чтобы синусоида не бежала, а стояла, для этого надо было научиться запускать преобразование АЦП по триггеру.
Сделать это можно с помощью обычного компаратора, как показано на схеме ниже.

Компаратор на ОУ.Фрагмент схемы DSO 138.Что делает этот кусочек схемы?+VREF-VREFАЦПДля чего столько точек?Так а для чего всё-таки кольцевой буфер?

  1. накапливаем нужное количество предвыборок;
  2. разрешаем внешние прерывания;
  3. МК начинает выполнение каких-то сторонних задач, до тех пор, пока не придёт сигнал внешнего прерывания.

https://youtube.com/watch?v=YSC2J1qom2g

Что мог прототип осциллографа на тот момент?(а что он что-то мог?)Для того чтобы реализовать остальные функции пришлось снова вернуться к железу. И думаю у многих возник вопрос, почему не заюзать всю схему от DSO138?В итоге получилось сделать осциллограф обладающий следующими характеристиками:

Реализация защиты, экранирования сигнала и снижения погрешности

Для того чтобы частично защитить свое устройство от возможного выхода из строя, а также стабилизировать сигнал и расширить диапазон входных напряжений, может использоваться схема простого осциллографа для планшета, которая уже долгое время успешно применяется для сборки приборов для компьютера. В ней применяются дешевые компоненты, среди которых стабилитроны КС119А и два резистора на 10 и 100 кОм. Стабилитроны и первый резистор подключаются параллельно, а второй, более мощный, резистор используется на входе схемы, чтобы расширить максимально возможный диапазон напряжений. В результате пропадает большое количество помех, а напряжение повышается до 12 В.

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

И тут нам поможет System Tick Timer! Настраиваем его, отключаем прерывания, не включаем Watchdog (чтоб проц не отвлекался на что-то иное кроме выполнения). Переходим в отладчик, выполняем инструкции по шагам и сравниваем сколько успел насчитать таймер во время выполнения инструкции. Берем два абсолютно одинаковых куска кода и сравниваем кол-во тактов на инструкцию:

Оригинал (STM32F030):

«Китайское» (HK32F030):

Вот блин бабушка и приехали… Инструкции LDR/STR выполняются в полтора раза дольше и те же инструкции тратят на один такт больше если используем Immediate Value… и мало того, — по сути идентичные инструкции выполняются разное кол-во тактов, и ещё опа, — времени банально не хватает на текущую реализацию… Пусть, ядро может работать на 72 MHz, пробуем.

Меняем множитель с 6 на 9. И в теории, времени теперь навалом, а по факту впритык, потому что проц пожирает массу времени на часто используемые команды, подгоняем реализацию под нужные временные интервалы антинаучным методом «подбора» и «научного тыка». И теперь оно работает.

Схема

Рис. 2. Подключение дисплея.

Рис. 3. Питание и входная цепь.

Делитель напряжения R1-R2 служит для контроля уровня заряда аккумуляторов. В правом верхнем углу экрана — пиктограмма батарейки, как на мобильном телефоне (на фото отсутствует).

Внешний регулятор напряжения нужен не всегда. На плате микроконтроллера есть свой регулятор 3.3 В 100 мА. Если питать дисплей от него, будет греться. На платах другого типа (STM Smart V2 board — с большим разъёмом JTAG) стоит как раз AMS1117, для них внешний не нужен. На некоторых дисплеях тоже есть AMS1117 (и перемычка). Решайте сами.

Последовательно с аккумуляторами имеет смысл поставить выключатель питания ПД9-1 или аналогичный.

Если есть желание увеличить размер своего импеданса, на вход можно добавить неинвертирующий повторитель на ОУ, что позволит достичь значения 1 MΩ и более. Питать ОУ следует непосредственно от аккумуляторов напряжением 4.8 — 5.4 В.

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

 Порядок настройки устройства:
   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 к входу осциллографа, так вы сможете проверить его работу.

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

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

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 и получаем:

Попробуйте угадать сколько, прежде чем смотреть!

41 кБ флеша! Больше половины, того, что есть в контроллере! В рабочей же прошивке при использовании printf добавление sscanf увеличивает потребление флеша на 13.2 кБ. В итоге от sscanf отказался, а команды от ПК стал парсить менее ресурсоёмким методом.Отказ же от printf позволяет сэкономить ещё 8.3 кБ.

Итог

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

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

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

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