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

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

Наш опрос
Есть ли у вас модели самолетов с убирающимися шасси ?
Всего ответов: 22

Статистика

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

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz

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

    Генерация видеосигнала при помощи контроллеров AVR. Часть 1. Аппаратная подготовка.


    Возможность генерации видео при помощи микроконтроллеров avr заинтересовала меня с полгода назад. Потратив совсем немного времени на поиски в интернете я нашел достаточно большое количество проектов различных авторов позволяющих генерировать видеосигнал.
    Несмотря на достаточно большое количество конструкций в глаза бросались два основных ограничения подобных проектов:
    Первое, вывод только черно-белого изображения, для цветного у контроллеров AVR или PIC просто не хватает быстродействия.
    Второе,  низкое разрешение экрана, на уровне 160х100 точек - что конечно очень и очень мало для генерации на экране чего нибудь содержательного.. Это ограничение исходило из низкого быстродействия используемых микроконтроллеров.
    Например, тактовая частота микроконтроллера ATMEGA32, без разгона, 16 мгц. Микроконтроллер на языке ассемблера выполняет операции за 1-5 тактов, нужные нам операции для генерации видео это загрузка регистров, сдвиг, выдача бита в порт ввода\вывода занимают 1 такт, различные операторы переходов (для организации циклов и ветвлений) 2 такта.
    Таким образом реальные возможности микроконтроллера по генерации видеосигнала фактически подходили только для генерации изображения по качеству намного хуже какого нить давно забытого многими ZX-Spectrum...
    Причем, низкое разрешение экрана - это ограничение не только быстродействия, но и зачастую объема памяти ОЗУ в микроконтроллерах: например, такой контроллер как ATMEGA16 имеет на борту всего 1 кб оперативной памяти. Если принять что один бит ОЗУ соответствует одному пикселу изображения, то максимум который мы сможем получить 1 кб * 8 бит в байте = 8192 пиксела изображения на экране...
    Выше я указал разрешение 160 на 100 точек, это 16000 пикселов, для хранения которых нужно 16000 пикселов \ 8 бит = 2000 байт ОЗУ (уже видно что на ATMEGA16 графические изображения без ухищрений не получить никак - просто нет памяти !)

    Эти ограничения немного удручали и явно не побуждали к каким-то действиям..

    Но в поиске мне повезло и я набрел на ресурс http://vga-avr.narod.ru/main_rus.html в котором подчерпнул идею как можно ускорить выдачу изображения на телевизор, с этого момента идея генерации видеосигнала силами AVR микроконтроллера завладела моей головой :-)

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

    Неплохо о видеосигнале написал Rickard Gunee в статье "How to generate video signals in real-time using a PIC16F84". Данная статья есть в переводе с английского, с различными сокращениями. Я вряд ли напишу о видеосигнале лучше (вернее подобное наверное напишу, но вот иллюстрации скорее всего будут намного хуже), поэтому предлагаю Вам фрагмент этой статьи:

    ---------------------------------------- начало вложенного фрагмента статьи --------------
    ---------------------------------

    Как работает стандартный телевизор.

    В стандартном телевизоре используется вакуумная труба, которая имеет экран, покрытый слоем люминофора и электронную пушку, которая излучает электроны в направлении экрана. В момент удара электрона об экран и в течении некоторого времени после удара в месте удара люминофорный слой излучает свет. Траекторию электронного потока, излучаемого пушкой, можно изменить с помощью магнитного поля и тогда электроны будут ударяться в другую точку экрана. Используя такое управление можно рисовать горизонтальные линии по всему экрану. При изменении интенсивности электронного луча изменяется яркость свечения, таким образом можно получить на экране изображение. В системе PAL экран перерисовывается 25 раз в секунду. Чтобы уменьшить мерцание экрана при обновлении картинки, сначала рисуются все нечетные, а потом все четные линии. Поэтому картинка практически обновляется 50 раз в секунду. Для того чтобы получить цветное изображение, необходимо чтобы каждая точка экрана состояла из трех цветов: красного, зеленого и синего. Здесь мы будим рассматривать только черно-белое телевидение, так как только его можно получить в реальном времени с помощью PIC16F84.
    .
    Электронный луч рисует изображение.
    Две части изображения образуют одно сплошное.

    Различные телевизионные стандарты.

    Существуют три основных телевизионных стандарта: NTSC, SECAM и PAL. NTSC ( National Television System Committe ) – это американский стандарт. Он имеет 525 строк и частоту обновления кадров 30 Гц. SECAM ( Sequentil Color And Memory ) - французский стандарт и PAL ( Phase Alternating Lines ) имеют 625 строк в кадре при частоте кадров 25 Гц. Кроме различия кадровой и строчной частот эти стандарты отличаются способом кодирования цветного сигнала. Далее мы будим рассматривать стандарт PAL.


    Информация в видеосигнале.

    Точки разной яркости образуют на экране изображение. Когда электронный луч проходит по экрану, его интенсивность изменяется за счет изменения уровня видеосигнала. Но в этом сигнале нет информации о том, в какой части экрана находится в настоящее время луч. Для решения этой проблемы используется синхроимпульс, который передается в начале каждой строки. Синхроимпульс говорит телеприемнику, что текущая строка закончилась и необходимо перевести луч вниз, в начало следующей строки ( это похоже на нажатие кнопки 'Enter' на клавиатуре когда Вы набираете текст на компьютере ). Телеприемник должен также знать, когда начинается новый кадр. Об этом сообщает специальная комбинация синхроимпульсов ( как функция 'Новый документ' при написании текста с помощью компьютера ). При обновлении кадра 25 раз в секунду изображение будит заметно мерцать, поэтому сначала рисуются все нечетные, а потом все четные линии. За счет этого число кадров в секунду увеличивается до 50, и изображение становится более качественным. Информация о четности/нечетности строки передается в комбинации вертикальных синхроимпульсов. Амплитуда видеосигнала изменяется в пределах от 0 до 1В. Уровень 0,3В соответствует черному цвету, а 1В – белому (яркость серого изменяется между этими значениями ). Уровень 0В соответствует синхроимпульсу.


    Строка видеосигнала.

    Изображение разделено на строки. Каждая строка имеет длительность 64 мкс. В первые 4 мкс передается строчный синхроимпульс. Это производится переводом уровня сигнала в 0 для того, чтобы сказать телеприемнику, что началась новая строка. Старые телевизоры были очень медленными, после получения синхроимпульса им требовалось 8 мкс для перевода электронного луча в начало следующей строки. В течении этого времени сигнал поддерживается на уровне черного. В оставшиеся 52 мкс передаются данные изображения. Изображение рисуется слева направо с яркостью, соответствующей уровню видеосигнала. Черный цвет соответствует уровню 0,3В, и с увеличением уровня видеосигнала увеличивается яркость. Максимум яркости достигается при уровне видеосигнала 1В ( белый цвет ). На рисунке показана осциллограмма строки видеосигнала.




    Осциллограмма строки видеосигнала.

    Объединение строк вместе в изображение.


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


    Осциллограмма нескольких строк видеосигнала.

    Вертикальная синхронизация.

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

    Здесь показано, чем отличаются вертикальные синхроимпульсы в разных полукадрах. Уровень напряжения изменяется от 0 до 0,3 В. Цифры указывают номер строки.

    ----------------------------- конец цитируемого фрагмента статьи  ----------------------------------

    Давайте прервемся на секунду, и
    отметим себе важную информацию по "железной" реализации:

    наше устройство должно генерировать минимум 3 уровня сигнала на выходе для подключения телевизора:
    - 0 вольт - это уровень синхроимпульсов
    - 0.3 вольта - это уровень "черного", при данном сигнале телевизор рисует черным
    - 1 вольт - это уровень "белого", при данном сигнале телевизор рисует изображение белым

    в принципе уровень белого не обязательно должен равняться 1 вольту, можно и 0.7 и 0.8 - просто изображение будет чуть "серее"

    теперь вернемся в нашу статью....

    ----------------------------------------------- начало вложенного фрагмента статьи ----------------------------------------

    Схемное решение.

    Для генерации видеосигнала необходима некая схема, способная создавать сигналы с амплитудой напряжения от 0 до 1В. Чтобы создать изображение Вам необходимо как минимум три уровня сигнала. Телевизор должен получать уровень черного и уровень синхросигнала для того, чтобы синхронизировать изображение. Если Вы хотите большего, чем просто черный экран, Вам понадобится некоторый уровень серого или белого. Для получения трех необходимых уровней аналогового сигнала требуется два бита данных цифрового сигнала. Стандартное входное сопротивление видеовхода телевизора – 75 Ом. Используя два резистора и два выхода порта микроконтроллера можно создать требуемые уровни напряжения.


    При соединении обоих выходов D0 и D1 с землей, напряжение на видеовходе телевизора будит равно 0, что соответствует синхроуровню.


    Выход D1 соединен с землей, а выход D0 - с +5В. В этом случае резистор 450 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 900 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,33В, что очень близко к уровню черного. (Истинный уровень черного 0,3В.)


    Выход D0 соединен с землей, а выход D1 - с +5В. В этом случае резистор 900 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 450 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,67В. Это уровень серого.


    Оба выхода D0 и D1 соединены с +5В. В этом случае резисторы 900 Ом и 450 Ом включены параллельно, а 75 Ом-ное сопротивление видеовхода телевизора, подключено к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 1В. Это уровень белого.

    Эта схема позволяет получить четыре уровня напряжения. На рисунках представлены эквивалентные схемы четырех различных уровней напряжения и показано, каким образом они получаются. Номинал резисторов не критичен. Вы можете использовать большие, стандартные значения: 470 Ом и 1 кОм вместо 450 Ом и 900 Ом. Схема будит работать, просто немного изменится яркость изображения.

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

    ----------------------------- конец цитируемого фрагмента статьи  ----------------------------------

    Теперь у тех кто внимательно читал наверняка в голове начала проявляться схема нашего будущего устройства, нарисуем !


    Посмотрите свои припасы и выбирайте свой контроллер, могу вам посоветовать взять более "жирный" ATMEGA32 так как у него 2 кб ОЗУ которые мы будем использовать как видеопамять.

    По номиналам резисторов, при питании микроконтроллера от 5 вольт я в первых своих тестах использовал постоянные резисторы следующих номиналов:
    R1 = 1 ком
    R2 = 330 ом
    R3 = не устанавливал поскольку указываемое в некоторых схемах значение в 75 ом по моему мнению сильно нагружало на землю выводы порта С, и я не захотел рисковать.

    Если вы хотите получить гарантировано рабочую конструкцию, то лучше не доверять написанным значениям резисторов, а поставить вместо них подстроечные резисторы номиналом в 1 ком и настроить на выходе напряжения:
    - 0.3 вольта при PC0=1 и PC1=0 
    - 1 вольт при PC0=1 и PC1=1

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

    .include "m32def.inc" ; Используем ATMega32

    .CSEG

    .org 0
            cli ; на всякий случай запретим прерывания
           
            ; настроим порты
            sbi DDRC , 0 ; режим работы PC0 - выход
            sbi DDRC , 1 ; режим работы PC1 - выход

            ; уровень синхроимпульса, на выходе 0 вольт
            cbi PORTC , 0 ; PC0=0
            cbi PORTC , 1 ; PC1=0

            ; уровень черного, на выходе 0.3 вольта
    ;       sbi PORTC , 0 ; PC0=1
    ;       cbi PORTC , 1 ; PC1=0

            ; уровень белого, на выходе 0.7 - 1 вольт
    ;       sbi PORTC , 0 ; PC0=1
    ;       sbi PORTC , 1 ; PC1=1

    loop:   rjmp loop

    Вот в общем то и вся программа. Порядок действий думаю откровения не вызовет:
    а) компилируем, заливаем в контроллер, мерим на выходе 0 вольт (уровень синхроимпульса) - с ним обычно проблем не бывает :-)
    б) комментируем строки задающие уровень синхроимпульса, и раскоментируем строки отвечающие за уровень черного, опять компилируем, заливаем в контроллер, мерим напряжение на выходе, подбираем R1 (тот который около 1 ком) чтобы было около 0.3 вольт
    в) комментируем строки задающие уровень черного (строки задающие уровень синхроимпульса мы уже закоментировали ранее), и раскоментируем строки отвечающие за уровень белого, опять компилируем, заливаем в контроллер, мерим, подбираем R2 (тот который около 300 ом)  чтобы было около 1 вольта (можно чуть меньше)

    Все замеры я осуществлял при подключенной нагрузке (телевизоре).

    После того как вы проделали эту не сложную операцию - вы аппаратно готовы к генерации видео и можно переходить к следующему шагу:

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


    Категория: Программирование микроконтроллеров AVR | Добавил: ВитГо (31.08.2012)
    Просмотров: 6876 | Теги: avr, Signal, видеосигнал, COMPOSITE, tv | Рейтинг: 1.0/1
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]

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