Projekt do MMIA: Výstup na TV

Ondřej Hájek, UREL, FEEC, VUT Brno
xhajek22feec.vutbr.cz

Obsah:

  1. Úvod
  2. Realizace
  3. Závěr
  4. Literatura

Úvod

Cílem tohoto projektu je pokusit se o jednoduché generování obrazu na TV pomocí mikrokontroleru AVR ATmega16. Pro gererování obrazu využijeme kompozitní vstup TV přijímače. Vzhledem k tomu, že pro televizní signál jsou nutné minimálně 3 úrovně ( synchronizační, bílá a černá ), tak budou využity 2 výstupní linky mikrokontroleru, s jejichž pomocí lze generovat 4 různé napěťové úrovně. Toto řešení má oproti jiné možnosti, kterou je využití D/A převodníku, výhodu v tom, že je rychlejší. V našem případě můžeme s hodinovým kmitočtem 16 MHz měnit napěťové úrovně za 0,1 us. V tomto případě ale bohužel není na výstupu ideální obdélníkový signál, ale signál podobající se trojúhelníhovému, což je způsobeno méně kvalitními výstupními obvody ATmegy. Naštěstí v našem případě potřebujeme generovat impulsy o délce alespoň 2.25 us ( pro vyrovnávací pulsy ) a při této délce je už signál obdélníkový.

Realizace

V televizní technice se používá TV signál s pozitivní a negativní polaritou. U TV signálu s pozitivní polaritou maximální úroveň odpovídá bílé. Černé odpovídá hodnota o 0,65 V menší a synchronizačním pulsům odpovídá hodnota o 1 V menší než úroveň bílé. ( PZN: Synchronizační úroveň není 0 V, ale je tam určitá nevyužitá ss složka, i když v mém případě generuji synchronizační pulsy tak, že jsou oba piny mikrokontroleru v logické nule a na výstupu je napětí řádově desítky mV. ). Negativní polarita má při maximální úrovni černou. V mém projektu pracuji s polaritou pozitivní.

obr2

Obrázek1: Úplný obrazový signál ( s pozitivní polaritou )

Když známe, jaké napěťové úrovňě mají být generovány, můžeme vypočítat hodnoty použitých rezistorů, které upraví logické úrovně na výstupu mikrokontroleru na požadované úrovně TV signálu. Hodnoty rezistorů jsou vypočteny tak, aby po připojení k TV přijímači, který má impedanci 75 ohmů, bylo možné pomocí kombinací logických úrovní na pinech PB6 a PB7 mikrokontroleru AVR získat úrovně pro synchronizační signál, černou a bílou barvu ( a také šedou - to je 4. kombinace ). Způsob výpočtu pro úroveň černé je uveden na obrázku 2. Když budou oba piny v logické nule, tak je na výstupu synchronizační úroveň. V případě, že na pinu s rezistorem 910 ohmů bude logická jednička a na druhém nula, tak nastává úroveň černé. Pokud jsou logické úrovně na pinech opačné, jedná se o úroveň šedé. A v případě, že oba piny jsou v logické jedničce, tak je na výstupu maximální napětí a to odpovídá úrovni bílé.

schema

Obrázek2: Výpočet napětí pro jednu kombinaci

Sice je úroveň černé 0,35 V, a tak vypočtených 0,33 V je mezi úrovní černé a úrovní synchronizační, ale v praxi to není až tak citlivé. Přesto je lepší si rezistory přeměřit multimetrem, jelikož jejich hodnota podléhá toleranci předepsané výrobcem. Po výpočtech pro zbylé kombinace známe hodnoty rezistorů: 470R a 910R. Můžeme tedy sestrojit propojovací kabel k TV přijímači, jak je znázorňeno na obrázku3.

schema

Obrázek3: Schéma zapojení kompozitního TV kabelu

Před samotným programováním musíme znát, jak to v televizním signálu funguje. Televize zobrazuje 25 snímků za sekundu. Každý vykreslený obraz se skládá z lichého a sudého půlsnímku. Každý půlsnímek obsahuje 312,5 řádku. A doba trvání řádku je 64 us. Na obrázku1 jsou nakresleny 2 řádky. Z něho si lze povšimnout, že každý řádek začíná zateměnou částí o délce 12 us, která je pro všechny řádky stejná. Zateměná část by měla začínat úrovní černé ( v mém projektu používám 3 us černou, 4 us synchronizační impuls [ teoreticky je 4,5 us ] a 5 us černou ). Řádkový synchronizační impuls má mít velikost 4,5 až 4,9 us. Po zateměné části následuje aktivní část o délce 52 us, kde se generuje vlastní obraz.

Každý půlsnímek začíná 5ti půlsnímkovými synchronizačními impulsy, které se skládají ze synchronizační úrovně o délce 27,5 us a z úrovně černé o délce 4,5 us. Poté následuje 5 vyrovnávacích impulsů, které tvoří synchronizační úroveň o délce 2,3 us a úroveň černé o délce 29,6 us. Po těchto vyrovnávacích pulsech následuje 305,5 řádků ( prvních 20 není vidět - jsou zateměné, podobně to je i na konci půlsnímku). U lichého půlsnímku se vykreslí půlřádek na konci a u sudého se jeho zbytek vykreslí po synchronizaci půlsnímku na začátku. Po 305,5 řádcích následuje 5 vyrovnávacích impulsů a začíná další půlsnímek. Synchronizace půlsnímků je na obázku 4.

schema

Obrázek4: Synchronizace půlsnímku, POZOR: je to v negativní polaritě

Nyní už je teorie dost na to, abychom mohli přistoupit k samotnému programování. Pro přehlednost uvádím níže algoritmus, podle ňehož jsem programy vytvářel.

schema

Obrázek5: Algoritmus

Dále si dovoluji předvést část zdrojového kódu - jedná se o funkci vypisující zadaný počet řádků určité barvy. Pro identifikaci barvy doporučuji za začátku programu definovat barvy například takto: #define white 0b11000000, #define black 0b01000000, atd... Zdrojový kód je pak přehlednější a lépe se dělají případné úpravy.

	void Vykresli(int pocet, int barva){
	for (i = 0;i < pocet; i++) {	// Vykreslení řádku pulsnímku
		//Zateměná část řádku = 3black + 4sync + 5black = 12 us
		PORTB = black;		
		_delay_us(3);
		PORTB = sync;
		_delay_us(4);
		PORTB = black;
		_delay_us(5);
		// Aktivní část řádku
		PORTB = barva;
		_delay_us(52);		
		}
	
schema

Obrázek6: Jeden řádek zobrazený na osciloskopu

schema

Obrázek7: Výsledný obraz signálu uvedeném na předchozím obrázku - vertikální pruhy

schema

Obrázek8: Obraz, když je lichý půlsnímek bílý a sudý černý

schema

Obrázek9: Vykreslení horizontálních pruhů

schema

Obrázek9: Neůspěšný pokus o vykreslení čterců

schema

Obrázek9: Generování bílé obrazovky s připojením kondenzátoru 100 nF mezi GND a rezistory

Závěr

Nejprve bych chtěl podotknout, že s dosaženým výsledkem nejsem úplně spokojen a že bych vše rád doladil do hezčí podoby. Nicméně jsem ztratil spoustu času při nalezení té správné kombinace úrovní, aby se na obrazovce "něco" zobrazilo, a vzhledem k tomu, že na vše jsem byl bohužel sám to zkrátka lepší není. Pokusy o odstraněním překmitů generovaného signálu pomocí kondenzátoru 10 nF nebo 100 nF končili neúspěšně - obraz se pouze více rozmazal. Pravděpodobně by to chtělo pokusit se využít časovač a přerušení mikrokontroleru. Dále se domnívám, že funkce delay není pro tuto aplikaci dotatečně přesná. Nejlepší by bylo zjistit přesné průběhy z profesionálního generátoru TV signálu a podle něho zkorigovat délky impulsů v programu.

Jelikož bylo zadáním tohoto projektu pokusit se o jednoduché generování obrazu na TV, tak alespoň tohoto cíle jsem dosáhl. Za případné nepřesnosti ( například délky impulsů ) se předem omlouvám.

Nakonec bych chtěl poděkovat Ing Zbyňkovi Fedrovi, Ph.D a Ing. Martinovi Slaninovi za jejich rady při vylepšování generovaného signálu.

Literatura

[1] SLANINA M. Přednášky k předmětu MVDK - Videotechnika. UREL, FEEC, VUT Brno, 2009.