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

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


Компаратор на ОУ.

На инвертирующий вход подаётся опорное напряжение, которое формируется с помощью ШИМ и RC цепочки. А на прямой вход подаётся сигнал, тот же что подаётся на вход АЦП.

Когда напряжение на прямом входе становится выше или ниже напряжения на инверсном входе изменяется полярность на выходе ОУ. Это изменение фиксирует вывод МК настроенный на внешнее прерывание. Изменяя активный фронт, для внешнего прерывания можно производить захват как по возрастающему, так и по спадающему фронту.

Далее, в прерывании включается DMA и работает до тех, пор пока буфер не заполнится. Да именно DMA, АЦП в моей реализации работает всегда. Резистор в обратной связи необходим для увеличения скорости нарастания, да и сам ОУ для этого дела, желательно выбрать побыстрее.
 
Спустя некоторое время мне на глаза попался обзор DSO 138 и из того же обзора я узнал, что его схема доступна в интернете и решил позаимствовать оттуда кусочек.


Фрагмент схемы DSO 138.

Что делает этот кусочек схемы?
Диапазон напряжений, с которыми может работать АЦП определяют уровни опорных напряжений(+VREF и -VREF), они не должны выходить за диапазон питания микроконтроллера. Нижнюю границу диапазона ограничивает 0 вольт, верхнюю — 3.3 вольта. Отсюда становится понятно что измерять отрицательные напряжения АЦП не может, а это необходимо.

Для того чтобы АЦП чувствовало отрицательные напряжения необходимо, чтобы в отсутствие сигнала на его вход подавалась половина опорного напряжения в нашем случае 1.6 вольта. В таком случаем при измерении отрицательного напряжения, например, минус 0,3 вольта, напряжение на входе АЦП уменьшится на 0,3 вольта и станет равно 1,6 — 0,3 = 1,3 вольта. Такое напряжение АЦП с лёгкостью оцифрует. Этот пример приблизителен потому, что не учитывает коэффициент усиления схемы(в данном случае мы приняли его за 1), зато нагляден.
 
Также хотелось обратить внимание, что питание ОУ двухполярное, это надо для того чтобы ОУ мог работать с отрицательным напряжением. В случае если питание ОУ однополярное(на один вывод питания подаётся 0, на второй 5 вольт)и на вход ему подать отрицательное напряжение, ОУ просто его не почувствует и сделать с ним ничего не сможет, вот так вот.

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

Для чего столько точек?
Такое количество точек, с помощью прореживания позволяет реализовать некоторые развёртки, которые нельзя реализовать аппаратно. У STM32 длительность преобразования составляет 12.5 цикла, для того чтобы найти период выборок надо к длительности преобразования прибавить значение, которое определяется битовым полем SMPx[2:0]. На данный момент у DSO 138 уменьшили размер буфера до 1024 точек, у меня же осталось 4096.
 
Так а для чего всё-таки кольцевой буфер?
Кольцевой буфер необходим для изменения соотношения количества пред и пост выборок, на быстрых развёртках. Предвыборки — выборки до срабатывания триггера, поствыборки — выборки после срабатывания триггера. Алгоритм работы следующий, после отрисовки осциллограммы:

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

Результат можно посмотреть на видео.



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

В итоге получилось сделать осциллограф обладающий следующими характеристиками:
Напряжение питания: 9 В
Потребляемый ток: 110 мА
Частота сэмплирования: 1 Мвыб/с
Аналоговая полоса пропускания: 0 — 200 КГц
Разрешение по вертикали: 12 бит
Максимальное входное напряжение: 50 В
Чувствительность по вертикали: 10 мВ/дел — 10 В/дел
Время горизонтальной развертки: 10 мкс/дел до 200 мс/дел
Входной импеданс: 1 МОм/20пФ
Режимы входа: DC, AC, земля
Режимы запуска — развертки: авто, нормальный, однократный





Результат можно посмотреть на видео.

Поделиться с друзьями
-->

Комментарии (45)


  1. xedas
    07.07.2016 18:20

    Посмотрите точнее в описании, возможно, эти МК умеют использовать 2-3 своих АЦП для поочерёдного преобразования одного канала. По крайней мере, STM32F103C8T6 умеет так делать. Тогда сможете повысить частоту сэмплирования в 2-3 раза. Плюс они хорошо разгоняются. Тут описывал подробно.

    Какую в итоге схему аналоговой части использовали?


    1. baghear
      07.07.2016 18:54

      Было несколько попыток запустить 2 АЦП для оцифровки сигнала, но они не увенчались успехом. Сделать это можно так, как полоса аналогового тракта позволяет.

      Для реализации аналоговой части была переработана схема осциллографа Velleman HPS-9.


      1. baghear
        07.07.2016 19:18

        Ошибся,Velleman HPS-5


  1. madf
    07.07.2016 19:01

    1. "Интересное" сравнение Atmega16 с STM32 — :D Сравнивать тогда нужно с XMega, там такой же АЦП (в рамках задачи).
    2. Экран честно говоря производительностью не блещет, весьма вяло работает, для таких задач нужны экраны с параллельным режимом работы или совершенно другие последовательные интерфейсы обмена (современные).
    3. Чтобы получить возможность обрабатывать АЦП с положительным напряжением, двухполярное, нужно всего лишь использовать операционники работающие в режиме "rail-to-rail". Если использовать не предназначенные для этого, то там начинаются проблемы с компенсацией переходных процессов, неточности/глюки (правда всё решается повышенным питанием или специализированными микросхемами отрицательного напряжения)...


    1. baghear
      07.07.2016 19:40

      1. Не сравнивал их, для начала надо было просто разобраться с подключением TFT дисплея. На каком МК не имело значения. Если бы Atmega16 потянул, планировал прикрутить к нему внешнее АЦП.
      2.Вы имели ввиду параллельный интерфейс?
      Экран управляется по параллельному интерфейсу i8080, приведите пример современных ПОСЛЕДОВАТЕЛЬНЫХ интерфейсов?


      1. lorc
        07.07.2016 19:49

        Современный последовательный интерфейс — это DSI (Display Serial Interface).


      1. madf
        07.07.2016 20:58

        1. vorphalack
          08.07.2016 04:46

          и при чем тут теле-киношный SDI, когда человек говорит про https://en.wikipedia.org/wiki/Display_Serial_Interface?


          1. madf
            08.07.2016 11:21

            читайте внимательнее


    1. zvic
      08.07.2016 20:16

      Этот экран работает с параллельным интерфейсом Intel 8080 по 16-битной шине.

      Сколько стоит тач-дисплей с DSI или SDI интерфейсом?


      1. madf
        08.07.2016 23:47

        1. baghear
          08.07.2016 23:52

          Отличная цена, осциллограф получился дешевле)))


          1. madf
            08.07.2016 23:57
            -2

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


        1. zvic
          09.07.2016 00:07

          Боюсь ошибиться, но эта панель:
          1. Не тач-скрин
          2. Подключается по протоколу HDMI


          1. madf
            09.07.2016 00:21

            1. не тач, но тач для неё вот: http://www.dfrobot.com/index.php?route=product/product&product_id=1414#.V4AYPqI9noQ
            2. нет, панели на HDMI такого плана стоят в разы больше, это DSI


            1. zvic
              09.07.2016 01:13

              То есть цена такого решения вырастает с $6-10 за дисплей на базе SSD1289 до $50. К тому же, поддержка DSI есть только у STM32F469/479/769/779, что поднимает стоимость только МК с $4 до $15. Неплохой такой апгрейд…


  1. mrigi
    07.07.2016 19:17

    Но почему бы не сделать его в виде bluetooth/wifi и выводить на качественный экран телефона/планшета/компьютера?


    1. baghear
      07.07.2016 19:44

      Может быть со временем реализую, но хотелось бы всё таки самостоятельное автономное устройство, с батарейным питанием.Ну и контроллер заменить на stm32f303 и использовать его АЦП в режиме интерлив.


    1. ABATAPA
      08.07.2016 11:28

      К слову, у меня есть такой, как раз Velleman, WFS210


  1. Mirn
    07.07.2016 20:33
    +4

    Хочу поделиться своими мыслями и наработками в области осциллогрофостроения:
    1. есть более лучшие способы синхронизации чем по уровню:
    можно использовать максимум корреляционного момента первого порядка, т.е. хранить текущее окно, и новое окно в два раза больше текущего, и искать в нём максимум простой корреляции, сдвигая текущее окно по новому выборка за выборкой — это отлично оптимизируется на SSE, но требует очень мощного МК или плис для автономной железяки.
    плюсы: каким бы не был сложным сигнал и сколько бы раз он не пересикал линию триггера (его нет в этом методе) — осциллограмма будет выравнена достаточно точно и дрожжание будет очень редким
    вот мой пример (см правый верхний угол, при режиме stab):
    https://www.youtube.com/watch?v=Q5qWt__qzqY

    2. Так же в свой служебный осциллограф я писал рендер эмулятора люминофора, очень шустро работает даже на гигантских UHD мониках и слабых компах. Очень помогает видеть быстротекущие процессы, например когда проскакивают щелчки изредка
    https://www.youtube.com/watch?v=QTZsh2vzkZ8

    3. Осциллографу часто очень полезен БПФ анализатор, особенно тем кто с аналоговой техникой работает,
    вот например мой вариант: есть курсор — привязан к мыши с поиском локального максимума, выбор окна, зум, анализ гармоник, шума и THD и тд
    https://www.youtube.com/watch?v=fpAtxhUAFgc

    4. А так же при разработке сложных ДСП штук типа антиэха на линейном КИХ фильтре на базе нейрона розенблатта просто жизненно важно выводить состояния внутренних ячеек фильтра, буферов, задержек и тд
    например весовые коэффициенты линейного антиэха в реалтайме с угосанием:
    https://www.youtube.com/watch?v=hCO3Kvl5bt8

    5. Так же очень полезно если осциллограф развязан по питанию и защищён от 220В, а лучше от 1000В. И их несколько. Это позволяет отлаживать двигатели, разные сложные штуки с множеством земель и питания, блоки питание и тд. Ну просто чертовски удобно тогда становится.
    Так же полезно прослушать звуком в реалтайме, и когда осциллограф подцепляется по езернету — удобно отлаживать удалённо или большие установки в которых щупом не дотянуться или размером с поезд.

    Жаль что всё это у меня есть. по частям и никому не нужно было — MVP так никто и не купил — проект сбора частей в законченную железку забросили из за тотального отсутствия заказов.


    1. apple01
      07.07.2016 21:14

      что такое MVP в данном контексте?


      1. Mirn
        07.07.2016 21:26

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


        1. apple01
          07.07.2016 22:58

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


        1. ABATAPA
          08.07.2016 11:53

          Что мешает сделать софт под имеющееся «железо», и продавать?
          А лучше — визуализатор для sigrok.


        1. microtrigger
          08.07.2016 21:46

          А еще сайт жив? Я бы посмотрел ваше предложение.


          1. Mirn
            08.07.2016 22:03

            нет, извините, но лет 5 как мёртв, и доменное имя упущено.
            сейчас это не только осциллограф, а ещё и функциональный генератор, проигрыватель файлов и записей, долговременный анализатор еденичных странностей, источник развязаного напряжения и даже потребитель тока и много ещё чего. Но не вместе, а винигретом и абы-как в котором я сам путаюсь порой (но по работе самый незаменимый инструмент). особенно нравится что можно прослушать налету и всё в строгом реалтайме (+-50мс), что видишь, то и слышишь, то и в схеме происходит. Поэтому такой винигрет да привязанный к разнородному железу порой в паре экземпляров, я дать не могу — это бессмысленно.


            1. microtrigger
              09.07.2016 01:54

              Жаль. Видимо уровня RedPitaya вряд ли что-то найду аналогичное.


    1. zvic
      08.07.2016 19:55

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

      Это задача для STM32F7, один из рекламируемых плюсов этого МК — наличие DSP инструкций. Стандартный набор примеров для STM32F7 Discovery включает определение направления звука по разности сигналов с двух микрофонов.


      1. Mirn
        08.07.2016 20:25

        они вообще то есть и в STM32F4, правда помогают не так уж прям в 2-3 раза как рекламируют их все, но без подготовки можно получить 1.5раза сразу.


  1. denis_obrezkov
    07.07.2016 23:16

    Скажите, а с чего вы подавали сигнал?


    1. baghear
      07.07.2016 23:29

      На видео же видно, что с генератора сигналов.


  1. Moog_Prodigy
    07.07.2016 23:19

    Я думаю, менее чем на stm32f4 дрыгаться незачем. Это не в минус автору, это я со стороны пользователя. Почему?
    Обработка match каналов. Т.е. один канал в нынешние времена это слишком мало.
    Вычитание-сложение каналов. И прочие манипуляции.
    Как приводчик, осциллограф менее 3 каналов рассматриваю с подозрением. Но стоит отдать должное — на осцах с полосой 150 Мгц на двух канал видать больше, чем на 4-канальном nano quad. Хотя… и нано квад иногда при деле.
    Очень необходима кнопка скриншота куда-нибудь на флешку. Желательно с нумерацией, как на фотоаппаратах — 0001.jpg и все такое. Реализуется легко, суть: смотрим в одной точке блока, ага, такая кривая. В другой — другая. И так до сотни раз. Если блок стоит в плохо доступном месте, я сейчас делаю фото экрана осциллографа + вешаю поверх стикер с пояснением, либо зарисовкой точки схемы, где проводилось измерение. И уже потом, в теплом кабинете за чаем, я могу последовательно просмотреть все фото и понять, где что творится. Пока что сейчас без фотоаппарата никуда. А точку с нумерацией я бы мог запросто поставить на самой схеме устройства, и не пришлось бы потом рыться в куче фото. Ну, это как пользователь. Да уж, тут наверное придется свой осцилл сооружать…


    1. baghear
      07.07.2016 23:37

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


    1. assign
      08.07.2016 12:46

      Возможно получилось бы круче с F303/F373, они заточены под АЦП., или F4 с внешней микрухой АЦП.


  1. mmMike
    08.07.2016 06:38

    Хотя я много собираю разных конструкций на контроллерах (в основном STM32… нравятся и доступны), но мысль собирать осциллограф (изобретать велосипед) даже не приходила в голову.
    У меня есть DSO203 и я им вполне доволен. Он, как и остальные из линейки opensource и вполне доведен до ума.
    Предыдущий DSO..(одноканальный аналог Вашего. Хоть и меньше по размеру чем ваш и пр.) был признан "игрушкой" и после покупки DSO203 разобран на запчасти.


    В чем смысл изобретать велосипед? ну ладно… пусть для учебных целей…
    НО! в чем смысл доводить до платы железку с такими весьма скудными характеристиками?
    Одноканальный… странный выбор питания 9В… большие размеры… малый частотный диапазон… и т.д.


    1. baghear
      08.07.2016 10:45

      А почему бы и нет?
      Платы сейчас не роскошь, десяток двухсторонних стоил 25$.


      1. mmMike
        08.07.2016 11:07
        -2

        Я не про стоимость изготовления плат. А про факт оформления "в готовое изделие".
        Я конечно понимаю, что Вас, как у автора это выстраданное. Своя первая конструкция на ARM контроллере STM32 и т.д. и т.п.
        Сделали — замечательно. Опыт получили.
        Если разводка платы то же в рамках "поиграться" — то почему бы и нет. То же на пользу.


        Но, если с расчетом на "станет популярной и продаваемой"…


        Главное не скатится до уровня:


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

        А может не в троллях дело? Я бы то же такое не купил. Благо не первый осцил. пробник у меня и пользуюсь активно.


  1. dmitryrf
    08.07.2016 09:47

    Отличная история, спасибо!
    Возможно, вам будет интересна другая история — реверс осциллографа:
    http://blog.weinigel.se/2016/05/01/sds7102-hacking.html


    1. baghear
      08.07.2016 10:46

      Очень даже интересно, спасибо!


      1. microtrigger
        08.07.2016 21:38

        От меня тоже спасибо за ссылки на реверс, очень познавательно.


  1. zvic
    08.07.2016 19:59

    Именно сейчас занимаюсь сопряжением этого МК (STM32F103VET6) с таким же дисплеем (на базе SSD1289). Тоже планирую сделать с помощью FSMC/I8080.


    1. baghear
      08.07.2016 22:05
      +1

      Тут описывал как это сделать
      https://hubstub.ru/programming/61-podklyuchenie-tft-displeya-po-fsmc-k-stm32vet6-na-primere-ssd1289-ili9341.html


      1. zvic
        08.07.2016 22:17

        Спасибо большое!


  1. KbRadar
    13.07.2016 09:53

    Будут ли выложены исходники?


  1. baghear
    13.07.2016 12:43

    Нет.