Сигналы vga на осциллографе

Обновлено: 06.07.2024

Если лень собрать два генератора пилообразного напряжения.

Дисклеймер

Это не обучающая статья, а отчет о проделанной работе вперемешку с заметками и потоком сознания по теме. Формат статьи был выбран из-за наличия разметки и возможности редактирования в любой момент.

Но я попробовал сделать по-другому.

Принцип работы

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

В VGA используется кодирование цвета по схеме RGB, передаются эти три значения в аналоговом виде по трем разным контактам. Один цветовой канал можно использовать для управления яркостью луча (осцилл всё равно монохромный), а через оставшиеся два выводить сигналы для горизонтальной и вертикальной развертки. Для этого нужно вывести на монитор картинку, где в каждом пикселе значение определенного цвета пропорционально координате положения пикселя по выбранной оси.
Пример преобразования координаты X в красный цвет:

Вывод растра через цветовые каналы VGA, изображение №1

К сожалению, разрядность цветовых каналов VGA всего 8 бит, поэтому разрешение картинки на осциллографе по вертикали во всех режимах будет максимум 256 точек.
Я по-быстрому накидал программку, которая по вышеописанному принципу преобразовывает исходное изображение, позволяет задать соответствие между осями и цветовыми каналами, а также выбрать цвет из исходной картинки для управления яркостью луча:

Вывод растра через цветовые каналы VGA, изображение №2

Еще в VGA есть сигналы горизонтальной (строчной, HSync) и вертикальной (кадровой, VSync) синхронизации, благодаря ним можно использовать встроенный генератор развертки осциллографа и синхронизовать его запуск с началом вывода строки или кадра соответственно. Встроенная развертка полностью аналоговая и очень плавная, это даст возможность получить почти любое разрешение по горизонтали.
Распиновка VGA разъема и временная диаграмма:

Кто может помочь, нужна осциллограмма VGA сигнала 640х480х60Гц по линиям VSYNC, HSYNC и любые из RGB.

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

На рисунке то, что есть сейчас. Должно быть пол экрана белое, пол экрана черное. Но фиг

Длительность вертикального синхроимпульса 64 мкс, горизонтального 4 мкс. Вроде все правильно делаю.
Схема: синхры напрямую с ножек МК, RGB через резистор. Может здесь проблема?

Duhas » 15 авг 2011, 10:00

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность.
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"

Strijar » 15 авг 2011, 10:06

HarryStar » 15 авг 2011, 10:13

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

2 Духас: На РГБ данные идут во время высокого состояния горизонтального синхроимпульса. Они аналоговые, так что как на картинке, так они у меня и идут. половина строчной развертки ргб в 1, половина в 0.

Duhas » 15 авг 2011, 10:17

мб есть некие пределы в аналоговом сигнале ? и просто 0 и 1 как черное и белое не воспринимается? «Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность.
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"

Romikgy » 15 авг 2011, 11:16

как я понял rgb это 0.7 вольт .

пик-пик амплитуда, размах (пик-пик, peak-to-peak amplitude, pp) — это разница между положительным и отрицательным пиками;

HarryStar » 15 авг 2011, 12:41

Эксперименты по VGA временно прекращаю, только-что сжег монитор. Хорошо что на работе.
Теперь он мигает постоянно от черного к серому, меню не показывает, на сигналы не реагирует и паленым запахло довольно сильно.

Обидно. Думал у LCD хорошая защита от неправильных сигналов. Хотя и сигналы то были нормальные.

Duhas » 15 авг 2011, 12:42

это он от удивления.. 640х480 не часто нынче увидишь на входе ) «Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность.
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"

HarryStar » 15 авг 2011, 13:18

Ну у меня как раз было через 560 Ом - с 75 Омами на входе RGB получается 75/(75+560)*5 = 0.6 Вольт

Добавлено спустя 33 минуты 1 секунду:
Вот такой сигнал спалил монитор

Переделал схему генерации сигнала, подогнал все более точно.
Кадровая была точно 60 Гц, Длина строчной развертки 31.6 мкс ( должна быть 31.77 ), ровно 525 строк в кадре, горизонтальный импульс 4 мкс, вертикальный 2 строки (63 мкс), сверху-снизу поля, слева-справа поля.

Не знаю, что могло вызвать такое.

Myp » 16 авг 2011, 09:08

нужно ждать бородатого дядьку Michael_K он умный, он скажет чо не так =)

ЗЫ
это у тебя из протеуса картинки?
а в реале чего там если осциллом ткнуть?

<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!

Michael_K » 16 авг 2011, 09:52

Добавлено спустя 5 минут 15 секунд:
Может быть земли сигнальные не подключили, а монитор "слишком правильный". был.

HarryStar » 16 авг 2011, 10:54

Осцила нету, был бы, было бы все проще, я бы с реальной видеокарты снял сигналы в соотв. разрешении и посмотрел бы что там. Звуковая карта не думаю что справится в качестве осциллографа на VGA сигнале.
Земельные сигналы я все соединил межу собой (R, G, B, Землю и экран) и подключил к земле МК.
Главное я 3 дня с этим проектом работаю, все было нормально, а тут просто добавил случайный сигнал на RGB (до этого там была 1 вертикальная полоса в пол-экрана, я подумал может она тусклая и я ее не вижу)

PS: Хорошо еще не дома на 40" телике стал пробовать, а на работе. Найду бесплатный CRT моник, продолжу эксперименты в этом направлении.

Эта статья рассказывает, как сгенерировать видеосигнал на FPGA, используя в качестве примера игру FizzBuzz. Генерировать видео оказалась проще, чем я ожидал — проще, чем предыдущая задача с последовательным выводом FizzBuzz на FPGA. Я немного увлёкся проектом, поэтому добавил анимацию, разноцветный текст и гигантские прыгающие слова на экране.



FizzBuzz на плате FPGA. Плата генерирует прямой видеосигнал VGA с анимацией слов “Fizz” и “Buzz”

Если Вы не знакомы с задачей FizzBuzz, то она заключается в написании программы, которая печатает числа от 1 до 100, где кратные трём заменяются словом Fizz, кратные пяти — словом Buzz, а кратные пятнадцати — FizzBuzz. Поскольку FizzBuzz реализуется в нескольких строчках кода, эту задачу дают на собеседованиях, чтобы отсеять совсем не умеющих программировать. Но на FPGA решение гораздо сложнее.

FPGA (программируемая пользователем вентильная матрица) — интересная микросхема. Она программируется на выполнение произвольной цифровой логики. Можно сконструировать сложную схему, не прокладывая физические каналы между отдельными вентилями и триггерами. Микросхема способна превратиться во что угодно, от логического анализатора до микропроцессора и видеогенератора. Для этого проекта я использовал плату Mojo FPGA (на фото).



Плата Mojo FPGA. Большой чип на плате — это Spartan 6 FPGA

Для FPGA существует определённая кривая обучаемости, потому что здесь вы разрабатываете схемы, а не пишете программное обеспечение, которое работает на процессоре. Но если вы с помощью FPGA можете заставить мигать пять светодиодов, то в целом готовы реализовать выдачу видеосигнала VGA. Формат видео VGA намного проще, чем я ожидал: всего три сигнала для пикселей (красный, зелёный и синий) и два сигнала для горизонтальной и вертикальной синхронизации.

Основная идея в том, чтобы использовать два счётчика: один для пикселей по горизонтали, а второй для вертикальных линий. В каждой точке экрана по этим координатам генерируется нужный цвет пикселя. Кроме того, генерируются импульсы горизонтальной и вертикальной синхронизации, когда счётчики находятся в соответствующей позиции. Я использовал базовое разрешение VGA 640×480 2 , где нужно вести отсчёт до 800 и 525 1 11 . По горизонтали в каждой линии 800 пикселей: 640 видимых, 16 пустых, 96 на горизонтальную синхронизацию и ещё 48 пустых пикселей. (Такие странные параметры используются по историческим причинам). Между тем, вертикальный счётчик должен отсчитывать 525 линий: 480 линий изображения, 10 пустых, 2 линии вертикальной синхронизации и ещё 33 пустые.

Собрав всё вместе, я разработал модуль vga (исходный код) для генерации сигналов VGA. Код написан на Verilog, это стандартный язык для FPGA. Не буду подробно объяснять Verilog: надеюсь, достаточно показать, как он работает. В приведённом ниже коде реализованы счётчики x и y . Первая строка указывает, что действие предпринято на положительном краю каждого (50 МГц) тактового сигнала. Следующая строка переключает clk25 на каждом такте, генерируя сигнал 25 МГц. (Путаница только в том, что <= указывает на присвоение, а не сравнение). Этот код увеличивает счетчик x с 0 до 799. В конце каждой строки y увеличивается с 0 до 524. Таким образом код генерирует необходимые счётчики пикселей и строк.


Хотя язык Verilog похож на обычный язык программирования, он работает совсем иначе. Этот код не генерирует инструкции, которые последовательно выполняются процессором, а создаёт схему в чипе FPGA. Он создаёт регистры из триггеров для clk25 , x и y . Для увеличения x и y генерируются двоичные сумматоры. Операторы if превращаются в логические вентили компараторов, контролирующих регистры. Вся схема работает параллельно, срабатывая на тактовые импульсы 50 МГц. Для понимания FPGA нужно выйти из последовательного программного мышления и думать о базовых схемах.

Возвращаясь к модулю vga , код ниже генерирует сигналы горизонтальной и вертикальной синхронизации по счётчикам x и y . Кроме того, флаг valid указывает на область 640×480, где должен генерироваться видеосигнал; за пределами этой области экран должен быть пустым. Как и прежде, эти операторы генерируют логические элементы для проверки условий, а не создают код.


«Полезная» часть сигнала VGA — это красные, зелёные и синие пиксельные сигналы, которые управляют тем, что появляется на экране. Чтобы проверить схему, я написал несколько строк для активации r , g и b в разных областях экрана, заглушив всё за пределами видимой ('valid') области 3 (вопросительный знак является тернарным условным оператором, как в Java).


Я запустил код на плате FPGA — и ничего не произошло. Монитор остался чёрным. Что же пошло не так? К счастью, через пару секунд 4 монитор завершил нормальный цикл запуска и отобразил выдачу. Меня приятно удивило, что выдача VGA сработала с первого раза, пусть это и произвольные цветные блоки. 5



Моя первая программа VGA генерирует произвольные цветные блоки на экране. Не очень осмысленно, зато всё работает нормально

Следующий шаг — отображение текстовых символов на экране. Я реализовал модуль генерации пикселей для символов 8×8. Вместо поддержки полного набора символов ASCII здесь только символы, необходимые для FizzBuzz: от 0 до 9, “B”, “F”, “i”, “u”, “z” и пробел. Удобно, что весь набор уместился в 16 символов, то есть в четырёхбитное значение.

Таким образом, модуль получает четырёхбитный код символа и трёхбитный номер строки (для восьми строк на каждый символ) — и выводит восемь пикселей для данной строки символа. Весь код (ниже его фрагмент, а полный код здесь) — это просто большой оператор case для вывода соответствующих битов. 6 По сути этот код компилируется в ПЗУ, которое реализуется в FPGA таблицами поиска.


Я обновил программу верхнего уровня для использования младших бит координаты x для символа и пиксельного индекса, а также младших бит координаты y для индекса строк. Результаты показаны внизу. Текст в красном поле увеличен, чтобы можно было разглядеть символы.



Моя первая реализация текста (увеличенная область в красном контуре). Из-за ошибки все символы идут задом наперёд

Наладив отображение символов, нужно получить правильные символы для вывода FizzBuzz. Алгоритм такой же, как в предыдущей программе, так что здесь приведу только основные моменты.

Преобразование чисел от 1 до 100 в символы тривиально реализовать на микропроцессоре, но сложнее в цифровой логике, потому что здесь нет встроенной операции деления. Деление на 10 и 100 требует много логических элементов. Я решил использовать двоично-десятичный счетчик (BCD) с отдельными четырёхбитными счётчиками для каждого из разрядов.

Следующая задача — проверить кратность 3 и 5. Как и простое деление, деление с остатком легко реализовать на микропроцессоре, но трудно в цифровой логике. Вместо вычисления значений я сделал счётчики для остатков от деления на 3 и на 5. Например, деление с остатком на три просто отсчитывает 0, 1, 2, 0, 1, 2… (другие варианты см. в примечаниях 7 ).

Строка выдачи FizzBuzz содержит до восьми символов. Модуль “fizzbuzz” (исходный код) выводит соответствующие восемь четырёхбитных символов в виде 32-битной переменной line . (Нормальный способ генерировать видео — хранить все символы или пиксели экрана в видеопамяти, но я решил всё генерировать динамически). Оператор if (его фрагмент приведён ниже) обновляет биты line , возвращая “Fizz“, “Buzz“, “FizzBuzz“ или число, в зависимости от обстоятельств.


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



Изменение символа в каждой строке выдаёт таинственные иероглифы, а не нужный результат

Ошибка в том, что я переходил к следующему значению FizzBuzz после каждой строки пикселей вместо того, чтобы ждать 8 строк отрисовки символа целиком. Таким образом, каждый отображаемый символ состоял из срезов восьми разных символов. Увеличение счетчика FizzBuzz каждые 8 строк исправляет проблему, как показано ниже. (Отладка кода VGA намного проще, чем другие задачи на FPGA, потому что проблемы сразу видны на экране. Не нужно возиться с осциллографом, пытаясь понять, что пошло не так).



Выдача FizzBuzz на мониторе VGA

Теперь на мониторе появилась выдача FizzBuzz, но статический дисплей — это скучно. Изменение цвета переднего плана и фона для каждой строки делается простым — используем некоторые биты значения y для красного, зелёного и синего цветов. Так мы получаем цветной текст в стиле 80-х.



Если цвет переднего плана и фона зависит от линии, то текст выглядит интереснее

Затем я добавил примитивную анимацию. Первым делом нужно добавить выдачу модуля vga для индикации перерисовки экрана, это новое поле для каждой 1/60 секунды. Я использовал это для динамического изменения цветов. (Совет: не меняйте цвет 60 раз в секунду, если не хотите вызвать головную боль; используйте счётчик).

Пробовать разные графические эффекты весело и захватывающе, поскольку результат сразу виден. Я запустил “Fizz” и “Buzz” с радужным следом на экране (в духе Nyan Cat). Для этого я изменил начальные позиции символов в соответствии со счётчиком. Для эффекта радуги на символах выбраны цвета по номерам строк (поэтому каждая строка символа может быть разного цвета) и добавлен радужный след.


Конечный результат крупным планом

Напоследок я добавил ещё один эффект — гигантские слова “Fizz” и “Buzz”, отскакивающие от краёв экрана. Эффект основан на отскакивании невидимого контура (как у FPGA Pong), внутри которого находится слово 8 . Переменная dx отслеживает направление X, а dy — направление Y. На каждом новом экране (т. е. 60 раз в секунду) координаты X и Y контура увеличиваются или уменьшаются на основе переменных направления. Если контур достигает правого или левого края, dx переключается. Аналогично, dy переключается, если контур достиг верхнего или нижнего края. Затем внутри контура рисуется большой текст с помощью другого экземпляра генератора символов, описанного ранее. Слово увеличивается в 8 раз, отбрасывая три младших бита от координаты. Вероятно, вы уже устали от кода Verilog, так что не буду здесь показывать код, но он опубликован на GitHub. Окончательный результат — в видеоролике.

Детали аппаратной реализации

В этом проекте я использовал простую плату разработки Mojo V3 FPGA для начинающих. На ней установлен FPGA семейства Xilinx Spartan 6. Хотя это один из самых маленьких FPGA, но у него 9000 логических ячеек и 11 000 триггеров — так что малыш на многое способен. (Для других вариантов см. список дешёвых плат FPGA).



Подключение платы FPGA к VGA почти тривиально: всего три резистора 270Ω. Макетная плата просто прикрепляет кабель к колодке контактов

Если хотите использовать VGA, проще взять плату разработки с разъёмом VGA. Но если его нет (например, как у Mojo), всё равно подключить VGA не станет проблемой. Просто разместите резисторы 270Ω между красным, зелёным и голубым выходными контактами FPGA и соединением VGA. Сигналы горизонтальной и вертикальной синхронизации можно получать напрямую с FPGA. 9

Для написания и синтеза кода Verilog я использовал среду разработки Xilinx (называется ISE). Подробные сведения о написании кода и его загрузке на плату FPGA см. в моей предыдущей статье. Для указания конкретных физических контактов FPGA я добавил несколько строк в конфигурационный файл mojo.ucf . Здесь красный вывод pin_r соотносится со штырьковым контактом 50 и так далее.


Вывод с FPGA на VGA — распространённое явление, поэтому можете найти в Сети ряд таких проектов, как FPGA Pong, 24-битный цвет с чипа DAC, плата Basys 3 и вывод изображений. Если нужна схема, см. эту страницу. В книге «Программирование FPGA» данной теме посвящена целая глава.

Формат VGA может показаться немного странным, но если посмотреть на историю телевидения и ЭЛТ (электронно-лучевая трубка), то всё становится понятно. В ЭЛТ пучок электронов проходит по экрану, подсвечивая люминофорное покрытие для отображения картинки. Сканирование проходит в растровом массиве: луч сканирует экран слева направо, а затем импульс горизонтальной синхронизации заставляет его быстро переместиться влево для горизонтального обратного хода развёртки. Процесс повторяется построчно до тех пор, пока в нижней части экрана импульс вертикальной синхронизации на запустит вертикальный обратный ход развёртки — и луч возвращается вверх. При горизонтальном и вертикальном ходе развёртки луч заглушается, поэтому обратный ход не рисует линии на экране. На схеме ниже показан шаблон растрового сканирования.



Шаблон растрового сканирования в ЭЛТ (Википедия)

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

В 1953 году появился стандарт цветного телевидения NTSC. 10 Однако VGA гораздо проще, чем NTSC, так как использует пять проводов для синхронизации и сигналов цветов, а не втискивает всё в один сигнал со сложным кодированием. Одной из странных особенностей NTSC, которая переносится на VGA, — то, что частота обновления экрана не заявленные 60 герц, а в реальности 59,94 Гц. 11

След осциллографа ниже показывает сигнал VGA для двух строк. Импульсы горизонтальной синхронизации (жёлтым) указывают на начало каждой строки. Короткие красные, зелёные и синие импульсы в начале строки — это белые пиксели из числа FizzBuzz. Красный сигнал посередине линии — плавающее красное слово “Buzz”.



След осциллографа сигналов VGA показывает красный, зелёный и голубой сигналы, а также горизонтальную синхронизацию

Вывод с FPGA на VGA оказалась намного проще, чем я ожидал, но меня определённо не возьмут на работу, если зададут задачу FizzBuzz на собеседовании по FPGA! Если интересуют FPGA, настоятельно рекомендую поиграться с видеовыходом. Это не намного сложнее, чем мигание светодиодом, зато гораздо полезнее. Генерация видеосигнала также намного интереснее, чем отладка на осциллографе — вы сразу видите результат на экране. И даже если что-то идёт не так, всё равно результат часто выходит весёлый.

2. Подробные тайминги для десятков стандартных видеоразрешений см. здесь. На стр. 17 указано разрешение 640×480 60 Гц, которое я использовал. [вернуться]

3. Когда я забыл очистить пиксели за пределами допустимой области экрана, монитор всё равно показывал изображение, но очень тусклое, потому что монитор запутался, какому напряжению соответствует наш «тёмный». Это просто на случай, если вы обнаружите, что ваш дисплей внезапно потемнел без видимых причин. [вернуться]

4. Просто удивительно, что приходится делать ЖК-дисплею, чтобы отобразить изображение VGA, предназначенное для ЭЛТ. Дисплей должен изучить входящий сигнал и «угадать», на каком разрешении идёт видео с компьютера. Затем нужно пересэмплировать видеосигнал в соответствии с разрешением ЖК-панели. Наконец, новые данные о пикселях отправляются на ЖК-дисплей. [вернуться]

5. По какой-то причине выдача смещена вниз примерно на 25 пикселей. Она отлично отображалась на другом мониторе, поэтому я не уверен, то ли что-то с выравниванием на моём мониторе, то ли у меня ошибка. Это можно было настроить, задержав импульс вертикальной синхронизации на 25 строк. [вернуться]

6. Было бы утомительно вводить весь код для генерации символов, поэтому я написал программу на Питоне для генерации кода Verilog из файла шрифта. Оригинальный шрифт здесь. [вернуться]

8. Большие плавающие слова, по сути, представляют собой спрайты — растровые изображения, которые можно произвольно расположить на экране. Спрайты были популярны в видеоиграх и на компьютерах 70-х и начала 80-х годов, когда появились Pacman, Atari и Commodore 64. Спрайты позволяют выполнять анимацию на медленных процессорах. Вместо перемещения всех пикселей в памяти процессор просто обновляет координаты спрайта. Код верхнего уровня (исходный код) связывает воедино части и объединяет всё на экране: текст, радужный след, гигантское слово “Fizz” (в радужном узоре) и гигантское “Buzz” (красным). [вернуться]

9. Чтобы подключить монитор VGA, я разрезал кабель VGA пополам и подключил его провода к плате FPGA, использовав кабель из старого проекта для чтения данных с монитора при помощи I2C. Лучше не применяйте такой подход: малюсенькие проводки сложно припаять и они легко ломаются. Лучше используйте обычный разъём VGA. Интерфейс — это просто три резистора 270Ω, получающие правильное напряжение для красного, зелёного и синего сигнала. Можете использовать больше резисторов для дополнительных цветов. Так вы по сути сконструируете двухбитные (или больше) конвертеры ЦАП. [вернуться]

10. Стандарт NTSC очень умно вводит поддержку цвета, оставаясь совместимым с чёрно-белыми телевизорами. Однако его очень трудно понять. Меня напугали разговоры о кодировании цвета фазой и квадратурой с цветным поднесущими и сигналом цветовой синхронизации. Здесь кодирование намного сложнее, чем у VGA, потому что NTSC совмещает цвет и синхронизацию в одном канале передачи. [вернуться]

11. Хотя для мониторов заявляется частота обновления 60 Гц, фактическое значение составляет 59,94 Гц. Эта странная частота восходит к истокам цветного телевидения. Частоту обновления экрана 60 Гц выбрали, чтобы нивелировать помехи от линии электропередачи. Но чтобы предотвратить интерференцию несущей частоты для цвета с частотой звука, пришлось скорректировать частоты, в результате чего частоту обновления экрана установили на 59,94 Герц. Это почти похоже на нумерологию, но выбор частоты подробно объясняется в этом видео и в Википедии. [вернуться]

Любой радиолюбитель знает, что такое осциллограф, и хотел бы его иметь в своей домашней лаборатории. Однако стоимость промышленных приборов далеко не всегда позволяет его приобрести для домашнего использования. Начинающие радиолюбители, покрывая потребность в хоть каком-то осциллографе, используют недорогие наборы или готовые конструкции, например, DSO-138 или DSO-150, собранные на микроконтроллере (МК) STM32F103. Но экран диагональю 2,4" и очень посредственные характеристики этих изделий не сильно вдохновляют.

Как-то на просторах Интернета я встретил интересное техническое решение вывода на экран изображения [1] также на основе МК STM32F103, и тогда возникла мысль, а что, если это решение "скрестить" с осциллографом?

Развитием этой идеи явилась описываемая ниже приставка к монитору или телевизору с VGA-входом, которую можно использовать как в повседневной радиолюбительской практике, так и в качестве демонстрационного осциллографа в учебных заведениях, подключая её к проектору и выводя изображение на большой экран для всей аудитории. Ещё один вариант применения - совместное использование с приставкой к осциллографу для измерения АЧХ, например, как в [2].

Но МК STM32F103 имеет очень ограниченный объём оперативной памяти и не самый быстрый АЦП, необходимый для осциллографа, вследствие чего было принято решение использовать более продвинутый МК STM32F411CE, такой, как на отладочной плате Black Pill V2.0 (рис. 1). Ко всему прочему, он не требует для своего программирования специальных программаторов.

Рис. 1. Отладочная плата Black Pill V2.0

Для осциллографической приставки был выбран режим VGA 640x480 с частотой кадров 60 Гц, что соответствует частоте следования видеоданных 25 МГц. Для вывода изображения на экран использовано удвоение пиксела по горизонтали и вертикали, что соответствует 320x240 точкам графического изображения. Рабочее поле для вывода осциллограмм - 300x200 точек.

Разрешение экрана сильно связано с тактовой частотой МК 100 МГц (100/4 = 25 МГц, частота видеоданных) и с тактовой частотой АЦП, которая в данном случае выбрана 50 МГц. Она хоть и выше максимально заявленной в 36 МГц, спокойно воспринимается самим АЦП. Для увеличения частоты выборок аЦп работает в восьмибитном режиме, что даёт немного менее 5 млн выборок в секунду. У выбранного МК только один АЦП, поэтому для двухканального варианта приставки используется чередование опроса двух каналов. На практике это позволяет спокойно рассматривать сигналы частотой до 500 кГц в одноканальном и до 250 кГц в двухканальном режимах работы, но можно увидеть наличие сигнала и оценить его частоту в два раза выше.

Рис. 2. Схема приставки

Схема приставки показана на рис. 2. Её питание осуществляется от USB-порта (телевизора) монитора, к которому она подключается, или любого другого источника питания напряжением 5 В и током до 500 мА (ЗУ для сотового телефона). Потребление приставки не превышает 150 мА.

Аналоговая часть собрана на ОУ DA1 (DA2), коммутаторе на микросхеме DD1 (DD2), который обеспечивает переключение чувствительности усилителя вертикального отклонения. Переключение режимов, закрытый (AC) или открытый (DC), осуществляется с помощью оптопары U1 (U2).

Одновременно может обрабатываться один канал или два канала поочерёдно, синхронизация развёртки возможна от любого канала по фронту или спаду сигнала, в том числе и в режиме ожидания одиночного срабатывания. Имеются настройки уровня срабатывания триггера синхронизации и линии нуля каждого канала. В каждом канале выводится информация о частоте сигнала и, в зависимости от типа входа AC или DC, о размахе сигнала (Vpp) или среднем напряжении (Vavr). Реализована возможность выключить показ каждого канала и "заморозить" экран (режим HOLD).

Основные технические параметры

Разрядность АЦП, бит . 8

Частота дискретизации, миллионов выборок в секунду . 4,5

Развёртка по времени, мкс/дел. 1, 2,5, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000 Усилитель вертикального отклонения, В/дел 0,25, 0,5, 1, 2, 4

Частота тестового сигнала, кГц . 0,1, 0,5, 1,5, 10, 100, 250 и выключен

Основным является узел центрального процессора, весь функционал приставки реализован программно. Запрограммировав модуль А2 и подключив к приставке кнопки управления и VGA-монитор, можно проверить работу всей приставки, подавая на вход сигналы в интервале от 0 до 3,3 В. Узлы аналоговой части, его питания и гальванической развязки могут быть видоизменены или даже исключены в соответствии с конкретными требованиями и ограничениями. Гальваническая развязка нужна для защиты подключённого монитора при проведении измерений в цепях под высоким напряжением. Прототип приставки у меня больше года проработал без неё, и ни один монитор не пострадал. При выборе схемы аналоговой части я исходил из её максимальной простоты, уменьшения числа применяемых номиналов и распространённости элементной базы. Для разрядности АЦП в 8 бит этого достаточно, но при увеличении разрядности до 10 или 12 бит аналоговую часть нужно пересмотреть и выполнить, например, как в [3].

Рис. 3. Топология платы

Рис. 4. Размещение элементов на плате (по клику крупно)

Рис. 5. Р азмещение элементов на плате (по клику крупно)

Конструкция, детали и возможные замены. Для приставки была разработана односторонняя печатная плата размерами 117x72 мм из стеклотекстолита толщиной 1,5. 2 мм, которую можно изготовить методом ЛУТ. Топология платы показана на рис. 3 , а размещение элементов на ней - на рис. 4 и рис. 5. На рис. 6 и рис. 7 показана смонтированная плата приставки. На последнем рисунке можно заметить дополнительные элементы, установленные с помощью навесного мон-тажа, их установка на печатную плату уже предусмотрена в её топологии.

Рис. 6. Смонтированная плата приставки

Рис.7. С монтированная плата приставки

Автор: В. Попов, г. Ростов-на-Дону

Мнения читателей

Нет комментариев. Ваш комментарий будет первый.

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


Отбросим I2C и остаётся всего несколько выводов. Все земли можно соединить вместе, в итоге будет 3 цвета RGB, на эти выводы подаётся аналоговое напряжение от 0 до 0.7 В, чем больше напряжение на цветовом входе тем "насыщеннее" данный цвет. 0.7 В на всех 3 выводах дадут самый яркий белый цвет на который способен монитор. Таким образом можно получить практически любой цвет смешиванием 3-ёх составляющих. Для простоты я буду подавать на каждый из выводов либо 0 либо 0.7 В. Если хочется большого разнообразия цветов, нужно использовать преобразователи из цифрового кода в аналоговое напряжение ЦАП. Его можно составить самому с помощью резисторной матрицы. Либо достать специальную микросхему, к примеру: AD664

На выводах вертикальной и горизонтальной синхронизации действуют уровни ТТЛ сигналов.
- Уровень логического нуля, не более +0,8 В
- Уровень логической единицы, не менее +2,4 В
Вообщем они стабильно работают с МК при 3.3 В и 5 В.

Остаётся узнать в какие моменты подавать единички и нолики на эти выводы.

Разрешение изображения и частота обновления определяется интервалами импульсов синхронизации. Во время синхроимпульсов на RGB выводах, должно быть 0 В.

Видео данные 1 строки - горизонтальный синхро импульс - видео данные 2-ой строки - горизонтальный синхро импульс - видео данные 3-ей строки - ********************* - рисуем последнюю строку - большой вертикальный синхроимпульс (вместе с горизонтальным) - Всё по новой.


Рис. 6 Временные диаграммы сигналов


Рис.7 Отображение синхроимпульсов

Рассмотрим параметры для разрешения 640 x 480 @ 60 Гц
Частота обновления кадров 60 Гц
Вертикальное обновление 31.469 кГц
Частота пикселей 25.175 МГц

Таблица 3 временные параметры для горизонтальной линии

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

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


Рис. 8 Экран с зонами синхронизации (Blanking Time)

Легче рассчитать и реализовать время 1 пикселя и затем всё подстраивать под него, иногда указывается просто частота пикселей и остальные значения в пикселях.

В принципе это всё что ннеобходимо знать чтобы рисовать на VGA мониторе, осталось запрограммировать (или любым другим способом) цифровое устройство и попытаться вывести изображение.

Телевизор работает почти также, но там только "1 провод", значит все сигналы соединены вместе, если цвет не так важен, то принцип тот же.

Попробуем вывести изображение и посмотреть на осцилограмму сигнала.
У меня есть готовая тестовая программа для ПЛИС отсюда которая выводит данное изображение:


Рис,9 Полученное изображение на мониторе

Рассмотрим осцилограмму. Сверху вниз по порядку идут: Красный, Зелёный, Синий, Горизонтальная синхронизация, Вертикальная синхронизация.


Рис. 10 Осцилограмма сигналов полученного изображения
Здесь отображен 1 кадр, можно догадаться как будет выглядеть изображение, т.к. каждая полоса состоит из имульсов (если приблизить там есть зоны где постоянно 1, но не длинной во всю линию), то не будет одноцветных линий. Если разбить сигналы на столбцы, видно что есть линии на которых промежутки только красного либо зелёного цветов.

Используемые мной значения:
Весь кадр (O) - 16.69284 мс
Ширина вертикального синхроимпульса (P) - 64.08 мкс
1 строка (A) - 31.9176 мкс
Ширина горизонтального синхроимпульса (B) - 3.84 мкс
Частота пикселей - 25 МГц

Читайте также: