Проводим нагрузочное тестирование скоростных usb-библиотек для stm32f103c8t6

Содержание

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

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

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

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

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

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

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

В аналоговой части в оригинале используется операционный усилитель TL084 с паспортной полосой пропускания где-то в районе 4 МГц. Понятно, что, если мы хотим хотя бы видеть сигнал частотой 8 МГц, то эту микросхему также придется поменять на более широкополосную. Переделки аналоговой части (Рис.6) собственно и сводятся к такой замене и сопутствующим изменениям в номиналах элементов входного тракта.

Итак, меняем TL084 на любой счетверенный усилитель с полосой от 100 МГц в подходящем корпусе. В моем случае я остановился на AD8054 (другой вариант, например, TL974). Полоса пропускания у этих микросхем по паспорту – 150 МГц, хорошо, и для наших целей более чем достаточно.

Далее, сразу же выяснилось, что смещение нуля в общем случае для AD8054 существенно больше, и, соответственно, оставлять вход усилителя совсем открытым без подтяжки резистором к земле, как в оригинальной схеме, не получится, что собственно и привело к изменениям схемотехники входной части. На вход операционного усилителя был добавлен резистор 110 кОм. 

Рис.6. Изменения входной части аналогового тракта.

В нашем случае ставить большой делитель на этом диапазоне 10 мВ равносильно неприемлемо большой потере в точности и качестве обработки этого сигнала АЦП, либо необходимости введения каким-то образом дополнительного усиления в тракте, что приводит к уже существенным переделкам платы. Поэтому в предположении, что основной фронт работ – это цифровая схемотехника, для которой этот диапазон не является основным рабочим, я ограничился делением на 2, что далее компенсируется в программе, и входным сопротивлением 200 кОм, что конечно плохо, но приемлемо.

Еще одно компромиссное решение – сделать входное сопротивление 1 МОм именно для диапазона 1В, что позволяло бы использовать на этом диапазоне щуп с делителем 1:10 с точным делением, для диапазона 0,1В я счел это не столь актуальным. При этом для диапазона 0,1В входное сопротивление получается 660 кОм, тоже плохо, но приемлемо.

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

В зависимости от того, какой усилитель будет использован, возможно, будет необходимо добавить в схему питания ОУ еще один преобразователь для получения отрицательного напряжения параллельно уже существующему. В схеме в оригинале используется ICL7660 для получения отрицательного напряжения. Данная микросхема допускает параллельное соединение неограниченного числа таких преобразователей для увеличения выходного тока. Если окажется, что одного преобразователя ICL7660 недостаточно для питания выбранного ОУ, то на свободное место на плате надо будет установить еще одну микросхему ICL7660 с двумя электролитическими конденсаторами 100 мкФ соединенными аналогично U2, C12, C13, и подключить ее параллельно существующей.

Проконтролировать необходимость такой установки просто по значению напряжения «V-» в контрольной точке TP8, в идеале это напряжение должно быть по значению не меньше -3В, еще лучше — -3,5В. Если измеренное напряжение существенно меньше, то поставить еще один ICL7660 необходимо.    

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

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

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

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

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

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

Текст программы (некоторые называют его «скетч»)

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

Для компиляции я использую среду 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 адаптер.

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

  • Максимальная частота оцифровки 4.27 мГц (Интерлив, ДМА, 120 мГц тактовая частота)
  • Синхронизация: фронт, спад, max, min
  • Входное напряжение 0

Дисплей SPI TFT 2.2″ (2.4″)) 320×240
Цифровой люминофор ( 0.1сек/дел

10сек/дел)

FFT спектр сигнала
Заморозка экрана (Freezing)
Генератор прямоугольных импульсов 0.1Гц

20мГц

Пять кнопок управления

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

Теоретически можно увидеть 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.

Цифровая часть (плата)

Рис.1. Переделки цифровой части (общий вид).

Переделки цифровой части (Рис.1) минимальны и сводятся к следующему:

1)      Режем одну дорожку, соединяющую R50 и PA7 микроконтроллера, и соединяем эту ножку R50 c питанием +3,3В (Рис.2 и Рис.3). Это необходимо по двум причинам: порт PA7 нужен для одного из входов АЦП, подача постоянного питания на R50 позволит использовать USB и в режиме загрузчика прошивки.

Рис.2. Режем дорожку. Рис.3. Переделки USB порта.

2)      Заменяем микроконтроллер на STM32F303СВ или STM32F303CC. Для работы программы необходимы минимально 128 кБ флэш-памяти и 40 кБ ОЗУ.

3)      Соединяем вместе четыре входа АЦП: ножки PA0 (10), PA7(17), PB13(26), PB14(27). Рисунок 4.

Рис.4. Замена микроконтроллера и соединение входов АЦП.

4)      Заменяем также EEPROM (Рис.5) на любой стандартный, емкостью не менее 32 кБит, но с 2-х байтной адресацией (например, вполне подойдет старый добрый AT24C32 в подходящем корпусе). Скажем честно, разобраться с той китайской микросхемой EEPROM, что уже стоит на плате мне не удалось. Протокол у нее оказался сильно не похожим на какой-либо стандартный. А дальше по ходу работы над программой выяснилось, что необходимо минимум 4 кБ энергонезависимой памяти для хранения калибровок и прочих данных. Поэтому, ту микросхему, что есть на плате, и которая имеет емкость по некоторым данным только 2 кБ, все равно менять бы пришлось.     

Рис.5. Замена EEPROM.

5)      Запаиваем штырьковые разъемы на 3 контакта на последовательный порт (низ платы на Рис.1) и на порт PA3 + GND (верх платы на Рис.1). Последовательный порт можно использовать одновременно и наравне с USB для соединения с компьютером и передачи данных. Порт PA3 используется как вход (аналоговый!) для подачи сигнала внешней синхронизации (триггера). На этот порт заведен вход компаратора внутри микроконтроллера. Уровень (порог) срабатывания триггера задается программно в меню осциллографа.

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

ВНИМАНИЕ: Сигнал синхронизации подается на вход микроконтроллера напрямую. Максимально допустимое напряжение при этом не должно превышать 3,3В

Отрицательное относительно земли (GND) платы напряжение на этом входе соответственно также крайне нежелательно. 

Самодельные варианты современных приставок-осциллографов

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

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

Код

Запишем нулевое значение в DAC и включим его. Далее в тестовом примере будет написана функция, которая постепенно увеличивает выходное значение DAC до достижения им потолка (4095).

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

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

После этого запускаем преобразования ADC с DMA. ADC теперь будет ждать события от таймера.

И следом запускается таймер с DMA2, при этом количество транзакций должно быть на единицу меньше, т.к. первое число уже находится в регистре CCR1.

Осталось запустить на железке и проверить.

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

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

Непрерывный

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

Пакетный

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

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

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

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

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

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

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

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

Открываем техническую документацию…

Судя по описанию: «HK32F030x4 / HK32F030x6 / HK32F030x8. HK32F030 Перечисленные микросхемы разработаны компанией Shenzhen Haohan Tianji Processor Co., Ltd., дочерней компанией Shenzhen Hangshun Chip Technology Research Co., Ltd.».

И тут честно говоря я был в восторге! Во первых чипы могут работать в диапазоне питающего напряжения от 2,0 В до 5,5 В. Во вторых: максимальная тактовая частота ядра аж до 72 МГц!!! Прям сказка да и только!!! Убедитесь сами!!!:

…читаем дальше!!!

Тут я добираюсь до функциональной схемы модуля генерации частот… и слегка недоумеваю…

…что такое RCC_CFGR4, у STM’ки его нет! Открываем библиотечный файл «stm32f0xx.h»:

Но сравнив данный модуль с оригинальным, я понимаю что на CFGR4 мне пофиг, куска которым управляет данный регистр у оригинального чипа нет:

…просмотрев весь документ я понимаю что информации о чипе в документе явно не достаточно, можно было бы предположить что в нем точно повторен STM32F030, однако тут я вспомнил про регистр CFGR4…

В итоге прорыв просторы интернета я таки нашел ссылку на неведомую библиотеку HK32F0_LibraryV1.0.3… и оказывается вон оно как:

…интересно китайцы специально отступили (uint32_t RESERVED; /*!< Reserved) чтоб в лоб не получилось найти доп регистры или это фишка реализации?

Посмотрев библиотеку, увидел что по регистрам периферии прям одно и то же с оригиналом! Ну дык и давайте шить прошивку!!! (…достаю из закромов родины забавную программную реализацию USB для STM32F0xx…) Зашиваю, и получаю:

Не понял, беру STM32F030, зашиваю:

Но я ж не просто так, меня попросили помочь переехать с STM на HK и чтоб программное USB работало… и тут мне слегка не по себе стало… кто реализовывал программный USB на ARM, тому наверное сразу вспомнится цитата из документашки: » performs no operation and is not guaranteed to be time consuming. The processor might remove it from the pipeline before it reaches the execution stage. » Иными словами NOP пользуется для выравнивания команд и с конвейера его проц может «выплевывать» не задерживаясь на выполнение пустой операции… но я не совсем про это говорю, как ровнять тайминги если неизвестно сколько тактов тратит каждая инструкция?

Этож целая экспедиция переписать тактозависимые функции приема и передачи для ядра ARM!!!

Тут абсолютно понятно что HK явно не является «клоном» по количеству тактов на инструкции. Однако где найти документацию по ассемблерным командам и самое главное по тактам затрачиваемым на выполнение.

Итоги

Итог и результат трудов — на Рис.8. На вход подан меандр частотой 1 МГц.

Рис.8. Меандр частотой 1 МГц.

Сигнал 2 МГц тоже вполне четко видно, но разглядеть подробности уже совсем не получится. Наличие/отсутствие сигнала можно спокойно увидеть для достаточно высоких частот, по крайней мере 25 МГц на ножках кварца микроконтроллера видно четко (Рис.9). При этом наблюдаем весьма коварный эффект биений между частотой дискретизации (в данном случае 12 МГц) и частотой сигнала – 25 МГц, который обязательно возникает, если частота дискретизации кратно меньше частоты сигнала.  Сигнал выглядит как будто он имеет частоту 1 МГц, но это как раз разность между удвоенной частотой дискретизации и сигналом.

Также отметим, что щуп пришлось поставить в положение 1:10, так как входное сопротивление в 220 кОм, подключенное к ножке кварца напрямую, естественно, срывает генерацию. Коэффициент деления получается при этом 9,1 МОм + 220 кОм / 220 кОм = 42, т.е. в клетке примерно 420 мВ.

Рис.9. Сигнал с кварцевого резонатора 25 МГц.

Русской душе хочется всегда чего-то большего, чем то, что достижимо. Прикинув теоретическую максимально достижимую скорость дискретизации с точки зрения входа АЦП, а это определяется минимальным временем открытия УВХ, которое в нашем случае 1,5 такта х (1 / 72 МГц) = 20,8 наносекунд , что дает 48 MSPS, стал думать, а можно ли как-то этого достичь при имеющемся железе?

И вот, в итоге все же удалось посредством некоторого, но вполне законного фокуса, перепрыгнуть через голову и получить для некоторых, не для всех конечно, вариаций входного сигнала, эффективные 48 MSPS и время развертки 500 и 200 наносекунд на клетку, не без искусственных артефактов (Рис.10), но иногда и вообще абсолютно чисто (Рис.11)! Но, фокус работает только для правильно-периодических сигналов, и разглядывать так сигналы частотой сильно выше 1 МГц все равно, увы, не получится. Про все это далее в отдельной публикации…       

Рис.10. 48 MSPS. Меандр 1 МГц. С артефактами.Рис.11. 48MSPS. Меандр 1 МГц.