Пятница, 29.03.2024, 04:08
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Каталог статей | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
Меню сайта

Категории раздела
Программирование микроконтроллеров AVR [6]
Программирование микроконтроллеров STM32 [1]
Программирование ПЛИС Altera [1]
Разное [1]
Статьи на различную тематику
Самодельные системы управления моделями [0]

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Программирование микроконтроллеров AVR

Генерация видеосигнала при помощи контроллеров AVR. Часть 2. Синхроимпульсы

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

Вспоминаем как выглядит сигнал строки изображения:


опишу чтобы было понятно о чем я говорю, сигнал во времени выглядит так:
- уровень синхроимпульса (0 вольт), 4 мкс
- уровень черного (0.3 вольта), 8 мкс
- изображение (импульсы от 0.3 вольта до 1 вольта), 52 мкс

общее время выдачи строки изображения 64 мкс

Изучение информации с многих сайтов говорит о том что если на телевизор подать правильно сгенерированную последовательность строчных импульсов мы получим на экране телевизора изображение стабильное по горизонтали, но нестабильное по вертикали (из-за того что нет КСИ)

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

пишем !

архив проекта можно скачать http://vg.ucoz.ru/tvformat/avrtv_test1.zip

Заливаем полученную прошивку в контроллер.

Подключаем к телевизору..
ИИИИИИИиииииииииии внимание на экран:


Как говорили классики: "И все таки оно работает!" :-)

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

Если вы считаете, что хорошо усвоили информацию которую только что прочитали, то измените программу таким образом чтобы получить на экране своего телевизора такую картинку:


программу которая это делает  я прикладывать не буду, но открою вам один секрет, разные телевизоры могут потребовать немного разного подхода в решении, но само решение лежит на поверхности, и думаю будет найдено вами за 5, максимум 15 минут...
Так что у вас появился маленький шанс немного себя похвалить (буквально чуть-чуть, поскольку задачка очень легкая), если получилось, то напишите в комментариях статьи за какой промежуток времени вам удалось этого добиться, только чур говорить правду ! :-)


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

в результате поиска в интернете описания формата кадрового синхроимпульса кадра я нашел следующее изображение http://vg.ucoz.ru/load/spravochnye_materialy/format_videosignala/signal_cherno_belogo_televidenija/7-1-0-19

Вверху показан сигнал уже известной нам строки, в принципе я обратил внимание на временные задержки, которые отличаются от уже опробованных нами:
- длительность ССИ - 4.7 мкс (у нас было 4 мкс)
- задержка перед выдачей изображения строки 5.8 мкс (у нас - 8 мкс)
- появилась задержка после выдачи строки изображения в 1.5 мкс (мы отдельно не выделяли)
- общая длительность строки осталась на уровне 64 мкс (как и у нас)

я выделил область изображения иллюстрирующую кадровый синхроимпульс http://vg.ucoz.ru/tvformat/ksi.gif

длительности синхроимпульсов указаны, однако не указаны длительности уровней черного между синхроимпульсами (на схеме обозначены "*1?" и "*2?")

в поисках этой информации я нашел ГОСТ советских времен в котором были описаны временные интервалы импульсов http://vg.ucoz.ru/load/spravochnye_materialy/format_videosignala/standart_sistema_veshhatelnogo_televidenija/7-1-0-21

на странице 3 указанного документа есть схема на которой указаны импульсы кадрового синхросигнала при помощи букв латинского алфавита, это l, m, n длительности соответственно.
на странице 5 указано:
l=m=n=2.5H, где H - это длительность строки в 64 мкс
таким образом l=m=n=160 мкс

теперь посчитаем длительности в пачке коротких импульсов синхронизации:
- количество импульсов = 5 шт.
- длительность импульса синхронизации - 2.35 мкс
общая длительность пачки 160 мкс
посчитаем длительность одной паузы между импульсами синхронизации:
(160 - 2.35 * 5) / 5= 29.65 мкс (на рисунке это длительность *1)


длительности в пачке длинных импульсов синхронизации:
- количество импульсов = 5 шт.
- длительность импульса синхронизации - 27.3 мкс
общая длительность пачки 160 мкс
посчитаем длительность одной паузы между импульсами синхронизации:
(160 - 27.3 * 5) / 5= 4.7 мкс (на рисунке это длительность *2)


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

возьмем строение кадрового сигнала из ГОСТа

И выпишем длительности импульсов которые нам предстоит генерировать
Номер строки видеосигнала
Напряжение на выходе, v.
Длительность состояния,  мкс
Название последовательности
Импульсы последовательности m
1
0
27.3
Длинный импульс
(q)

0.3
4.7
Пауза после длинного импульса
(*2)

0
27.3
Длинный импульс
(q)

0.3
4.7
Пауза после длинного импульса
(*2)
2
0
27.3
Длинный импульс
(q)

0.3
4.7
Пауза после длинного импульса
(*2)

0
27.3
Длинный импульс
(q)

0.3
4.7
Пауза после длинного импульса
(*2)
3
0
27.3
Длинный импульс
(q)

0.3
4.7
Пауза после длинного импульса
(*2)
Импульсы последовательности n

0
2.35Короткий импульс
(p)

0.3
29.65
Пауза после короткого импульса
(*1)
4
0
2.35
Короткий импульс
(p)

0.3
29.65
Пауза после короткого импульса
(*1)

0
2.35
Короткий импульс
(p)

0.3
29.65
Пауза после короткого импульса
(*1)
5
0
2.35
Короткий импульс
(p)

0.3
29.65
Пауза после короткого импульса
(*1)

0
2.35
Короткий импульс
(p)

0.3
29.65
Пауза после короткого импульса
(*1)
Пустые строки изображения
6
0
4.7
Строчный синхроимпульс

0.3
59.3
Пауза после импульса
последовательности из строчного синхроимпульса и паузы для 7 - 23 строк включительно аналогичны строке 6
Строки изображения
24
0
4.7
Строчный синхроимпульс

0.3
5.8
Пауза после синхроимпульса

0.3-1.0
53.5
Строка изображения
последовательности строк 24-310 включительно аналогичны строке 24
Импульсы последовательности l
Последовательность l полностью аналогична последовательности n
(короткие импульсы 2.35 мкс \ паузы 29.65 мкс)
Импульсы последовательности m
Аналогично той что была в начале кадра
Импульсы последовательности n
Последовательность n с длительностью паузы после последнего импульса на уровне 64-2.35=61.65 мкс
Пустые строки изображения
319-335
0
4.7
Строчный синхроимпульс

0.3
59.3
Пауза после синхроимпульса
Строки изображения
336-622
0
4.7
Строчный синхроимпульс

0.3
5.8
Пауза после синхроимпульса

0.3-1.0
53.5
Строка изображения
623
0
4.7
Строчный синхроимпульс

0.3
28.3
Пауза после синхроимпульса
Импульсы последовательности l
После импульсов последовательности l идет повторение кадра с импульсов последовательности m





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

Предлагаю следующую задачу:
используя данные таблицы сделать генератор синхросигналов и вывести на экран вертикальную полосу с 100ой по 200ую строку изображения.

У меня получилось следующее:


Надеюсь что у вас получиться примерно тоже самое, ну а для ленивых (или наоборот готовящихся к чему то более грандиозному чем написание тестовых программ) выкладываю проект который генерирует это изображение /tvformat/avrtv_test2.zip

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

К слову, на другом телевизоре (42" Philips) линия наклонена в другую сторону :-) так что истина где то посередине (то есть в полностью вертикальной линии) - осталось только написать код правильно (вернее быстро и правильно) генерирующий задержки.

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

Теперь самое время посмотреть внимательно на текст получившейся у нас программы (если вы конечно написали ее самостоятельно, а не использовали мой проект) - и увидеть что в большей части генераторы обоих полукадров практически не отличаются... А можно ли использовать только генератор одного полукадра ? Пробуем !

Начнем комментарий после генерации строк первого полукадра, в месте указанном на картинке ниже:

И закончим сразу после генерации изображения второго полукадра:


Далее, компилируем, и записываем в контроллер
Получаем на телевизоре


Изображение стабилизировано, нет дрожи по вертикали или по горизонтали... В программе мы генерируем синхроимпульсы только в одном месте (вначале).. Программа получилась намного проще чем avrtv_test2.
Опять наблюдаем некоторый залом вправо в верхней части нашей линии, и опять (вернее наверное СНОВА) не обращаем на это внимание, так как задержки генерим по прежнему при помощи функции delay_us().

В общем результат признаем положительным и допустимым к использованию наработанного опыта в дальнейшей разработке !

Программа avtv_test3 так же использовалась мною для проверок правильности задержек.

Чуть позже в одном из источников в интернете я нашел следующую схему генерации кадровых синхроимпульсов в ситуации когда полукадры одинаковы

Источник диаграммы http://www.batsocks.co.uk/readme/video_timing.htm

Обратите внимание на конец кадра, в строках  310-312 - не 5 коротких импульсов (как у нас), а 6 !
Модифицируйте код avrtv_test3 чтобы генерировалось 6 коротких импульсов и опробуйте на телевизоре ! (оставлю это вам на самостоятельную проработку, измените проект и сравните результаты работы avrtv_test3 до и после).

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

После проектов avrtv_test2 и avrtv_test3 генерация видео при помощи микроконтроллера кажется задачей тривиальной. Ну а как это окажется на самом деле я напишу в следующей части статьи:
 Генерация видеосигнала при помощи контроллеров AVR. Часть 3. Генерация синхроимпульсов на ассемблере
Категория: Программирование микроконтроллеров AVR | Добавил: ВитГо (01.09.2012)
Просмотров: 9719 | Теги: avr, Signal, видеосигнал, COMPOSITE, tv | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz