VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky
P ro c e s o re m ř í z e n ý n a p á j e c í z d ro j Bakalářská práce
Autor: Jakub Petr Vedoucí práce: Ing. Bc. David Matoušek Jihlava 2011
Anotace Tato bakalářská práce popisuje vytvoření napájecího zdroje řízeného mikroprocesorem. Procesor pomocí rotačního enkodéru zajišťuje nastavení napětí od 0 V do 20 V a regulaci proudového omezení v rozsahu od 2 mA do 2 A, čehož lze využít při různých pracích v naší škole. V části práce jsou popsány nejvýznamnější součástky, kterými jsou dvoukanálový D/A převodník, rotační enkodér a procesor AT89S52. Dále je vysvětleno, jak fungují v daném přístroji. V poslední částí je popsán vlastní program pro mikroprocesor, který je psán v jazyce C. Klíčová slova Rotační enkodér, D/A převodník, MCP4922, AT89S52, napájecí zdroj, proudové omezení.
Annotation This thesis describes a microprocessor-controlled power supply. Processor using a rotary encoder provides voltage control from 0 V to 20 V and current limit control in the range from 2 mA to 2 A, which can be used for various works in our school. The section
describes
the
most
important
components,
which
are
two-channel
D/A converter, rotary encoder and processor AT89S52. The following explains how to operate in the device. In the last part is descibed the program's own microprocessor, which is written in C. Keywords Rotary encoder, D/A converter, MCP4922, AT89S52, power supply, current limited.
Poděkování Děkuji mému vedoucímu bakalářské práce panu Ing. Bc. Davidu Matouškovi za trpělivost, podporu a za odborné vedení při tvorbě této práce. Rád bych poděkoval také své rodině, všem blízkým a přátelům, kteří mě při vytváření práce velice podporovali a bez jejichž pomoci by nebylo možné práci dokončit.
Prohlašuji, že předložená bakalářská práce je původní a zpracoval/a jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil/a autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ. Byl/a jsem seznámen/a s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že s o u h l a s í m s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom/a toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutím licence. V Jihlavě dne 4. června 2011 ...................................................... Podpis
Obsah 1
Úvod.......................................................................................................................... 8
2
Popis řešeného problému ........................................................................................ 10
3
2.1
Seznámení se s problematikou........................................................................ 10
2.2
Cíle.................................................................................................................. 10
Teorie napájecích zdrojů......................................................................................... 12 3.1
4
5
Napájecí zdroj ................................................................................................. 12
3.1.1
Transformátor ......................................................................................... 13
3.1.2
Usměrňovač ............................................................................................ 14
3.1.3
Stabilizátor .............................................................................................. 15
Mikroprocesor......................................................................................................... 16 4.1
Výběr procesoru.............................................................................................. 16
4.2
Popis mikroprocesoru AT89S52..................................................................... 17
4.2.1
Základní vlastnosti.................................................................................. 17
4.2.2
Popis vývodů........................................................................................... 18
4.2.3
SPI sběrnice ............................................................................................ 20
Vlastní konstrukce .................................................................................................. 22 5.1
Popis schémat jednotlivých DPS .................................................................... 22
5.1.1
Digitální část ........................................................................................... 22
5.1.2
Analogová část........................................................................................ 26 Popis nejvýznamnějších součástek ................................................................. 32
5.2
6
5.2.1
Rotační enkodér ...................................................................................... 32
5.2.2
D/A převodník MCP4922....................................................................... 35
5.2.3
LCD display............................................................................................ 38
Software .................................................................................................................. 43 6.1
Popis vlastního programu pro mikroprocesor................................................. 43
6.1.1
Popis funkce int read_U()....................................................................... 48
6.1.2
Popis funkce int Posli_U(unsigned int pocet_U) ................................... 49
7
Ověřování funkčnosti zdroje................................................................................... 53
8
Závěr ....................................................................................................................... 54
9 10
8.1
Splnění cílů ..................................................................................................... 54
8.2
Problémy a jejich řešení.................................................................................. 54
8.3
Možnosti rozšíření .......................................................................................... 55
Seznam použitých zdrojů........................................................................................ 57 Seznam obrázků.................................................................................................. 59 6
11
Seznam tabulek ................................................................................................... 60
12
Seznam příloh na CD.......................................................................................... 61
7
1 Úvod V současném oboru počítačových systému a elektrotechniky dochází k neustálým změnám v oblasti vývoje a inovace. Mezi nejzákladnější inovace patří využití různých součástí zcela jiným způsobem nebo popřípadě úplně jinak. Ne nadarmo se říká, že úspěšný obor je ten, který přináší na trh nové či inovované výrobky. Již jako malý kluk jsem si hrával na opraváře různých elektrických zařízení. Nejčastěji se mi do ruky dostávaly různé digitální budíky, rozbitá rádia a jiné věci, které se pro člověka postupem času stávaly nepotřebnými. A právě tyto věci se stávaly stavebním kamenem pro moje výtvory a pokusy. Nejvíce mne fascinovaly různé součástky, jenž byly na tištěném spoji napájeny. Rád jsem si z jednotlivých součástek stavěl svoje zařízení, tedy jestli se to tak dalo v té době vůbec nazvat. A touha po tomto typu kutilství se již také odrazila při výběru střední školy. Vystudoval jsem střední školu se zaměřením na elektrotechniku, kde jsem si svoje znalosti v této problematice i nadále prohluboval. Na Vysoké škole polytechnické v Jihlavě jsem se dále setkával s různými elektrotechnickými předměty, ale hlavně s jedním a tím byl předmět Mikroprocesorová technika 1, kde se v té době probíralo programování mikroprocesoru od firmy Atmel, konkrétně AT89S52, který se programoval v jazyce C. A právě zde bylo o zadání mé bakalářské práce téměř rozhodnuto, jelikož touha vytvořit si něco svého a účelného byla vždy mým senem. Tak jsem začal hledat takové zadání, kde se objevil hardware a software dohromady. Naštěstí v té době pan Matoušek vypsal témata, kde se objevovala tato kombinace hardwaru a softwaru, hned dvě. Jedním z nich bylo vytvořit jednoúčelový programátor pro obvody typu GAL. Obvody GAL jsou programovatelnými logickými poli, která lze naprogramovat popřípadě smazat a znovu přeprogramovat. Snižují tak počet obvodů a celkově jsou kompaktnější než obvody vytvořené pro jednu jedinou logickou funkci. Zprvu se mi to jevilo jako pěkné téma bakalářské práce. A druhým tématem bylo vytvořit napájecí zdroj řízený mikroprocesorem. Po dlouhých úvahách, přemýšlení a konzultacích s panem Matouškem jsem si nakonec vybral druhé zmiňované téma. Sice obě témata splňovala moje představy, ale usoudil jsem, že takový napájecí zdroj bych si poté mohl postavit i doma a určitě by pro mne našel vetší uplatnění než programátor obvodů GAL.
8
Je mi naprosto jasné, že se nad tím hodně lidí pozastaví a položí si otázku, proč vlastně konstruuji něco, co dávno již někdo vymyslel bez mikroprocesoru. Odpověď je jednoduchá. Ve své práci budu pro regulaci veličin napětí a proudového omezení používat rotační enkodéry, jejichž signál musí zpracovat nějaký typ mikroprocesoru, v tomto případě se tedy jedná o AT89S52 od firmy Atmel s jádrem na bázi 8051. Převod mezi digitální a analogovou částí bude mít na práci dvoukanálový D/A (digitálně/analogový) převodník MCP4922, který bude komunikovat s procesorem pomocí SPI sběrnice. Samotné rozsahy budou, pro napětí od 0 V do 20 V a rozsah proudového omezení od 0 A do 2 A. Obě hodnoty budou zobrazovány na dvouřádkovém LCD displeji a případné omezení proudu ještě indikováno rozsvícením LED diody.
9
2 Popis řešeného problému V této kapitole se seznámíme s problematikou řešeného problému. Nastíníme, proč jsem se nakonec rozhodl vybrat si takovéto zadání bakalářské práce a vysvětlíme si, jaké cíle jsem si vytyčil.
2.1 Seznámení se s problematikou Dlouho jsem o zadání své bakalářské práce přemýšlel, protože jsem se nechtěl zabývat jenom naprogramováním nějaké aplikace, ať už by to byla aplikace v jazyce C++, či snad naprogramovat jakýsi druh informačního softwaru v PHP pro nějakou firmu. Popravdě mne to spíše vždy táhlo do praktického využití. Osobně si raději věci vyzkouším v praxi, jak se říká osahám, než se kupříkladu se stejnou problematikou seznamovat pouze z knížek nebo jiných tištěných a elektronických zdrojů. Proto jsem se také orientoval na zadání, kde se vyskytovala nějaká ta konstrukce plošného spoje. A tak tedy vyhrálo téma napájecí zdroj řízený procesorem. Určitě většina z nás si pod pojmem napájecí zdroj je schopna představit o jaké zařízení se to vlastně jedná. Ale už asi jenom málokdo si dovede vysvětlit, proč napájecí zdroj řízený procesorem. Toto je vlastně oficiální název mé bakalářské práce. Starší generace by mi určitě dala za pravdu a potvrdila, že k vytvoření napájecího zdroje stačí nějaké ty normální diody na usměrnění střídavého napětí na stejnosměrné, dále Zenerovy diody kvůli teplotní stabilizaci, pár vyhlazovacích kondenzátorů, operační zesilovač a jeden pár potenciometrů. To aby bylo možné nastavovat napětí a u malinko složitějších zdrojů i proud, respektive proudové omezení. Jak nám to blokově ukazuje obrázek 1 ve třetí kapitole. Ano, tak tomu opravdu také kdysi bývávalo a mnoho zdrojů tento systém používá dodnes. Zde si myslím, že by to chtělo i tuto stránku trošku zmodernizovat a zároveň aby nebyly příliš veliké náklady na výrobu toho modernějšího zdroje. A právě o tomto zmodernizování pojednává moje bakalářská práce.
2.2 Cíle Za cíle tohoto zadání byl zvolen návrh a následné zkonstruování jednoho vzorku zdroje řízeného procesorem. V zadání byla dále uvedena jasná kritéria, která by měl zdroj splňovat. Tak tedy tímto prvním kritériem bylo vybrat vhodný procesor s ohledem na 10
jeho periférie, cenu a výpočetní výkon. Další položkou bylo, že nastavování veličin budou obsluhovat rotační enkodéry a rozsah těchto veličin bude pro napěťovou složku od 0 V do 20 V, samozřejmě stejnosměrných. A proudové omezení bude mít rozsah od 0 A do 2 A. Otáčením rotačního enkodéru, chcete-li rotačního mikrospínače, se vygenerují pulzy, které zpracuje mikroprocesor a pošle příslušnou hodnotu na D/A převodník. Zde bylo také požadováno, aby minimální rozlišení D/A převodníku bylo osm bitů. A nakonec jako posledním kritériem bylo vlastní zobrazování nastavených hodnot, které by měl mít za úkol LCD display.
11
3 Teorie napájecích zdrojů1 V této kapitole se zaměříme na vysvětlení co je to napájecí zdroj, jaké má vlastnosti, z čeho se skládá a jak vlastně funguje.
3.1 Napájecí zdroj Většina lidí nejspíše ví, co je to napájecí zdroj a alespoň trochu tuší, z čeho je složen. V rozvodných elektrických sítích v domácnostech se vyskytuje střídavé jednofázové napětí 230 V a ve většině případů ještě trojfázové o hodnotě 380 V. Ale ne vždy se tyto hodnoty dají na vše použít, a právě pak na řadu přicházejí napájecí zdroje. Mnoho lidí si ani neuvědomuje, že něco takového vůbec používá, i když se s ním setkává pomalu denně. Takovým jednoduchým příkladem bychom si mohli uvést například to, že většina z nás vlastní mobilní telefon. A jak zajisté víte, ten je nutné čas od času dát na nabíječku a baterii si opět dobít, aby telefon zase fungoval. Jako napájecí zdroj je zde reprezentována právě ona nabíječka, která poskytuje baterii stejnosměrné napětí převedené z elektrické sítě o hodnotě něco kolem 5–7 V. Tedy funkcí napájecího zdroje je převést střídavé napětí na menší hodnotu stejnosměrného konstantního napětí. Jak k tomuto efektu dochází, zobrazuje blokové schéma síťového napájecího zdroje na obrázku 1.
Obrázek 1: Blokové schéma síťového napájecího zdroje (zdroj: Brtník: Elektrotechnika pro informatiky II., 2008, s. 62)
Nejprve se tedy síťové napětí z 230 V sníží na potřebnou hodnotu, v tomto případě je to na 24 V. Zde je toto napětí stále ještě střídavé. Dále se pokračuje do usměrňovače, který 1
Tato kapitola vychází z knihy BRTNÍK, B.: Elektrotechnika pro informatiky II., Jihlava, 2008. 127 s. Učební text. Vysoká škola polytechnická Jihlava.
12
usměrní střídavé napětí na stejnosměrné a jako poslední je stabilizátor. Tento je zde, aby nám hodnota stejnosměrného napětí na výstupu nekolísala se zvyšující se zátěží a tedy byla ustálená.
3.1.1 Transformátor Převod z jedné větší hodnoty na druhou menší hodnotu napětí nám tedy obstarává transformátor. Takový transformátor se skládá z primárního a sekundárního vinutí, která se liší průměrem namotaného drátu a počtem závitů na jedné a druhé straně. Na obrázku 2 je takový zjednodušený model transformátoru patrný.
Obrázek 2: Znázornění funkce transformátoru (zdroj: Brtník: Elektrotechnika pro informatiky II., 2008, s. 63)
Princip transformátoru je takový, že na primární vinutí se přivede napětí U1. Tím tedy zde začne procházet primární proud IP, který dle fyzikálního zákonu v železném jádře vybudí magnetický indukční tok Φ. Tento magnetický tok prochází jak primárním, tak také sekundárním vinutím a v obou pak indukuje napětí o velikosti ui=4,44. Φ.f.N. Zde písmeno f znamená frekvenci střídavého napětí a písmeno N počet závitů vinutí.
13
Z tohoto důvodu se objeví na sekundárním vinutí napětí U2. Tedy pro převod transformátoru platí obecný vztah:
p=
N1 U 1 I 2 = = N 2 U 2 I1
kde N1, N2 jsou počty závitů na primárním a sekundárním vinutí, U1,U2 jsou napětí na jednotlivých vinutí a I1, I2 jsou jejich proudy.
3.1.2 Usměrňovač Pomocí usměrňovačů usměrňujeme střídavé napětí na stejnosměrné napětí. Nejčastější konstrukce usměrňovače je pomocí diod, protože dioda v propustném směru proud vede a v závěrném směru proud nevede. Podle počtu diod a podle toho, zda byl použit vyhlazovací kondenzátor, rozlišujeme tyto usměrňovače: •
jednocestný usměrňovač s vyhlazovacím kondenzátorem,
•
dvojcestný neboli uzlový usměrňovač,
•
můstkový usměrňovač.
V této bakalářské práci byla použita poslední varianta usměrňovače, tedy pomocí můstkového zapojení. Jak takové můstkové zapojení vypadá, je znázorněno na obrázku 3 níže.
Obrázek 3: Můstkový usměrňovač (zdroj: Brtník: Elektrotechnika pro informatiky II., 2008, s. 65)
Jak je patrné z tohoto obrázku, můstkový usměrňovač je tvořen pomocí čtyř diod. Dvě z těchto diod jsou zapojeny v propustném a dvě v závěrném směru. Tím docílíme toho, že když bude kladné napětí v jedné půl periodě propuštěno přes dvě diody a ve druhé 14
půl periodě se tento stav otočí a napětí, které první dvě diody blokovaly propustí další dvě diody, které předtím blokovaly kladné napětí. Tento usměrňovač má tu výhodu oproti jednocestnému, že se na výstupu neobjeví doby s nulovým napětím, tedy na samotném výstupu budou pouze půlvlny s kladným napětím.
3.1.3 Stabilizátor Stabilizátor má za úkol stabilizovat výstupní napětí z usměrňovače. To abychom mohli měnit odebíraný proud, ale napětí na výstupních svorkách se neměnilo respektive nekolísalo. Máme tři základní druhy stabilizátorů a to: •
parametrické stabilizátory,
•
zpětnovazební stabilizátory,
•
spínané stabilizátory.
Parametrické stabilizátory jsou takovými nejzákladnějšími a poměrně nenáročnými na konstrukci. Mezi tyto stabilizátory patří například Zenerova dioda, která je i použita v této bakalářské práci, jak bude ukázáno v kapitole 5.1.2. Zpětnovazební a spínané už jsou konstrukčně podstatně náročnější, tedy pokud si nekoupíme již nějaký integrovaný obvod, který doplníme například pouze o dva kondenzátory. Takovýmto stabilizátorem, který se často používá, je obvod 7805. Jedná se o stabilizátor napětí na pět voltů, který má tři nožičky. Na první z nich se přivede vstupní napětí, na prostřední zem a z poslední se vyvede již stabilizované napětí. Tento typ integrovaného stabilizátoru je použit pro stabilizaci napětí v digitální části, viz kapitola 5.1.1.
15
4 Mikroprocesor V této kapitole se zaměříme na samotné „srdce“ celého napájecího zdroje, kterým je mikroprocesor AT89S52. Popíšeme si tedy jeho vlastnosti a řekneme, proč byl zrovna tento procesor vybrán.
4.1 Výběr procesoru V samotném zadání nebyl přesný typ mikrokontroléru uveden. Jeho volba tedy byla čistě na mně. Ovšem byla stanovena kritéria, které musela být respektována a dodržena. Kritéria zněla, aby procesor nebyl příliš drahý, disponoval potřebnými perifériemi a měl dostatečný výpočetní výkon. V době, kdy jsem se rozhodoval, který procesor zvolit, jsme měli již absolvované dva předměty, které se touto problematikou zabývaly. V předmětu Mikroprocesorová technika 1 jsme probírali programování procesoru od firmy ATMEL. Přesným typem je již zmiňovaný procesor AT89S52. Druhý typ mikroprocesoru jsme probírali v Mikroprocesorové technice 2. Konkrétněji se jednalo o ATmega16, který byl také od firmy ATMEL. Hlavním takovým rozdílem mezi těmito procesory je ve složení jejich architektury. Mikroprocesor AT89S52 používá tak zvanou Harvardskou architekturu. To znamená, že datová paměť je oddělena od paměti programu. Což vede k jisté bezpečnosti při programování. Nemůže se stát, že data uložená v datové paměti procesor pochopí jako svoje instrukce. Mikroprocesor ATmega16 používá tak zvaně AVR riscovou architekturu. AVR architektura vychází ze struktury rychle přístupového registrového pole. S tímto procesorem se tedy pracuje o trochu složitěji, ale dosahuje vyššího výpočetního výkonu. Dalším takovým bodem, který pomohl vybrat procesor, byly způsoby jejich programování. Ve výše zmíněných předmětech jsme programovali ATmega16 ve strojovém kódu, tedy v assembleru. Mikroprocesor AT89S52 jsme programovali pomocí jazyka C, tedy přesněji jeho modifikací C51. Programování ve strojovém kódu se zdálo o něco složitější, proto tedy byla zvolena varianta programovat procesor v jazyce C51. A z tohoto důvodu byl vybrán k regulaci a obsluze jednotlivých částí mikroprocesor AT89S52.
16
Tento procesor sice nemá tak vysoký výpočetní výkon a nedisponuje tak rozšířenými periferiemi jako ATmega16, ale je cenově výhodnější a jeho funkce plně pokryjí veškeré nároky a kritéria, která byla v zadání uvedena.
4.2 Popis mikroprocesoru AT89S52 Tento mikroprocesor je založen na bázi řady Intel 8051, s kterým je plně kompatibilní. Se svým malým příkonem a poměrně vysokým výkonem se velice dobře stává využitelným pro realizaci i v méně náročných konstrukcích.
4.2.1 Základní vlastnosti2 Mezi jeho základní a zároveň nejdůležitější vlastnostmi patří: •
napájecí napětí rozsahu od 4 V do 5,5 V,
•
8 KB programovatelná flash paměť (možno programovat přes SPI sběrnici),
•
počet přeprogramování paměti až 1 000 cyklů,
•
32 vstupně/výstupních portů,
•
256 B interní datové paměti,
•
tři 16bitové čítače/časovače,
•
9 zdrojů přerušení,
•
2 režimy snížené spotřeby (idle a power-down),
•
2 datové ukazatele,
•
programovatelný watchdog,
•
příznak vypnutí,
•
tříúrovňový zámek paměti programu,
•
možnost použití hodinového kmitočtu (od 0 do 24 MHz),
•
zabudovaný plně duplexní sériový asynchronní kanál (UART).
2
Tato podkapitola vychází z knihy MATOUŠEK, D.: C pro mikrokontroléry ATMEL AT89S52 : příklady a aplikace pro C51 ve vývojovém prostředí KEIL uVision3. 1. vydání. Praha : BEN - technická literatura, 2007. 240 s. ISBN 978-80-7300-215-9.
17
4.2.2 Popis vývodů3 V této bakalářské práci je použit procesor AT89S52 s pouzdrem označovaným jako DIP 40. Jednotlivá umístění vývodů jsou patrná z obrázku 4 níže. Vývody Ucc a GND slouží pro přivedení napájecího napětí. Mezi vývody 1 až 8, tedy P1.0 až P1.7, je vyveden osmibitový vstupně/výstupní port P1, který je opatřen zabudovanými zvyšovacími odpory. Některé jeho vývody mají další rozšiřující funkce. Vývody P1.0 a P1.1 souvisí s vnějším hodinovým vstupem nebo jako výstup pro čítač/časovač 2. Rozmezí vývodů od P1.5 do P1.7 je používáno pro programování procesoru pomocí SPI sběrnice. Vývod 9 s označením RST nám slouží pro resetování procesoru. Pokud přivedeme na tento vývod logickou jedničku na dobu minimálně dvou strojových taktů, tak následné přivedení logické nuly vyvolá, že se procesor rozeběhne od adresy nula. Vývody 10 až 17 jsou vyvedeny jako vstupně/výstupní port P3, který má jako port P1 zabudované zvyšovací odpory. Všechny tyto vývody mají své alternativní funkce. Porty P3.0 a P3.1 jsou vstup a výstup sériového kanálu. Vývody P3.2 a P3.3 jsou vstupy vnějších zdrojů přerušení 0 a 1. Následně P3.4 a P3.5 jsou vnější vstupy čítače/časovače 0 a čítače/časovače 1. A poslední dva vývody s označením P3.6 a P3.7 jsou spojeny s vnější datovou pamětí. P3.6 je pro zápis a P3.7 je pro čtení. Nožičky nesoucí označení XTAL2 a XTAL1 jsou pro přivedení vnějšího hodinového zdroje nebo vnějšího krystalu. XTAL1 je vstupem do invertujícího zesilovače, který je zabudován uvnitř oscilátoru a XTAL2 je jeho výstupem.
3
Tato podkapitola vychází z knihy MATOUŠEK, D.: C pro mikrokontroléry ATMEL AT89S52 : příklady a aplikace pro C51 ve vývojovém prostředí KEIL uVision3. 1. vydání. Praha : BEN - technická literatura, 2007. 240 s. ISBN 978-80-7300-215-9.
18
Obrázek 4: Rozložení vývodů AT89S52 (zdroj: Matoušek: Mikroprocesorová technika: přednášky, 2008, s. 10)
Vývody s čísly 21 až 28, tedy s označením P2.0 až P2.7, se chovají jako osmibitový vstupně/výstupní port P2, který má stejně jako porty P1 a P3 zabudované zvyšovací odpory. I tento port má na jednotlivých bitech alternativní funkce. Jednou z nich je například, že se přes tento port připojují rozšiřující paměti a to jak datové, ale také i programové. Tato dvě připojení se od sebe trochu odlišují a to tím, že při připojení vnější datové paměti se nevyužívá poslední nejvyšší bit, tedy P2.7. Vývod 29, který se jmenuje ~PSEN, je používán jako strobovací signál při čtení z vnější programové paměti. Následující nožička nese označení ALE/~PROG. Tento vývod může fungovat ve dvojím režimu. Buď pracuje v normálním režimu, tedy jako ALE, nebo se používá při paralelním programování a označuje se jako ~PROG. První z těchto dvou způsobů se používá především pro práci s vnější pamětí či jako externí pomocný zdroj hodin. Vývod ~EA/~UPP má jako ALE/~PROG také dva významy. V normálním případě se označuje jako ~EA a je-li tento pin v logické jedničce, tak program běží z vnitřní flash paměti. A pokud je ~EA nastaven do logické nuly, tak mikroprocesor provádí program z vnější programové paměti. 19
Poslední skupina vývodů je označována jako port P0. Tyto bity jsou na vývodech 32 až 39. Od předchozích portů se tak trochu odlišují v tom, že nemají zabudované zvyšovací odpory. Ty se k portu musejí dodávat z vnějšku. Ale i tento vývod má své případné alternativní použití vývodů. Celý port slouží jako zabudovaný 8bitový A/D převodník.
4.2.3 SPI sběrnice4 Princip SPI sběrnice je takový, že sběrnice zapojené do série nám umožňují výrazně snížit počet řídících linek pro ovládání podřízených obvodů. Data jsou předávána sériově postupně za sebou po jednom vodiči nikoliv paralelně. Z toho nám vyplývá, že použijeme jeden datový vodič sériové sběrnice místo osmi datových vodičů. Ovšem tento datový vodič musíme téměř vždy doplnit o synchronizační a výběrové vodiče. Sběrnice SPI pracuje s těmito třemi následujícími vodiči: •
CLK – hodinový signál, který potvrzuje přenos každého přenášeného bitu.
•
DATA – vodič, který obsahuje vysílaná a přijímaná data. Lze použít i dva vodiče pro vstup SI a pro výstup SO.
•
CS – vybere obvod, pro který jsou data určena.
Samotné načasování přenosu je pevně definováno a zobrazeno na obrázku 5.
Obrázek 5: Načasování přenosu SPI (zdroj: Brtník, Matoušek,: Programování mikrokontrolérů s jádrem 8051, 2010, s.89)
4
Tato podkapitola vychází z knihy MATOUŠEK, D.; BRTNÍK,: B. Programování mikrokontrolérů s jádrem 8051 : Názorné příklady a funkční programy pro AT89S52. 1. vydání. Praha : BEN - technická literatura, 2010. 152 s. ISBN 978-80-7300-264-0.
20
Postup práce s SPI sběrnicí by se nechal shrnout do dvou kroků 1. Nejprve vybereme obvod přes vodič CS. Výběr je nutný z důvodu, že sběrnice může sdílet i více obvodů a my musíme určit, se kterým pracujeme. Vodič je obvykle aktivní v logické nule. 2. Jednotlivé úrovně datového vodiče se mění pomocí sestupné hrany a jsou vzorkovány respektive potvrzovány hodinovým signálem. Jako první se ve většině případů posílá bit s nejvyšší váhou, tedy ten osmý.
21
5 Vlastní konstrukce V této kapitole se seznámíme s vlastní konstrukcí napájecího zdroje. Protože má zdroj část analogovu a digitální, ukážeme si jednotlivé části zvlášť. A v podkapitole 5.2 se zaměříme na významné součástky, které jsou v této práci použity.
5.1 Popis schémat jednotlivých DPS Tato podkapitola pojednává o samotném návrhu jednotlivých desek plošných spojů. Vysvětlíme si jejich zapojení a ukážeme si jednotlivé obrázky osazených desek jak pro analogovou část, tak také pro digitální.
5.1.1 Digitální část5 Digitální část sdružuje veškeré desky plošných spojů, které mají nějakou potřebnou funkci pro mikroprocesor. Těmito DPS jsou například: deska zapojení D/A převodníku MCP4922, dále zapojení rotačních mikrospínačů, DPS s LCD displejem a jako poslední deska pro zapojení mikroprocesoru. V této podkapitole se zaměříme na DPS osazenou mikroprocesorem AT89S52, protože schémata dalších jednotlivých konstrukcí jsou vždy ukázána v kapitolách věnujících se jejich popisu. Tyto jednotlivé desky jsou stavěny modulárně. To znamená, že nejsou obsaženy na jedné desce, ale jsou vytvořeny každá zvlášť a s mikroprocesorem jsou následně spojeny pomocí propojovacích kablíků typu AWG28-10, který je plochý desetižilový. Schéma zapojení mikroprocesoru je patrné z obrázku 6, který se nachází níže.
5
Část této kapitoly vychází z knihy MATOUŠEK, D.: C pro mikrokontroléry ATMEL AT89S52 : příklady a aplikace pro C51 ve vývojovém prostředí KEIL uVision3. 1. vydání. Praha : BEN - technická literatura, 2007. 240 s. ISBN 978-80-7300-215-9.
22
Obrázek 6: Schéma zapojení AT89S52 (zdroj: vlastní tvorba)
Jako napájecí napětí je přivedeno na PAD1 (GND) a PAD2 (+Ucc) napětí o velikosti 9 V. Pro informaci, že je napětí přivedeno, je jako signalizace použita zelená LED dioda. Stabilizátor 7805, tedy integrovaný obvod IC2, je zde proto, aby nám snížil napětí z 9 V na konstantní napětí o velikosti 5 V, potřebné pro napájení samotného mikroprocesoru a také jeho připojených modulů. Kondezátory C2 a C5 jsou zde nezbytnou součástí, protože blokují napájecí napětí mikroprocesoru a jeho připojených zařízení. Pokud bychom zde tyto kondenzátory vynechali, pravděpodobně by docházelo ke špatnému rozběhu mikrokontroléru při zapnutí. Krystal potřebný pro taktování procesoru je pomocí dvou hradel integrovaného obvodu IC3 zapojen na vývod 19. V této konstrukci je použit krystal s frekvencí 24 MHz. Níže uvedené obrázky nám přibližují návrh plošného spoje s AT89S52, rozložení součástek na desce a vodivé cesty z pohledu spojů.
23
Obrázek 7: DPS s AT89S52 (zdroj: vlastní tvorba)
Obrázek 8: Rozmístění součástek a padů (zdroj: vlastní tvorba)
24
Obrázek 9: Vodivé cesty digitální části z pohledu spojů (zdroj: vlastní tvorba)
Na konec této kapitoly si uvedeme jednotlivé seznamy součástek. Rezistory: •
R1 = 680 Ω – ¼ W,
•
R2 = 1 MΩ – ¼ W,
•
R3 = 1 kΩ – ¼ W.
Kondenzátory: •
C1, C2 = 470 µF/16 V – elektrolytické,
•
C3, C4, C5 = 100nF/63 V – keramické,
•
C6, C7 = 33pF/500V – keramické,
•
C8 = 22 µF/16 V – elektrolytický.
Diody: •
D1 = 1N4007,
•
D2 = LED dioda 5 mm – například červená,
•
D3 = 1N4148. 25
Integrované obvody: •
IC1 = AT89S52-PU24 – pouzdro DIP40,
•
IC2 = 7805 – pouzdro TO220H,
•
IC3 = 74HC04 (74HCT04).
Ostatní: •
Q2 = 24.000 MHz – krystal,
•
PL1, PL2, PL3 = MLM10G (PSL10).
A v samotném závěru by bylo dobré ještě upozornit na resetovací obvod, který je složen z kondenzátoru C8, diody D3 a rezistoru R3. Tato konstrukce je zde velice důležitá, protože nám vždy zaručí, že po připojení napájecího napětí se procesor rozeběhne od adresy nula, tedy tak jak má.
5.1.2 Analogová část6 Analogová část zahrnuje jednu desku a transformátor. V této práci je použit transformátor od firmy TRONIC s napětími na primárním vinutí 230 V, 50 Hz, na sekundárním vinutí 24 V, 3,5 A, a Ptot=85 VA. Dále jsou na obou vinutích zapojeny ochranné pojistky, na primárním vinutí pojistka 500 mA a na sekundárním vinutí pojistka o hodnotě 3,15 A. Na obrázku 10 je viditelné schéma zapojení napájecího zdroje. Toto schéma bylo modifikováno a patřičně upraveno ze schématu zdroje, který byl řízený normálními potenciometry.
6
Tato podkapitola vychází z internetové stránky HW.cz: Napájecí zdroj 0-30 V s regulovatelným proudem 2 mA-3 A. [online]. 2005 [cit. 2011-04-29]. Dostupný z WWW: http://hw.cz/Teorie-a-praxe/Konstrukce/ART1438-Napajeci-zdroj-0-30V-s-regulovatelnym-proudem2mA--3A.html.
26
Obrázek 10: Schéma analogové části (zdroj: vychází z http://hw.cz/Teorie-a-praxe/Konstrukce/ART1438-Napajeci-zdroj-0-30V-sregulovatelnym-proudem-2mA--3A.html)
27
Popis funkce schématu je následující. Na svorkovnici S1 se přivedou výstupy z transformátoru. Tedy přivede se zde napětí ze sekundárního vinutí, které je střídavé. Pomocí můstkového zapojení diod D5 až D8 se toto napětí usměrní na stejnosměrné a za pomoci filtru tvořeného z kondenzátoru C3 a odporu R3 se toto napětí vyhladí. Kondenzátory C1 a C2 ještě za pomoci Zenerovy diody mají za úkol vytvořit záporné napětí potřebné pro správnou funkci operačních zesilovačů IC1, IC2 a IC3. Tento typ obvodu nepoužívá k monitorování výstupního napětí, na rozdíl od podobných zdrojů, uspořádané zpětné vazby, ale užívá k tomuto konstantní zesilovač, který zajišťuje referenční napětí pro stabilní výstup. Referenční napětí je vytvářeno na výstupu operačního zesilovače IC1. Na jeho výstupu, tedy na vývodu 6, se toto napětí začne zvyšovat a to do té doby, než se zvýší na hodnotu, která sepne Zenerovu diodu D4. Dioda D4 zde funguje jako teplotní stabilizace a jakmile je tato dioda zapnuta, objeví se na ní napětí rovnající se 5.6 V. Toto napětí se též objeví na odporu R13. Potom zde mluvíme o tom, že se obvod stabilizoval. Díky tomu, že na neinvertujícím vstupu operačního zesilovače protéká téměř nulový proud, tak tento zanedbatelný proud je také na větvi, kde se nachází odpor R13, který je sériově spojen s odporem R12. Z ohoto plyne, že bude na dvou sériově zapojených odporech napětí rovnající se dvojnásobku hodnoty referenčního napětí na pinu 6 operačního zesilovače. Na těchto odporech se tak napětí zvedne z 5,6 V na 11,2 V. Je tedy dvakrát větší než napětí na Zenerově diodě. Operační zesilovač IC3 má konstantní zesílení, které se přibližně rovná třem, protože je definováno vztahem A = (R17+R25)/R17. Tedy hodnotu referenčního napětí, která dosud činila 11,2 V zesílí, přibližně na 33 V. K tomuto integrovanému obvodu je také ještě zapojen trimr (R19) s odporem R18. Tyto dvě součástky zde slouží k tomu, abychom mohli na výstupu přesně nadefinovat hodnotu 0 V. Zní to zvláštně, ale i když je na vstupech zdroje pro regulaci, respektive výstupech z D/A převodníku, nastaveno 0 V, tak tato hodnota nemusí být také na výsledném napětí, tedy na výstupech zdroje. Tento jev je celkem logický, protože snad žádná součástka není úplně stoprocentně přesná. Jinými slovy: odpor, který by měl mít hodnotu 10 kΩ, ve skutečnosti takovou hodnotu nemá, ale má třeba „pouze“ 9,98 kΩ. Z důvodu takovýchto nepřesností se i přes nulové počáteční podmínky může na výstupu objevit napětí, které se nule nerovná. Proto je zde zaveden tento trimr, kterým si můžeme hodnotu na výstupu uměle
28
doladit. Samozřejmě toto se děje pouze při prvním oživování zdroje. Pokud toto ihned na začátku provedeme, tak to nadále funguje již správně. Další nedílnou součástí toho zdroje je, že z něho můžeme udělat zdroj maximálního proudu. Tedy v podstatě z něho jde udělat zdroj konstantního proudu. Zde, aby toto bylo vůbec možné udělat, detekuje obvod úbytky napětí na odporu R24, který je sériově spojen se zátěží na výstupech. Tuto činnost nám zajišťuje poslední integrovaný obvod IC2. Invertující vstup toho operačního zesilovače je pomocí odporu R7 nastaven na 0 V. Díky tomu lze neinvertující vstup nastavit pomocí výstupu z D/A převodníku na jakoukoliv napěťovou hodnotu. Jako takový příklad jeho funkce si můžeme uvést, že na výstupu je několik voltů a hodnota z D/A převodníku je 1 V. Pokud tedy na výstupu bude konstantní zátěž, obvod bude stále stabilní. Jestliže se zátěž začne zvyšovat a na odporu R24 se objeví ztrátové napětí větší než jeden volt, integrovaný odvod IC2 se spustí a začne poskytovat konstantní proud. Integrovaný obvod IC2, tedy jeho výstup, je spojen s neinvertujícím vstupem integrovaného obvodu IC3 přes diodu D9. Operační zesilovač IC3 hlídá napětí na odporu R24, aby nedošlo k překročení úbytku napětí, než je nastaveno na integrovaném obvodu IC2. V našem případě aby nebyla převýšena hodnota 1 V. Díky tomu, že odpor R24 má velmi malou hodnotu, je sériově spojen se zátěží a umístěn mimo zpětnou vazbu, bude mít zanedbatelný vliv na regulační zpětnou vazbu obvodu. Pokud tedy dojde k sepnutí obvodu IC2, rozsvítí se LED dioda, která je přes tranzistor zapojena na jeho výstupu. Okolo tranzistoru T1 je zapojený ochranný obvod napájecího zdroje, který hlídá záporné napětí. Pokud toto záporné napětí, produkované kondenzátory C1 a C2, zmizí, tranzistor T1 odpojí napájení od výstupu. V normální situaci je T1 neaktivní a to díky zapojenému odporu R20. Integrovaný obvod má vnitřní ochranu proti zkratu, což oceníme v případě, kdy se zdrojem experimentujeme. Návrh plošného spoje, rozmístění součástek a vedení vodivých cest nám ukazují následující tři obrázky níže. Připojení výstupů z D/A převodníku jsou následující: pro napěťovou složku je připojen na PAD2 a PAD5. A proudové omezení je připojeno na PAD1.
29
Obrázek 11: DPS analogové části (zdroj: vlastní tvorba)
Obrázek 12: Vodivé cesty analogové části z pohledu spojů (zdroj: vlastní tvorba)
Obrázek 13: Rozložení součástek a padů (zdroj: vlastní tvorba)
30
Na závěr této podkapitoly si uvedeme jednotlivé seznamy součástek. Rezistory: •
R24 = 0,42 Ω – 5 W,
•
R9 = 33Ω – ¼ W,
•
R1 = 82 Ω – ¼ W,
•
R2 = 220 Ω – ¼ W,
•
R17, R22, R23 = 1 kΩ – ¼ W,
•
R20 = 1,5 kΩ – ¼ W,
•
R3 = 2,2 kΩ – 2 W,
•
R5, R16 = 2,2 kΩ – ¼ W,
•
R4 = 3,9 kΩ – ¼ W,
•
R11 = 4,7 kΩ – ¼ W,
•
R25 = 6,9kΩ – ¼ W,
•
R6, R7, R12, R13, R21 = 10 kΩ – ¼ W,
•
R15 = 27 kΩ – ¼ W,
•
R18 = 270 kΩ – ¼ W.
Kondenzátory: •
C6 = 100 pF – keramický,
•
C4 = 330 pF – keramický,
•
C9 = 100 nF – keramický,
•
C5 = 100 nF – polyestern,
•
C7 = 200 nF – polyestern,
•
C8 = 10 µF – elektrolytický,
•
C1, C2 = 47 µF – elektrolytické,
•
C3 = 4700 µF – elektrolytický.
Diody: •
D1, D2, D9, D10 = 1N4148,
•
D3, D4 = BZX83V005.6,
•
D5, D6, D7, D8 = 1N5400,
•
D11 = 1N4007,
•
LED1 = LED dioda 5 mm – například červená. 31
Tranzistory, operační zesilovače trimr: •
Q1 = BC557 – PNP tranzistor,
•
T1 = BC547 – NPN tranzistor,
•
T2 = BC337 – NPN tranzistor,
•
T3 = BDW83C – NPN výkonový tranzistor (není umístěn na plošném spoji, ale na chladiči),
•
IC1, IC2, IC3 = TL071,
•
R19 = trimr 100 kΩ – stojatý, velikost 7 mm.
5.2 Popis nejvýznamnějších součástek V této podkapitole se seznámíme s popisy a vlastnostmi nejvýznamnějších součástek, které se v této práci vyskytují, a vysvětlíme si jejich funkci v tomto napájecím zdroji. Samozřejmě si nebudeme uvádět jednotlivé datasheety, ty jsou u vybraných součástek součástí dokumentace na CD v příloze.
5.2.1 Rotační enkodér Když budeme postupovat od samotného začátku regulace zdroje, tak jako první jsou na řadě rotační enkodéry nebo též nazývané rotační mikrospínače. Většina lidí si asi není schopna pod těmito pojmy představit, co to vlastně je, jak to funguje a k čem je to dobré. I když se vlastně ve světě elektronických součástek nejedná o žádnou novinku. Mnoho z nás se s těmito typy mikrospínačů již několikráte setkalo a ani o tom neví. Tyto mikrospínače postupně začínají vytlačovat o dosti starší potenciometry. Často se objevují například u osciloskopů, pro nastavování horizontální a vertikální osy. U potenciometrů je přesně stanovený rozsah hodnot, který již není možný měnit nad jeho limity. Rotační mikrospínač nemá tyto koncové hodnoty. To znamená, že s ním můžeme otáčet kolem své osy stále dokola. Uvnitř mikrospínače není žádná elektronika, ale vše je řešeno pouze mechanicky. Vlastní práce rotačního enkodéru spočívá v tom, že se do něho přivede napájecí napětí, které činí 5 V. Výstupy se jednak připojí přes zdvihací odpory na toto napětí a také na vývody mikroprocesoru. Z obrázku 14 je viditelné schéma zapojení těchto dvou rotačních mikrospínačů. Aby tento obrázek někoho nezmátl, tak mikrospínač je zde naznačen jako dva jednotlivé spínače, a to proto, že se generují dva pulzy. Na bitech 32
D_0 a D_2 je připojen první enkodér, který řídí napětí a na bitech D_1 a D_3 je zapojen druhý enkodér, který zde řídí proudové omezení. A také jsou zde naznačeny zdvihací odpory, jejíchž hodnota činí 4,7 kΩ.
Obrázek 14: Schéma zapojení rotačního mikrospínače (zdroj: vlastní tvorba)
Jak už je naznačeno výše, rotační enkodér po otočení své osy generuje dva impulzy. Tyto impulzy jsou navzájem posunuté o 90˚. Kdyby nebyly tyto impulzy vzájemně posunuté, tak by nebylo možné rozpoznat, kterým směrem vlastně enkodérem otáčíme. Obrázek 15 nám ukazuje, jak se rozpoznávají jednotlivé směry otáčení.
Obrázek 15: Rozpoznání směrů otáčení (zdroj: Matoušek: MROTSW, 2010, s. 1)
Samotné zpracování signálů z těchto mikrospínačů můžeme provádět více způsoby. Jedním takovým způsobem je, že jeden impulz přivedeme na vstup vnějšího přerušení v procesoru a druhý na jeho libovolný pin. Vzestupná hrana prvního impulzu by vyvolala přerušení a funkce v obsluze přerušení by testovala hodnotu druhého impulzu. Tato metoda by byla o něco jednoduší, ale méně přesná, protože při otáčení osy enkodéru vznikají zákmity, které by mohly vyvolat přerušení i kdyby nebylo zrovna aktuální. Proto je raději použita druhá metoda, která je sice o něco složitější, ale tyto 33
zákmity spolehlivě potlačuje pomocí softwarového ošetření zákmitů a dvojím čtením. Celý program je vysvětlen v kapitole 6.1.1, proto si zde ukážeme pouze hodnoty, s kterými funkce pro zpracování těchto impulzů pracuje, jak je patrné na obrázku 16.
Obrázek 16: Rozbor hodnot rotačního mikrospínače (zdroj: vlastní tvorba)
K popisu získávání hodnot je použit první enkodér pro nastavování napětí ve směru doprava tedy, v programu přičítání jedničky. Při otáčení doleva je tento postup obdobný a liší se pouze v získaných hodnotách. Jednotlivé hodnoty jsou očíslovány ve čtverečku od jedné do čtyř, ale jejich získávání je o trochu složitější. V prvním kroku si přečteme stav pinu na portu P1 (první modrá čára v obrázku 16). Aby se ošetřily zákmity, provedeme čtení, chvíli počkáme a opakujeme toto čtení znovu. Pokud jsou jednotlivé stavy totožné, k zákmitům nedošlo a můžeme si hodnotu uložit do proměnné var1. Takto se postupuje i pro první červenou čáru na obrázku 16. Tedy provedeme čtení, chvíli počkáme, opakujeme čtení, a pokud jsou stavy totožné, uložíme si tuto hodnotu do proměnné var2. Pokud se nám povedlo získat tyto dvě hodnoty, v našem případě var1=0 a var2=1, pokračujeme následnými operacemi. V první proměnné si posuneme spodní bity o čtyři místa doleva, tedy na místo vyšších čtyř bitů. A následně k této nové hodnotě přičteme hodnotu v proměnné var2. Výsledná hodnota v prvním čtverečku je tedy 01 hexadecimálně, tak jak to vidíme v následující tabulce 1.
34
Tabulka 1: Hodnoty z portu P1 prvního enkodéru – směr doprava (zdroj: vlastní tvorba)
1 var1
D_0 D_2
2 var2
0 0 0
mezihodnoty
var1 1 0 1
var2 1 0 1
1
Výsledné hodnoty
3 var1 1 1 5
4 var2
1 1 5
15
var1 0 1 4
var2 0 1 4
54
0 0 0
40
jsou v hexadecimálním čísle
V tabulce 2 jsou uvedeny pro upřesnění hodnoty z portu P1, když otáčíme mikrospínačem doleva, tedy odečítáme jedničku. Tyto dvě tabulky slouží pro zjištění směru otáčení napěťové složky. Tabulky pro proudovou složku se zjišťují principiálně úplně stejným způsobem, jenom s tím rozdílem, že vývody mikrospínače jsou zapojeny na bity D_1 a D_3. Tabulka 2: Hodnoty z portu P1 prvního enkodéru – směr doleva (zdroj: vlastní tvorba)
1 var1
D_0 D_2 mezihodnoty
Výsledné hodnoty
2 var2
0 0 0
var1 0 1 4
4
3 var2
0 1 4
45
var1 1 1 5
4 var2
1 1 5
51
var1 1 0 1
var2 1 0 1
0 0 0
10
jsou v hexadecimálním čísle
5.2.2 D/A převodník MCP49227 Převod z digitální části do analogové zajišťuje dvoukanálový D/A převodník. Tento převodník má oproti svým podobným zařízením jednu zvláštnost, že jeho komunikace mezi ním a procesorem probíhá pomocí SPI sběrnice. Tedy k jeho komunikaci postačí pouze tři dráty, na rozdíl od standardních D/A převodníků, kde každý bit měl svůj vodič. Proto jedna z největších výhod je, že toto řešení podstatně snižuje spotřebu vodičů, čímž prakticky není potřeba procesor s velkým počtem vývodů. Ale na druhou stranu je zde o něco složitější program pro odeslání dat na tento typ převodníku, jak si vysvětlíme v kapitole 6.1.2.
7
Část této podkapitoly vychází z knihy MATOUŠEK, D.: Práce s mikrokontroléry ATMEL 4. díl – Atmega16. 1. vydání. Praha : BEN - technická literatura, 2010. 320 s. ISBN 978-80-7300-274-9.
35
Nejdůležitější vlastnosti převodníku MCP4922: •
volitelné zesílení výstupu 1x nebo 2x,
•
maximální kmitočet SPI sběrnice až 20 MHz,
•
rozlišení 12 bitů,
•
16.bitová komunikace,
•
napájecí napětí v rozsahu 2,7 až 5,5 V,
•
typická integrální nelinearita ± LSD,
•
typická diferenciální nelinearita ± 0,2 LSB.
Obrázek 17: Rozmístění vývodů MCP4922 (zdroj: http://www.gme.cz/_dokumentace/dokumenty/321/321-017/dsh.321-017.1.pdf)
Sběrnice SPI přijme data, která jsou následně uložena do vstupního registru. Pomocí signálu LDAC lze tyto data přepsat do záchytného registru, který je typu latch, a přivést na vnitřní D/A převodník. Synchronizaci pomocí tohoto signálu nemusíme využít, lze proto ponechat LDAC trvale připojený na log. 0. Pomocí náběžné hrany signálu CS dojde k přepisu dat směrem na vnitřní D/A převodník. K připojení referenčního napětí nám slouží vývody Uref1 a Uref2. Tato napětí můžeme připojit na převodník D/A buď přímo nebo přes oddělovací zesilovač (bufer). Napětí se pohybuje v rozmezí 0,040 V až Ucc – 0,040 V. Vývody Uout1 a Uout2 slouží jako výstupy.
36
Schéma klasického zapojení s převodníkem nám ukazuje obrázek 18.
Obrázek 18: Schéma zapojení MCP4922 (zdroj: vlastní tvorba)
Vlastní časování komunikace převodníku přes SPI sběrnici je zachyceno na obrázku 19.
Obrázek 19: Časování komunikace na SPI (zdroj: http://www.gme.cz/_dokumentace/dokumenty/321/321-017/dsh.321-017.1.pdf)
Jednotlivé významy časů jsou následující: •
tCSSR - předstih aktivace obvodu před první náběžnou hranou SCK(40 ns),
•
tHI, tLO - doba trvání logické 1, logické 0 signálu SCK, (minimálně 15 ns),
•
tSU - předstih dat před hodinami(minimálně 10 ns),
•
tHD - přesah dat(minimálně 10 ns),
•
tCHS - předstih náběhu SCK před náběhem ~CS(minimálně 15 ns),
•
tCSH - doba deaktivace obvodu(minimálně 15 ns).
37
Data, která se odesílají pomocí mikroprocesoru do převodníku, mají délku 16 bitů. S dvanácti datovými bity se odesílají ještě čtyři konfigurační bity, které slouží ke konfiguraci činnosti převodníku, jak nám to ukazuje obrázek 20.
Obrázek 20: Formát přenášených dat (zdroj: Matoušek: ATMEL AVR ATmega16, 2010, s. 167)
5.2.3 LCD display8 V této podkapitole je popsán a vysvětlen způsob komunikace s řádkovým LCD displejem. V této práci je použit pro zobrazování výstupních hodnot dvouřádkový LCD display s osmi znaky na jeden řádek. Většina LCD displejů je řízena integrovaným řadičem HD 44780. Tento obvod dokáže přenášet data pomocí čtyř nebo osmi vodičů. My použijme čtyřbitovou komunikaci. Tedy vlastní přenos dat probíhá pomocí čtyř linek, konkrétněji DB7 až DB4, ostatní vývody DB3 až DB0, které se komunikace neúčastní, jsou svedeny na zem. Režijní komunikace probíhá na linkách RS, R/~W a E. Linka RS řídí výběr přenosu dat nebo příkazů. Vodič R/~W provádí vlastní zápis nebo čtení, ale my na display pouze vypisujeme, proto tento vodič nepotřebujeme a můžeme jej také svést na zem. Poslední linka E zajišťuje povolení vstupu. Takové základní zapojení tohoto typu displeje, které je použito v bakalářské práci, nám ukazuje obrázek 21 níže.
8
Část této podkapitoly vychází z knihy MATOUŠEK, D.: LCD MODUL. Jihlava, 2011. 6 s. Učební text. Vysoká škola polytechnická Jihlava.
38
Obrázek 21: Schéma zapojení LCD displeje (zdroj: Matoušek, MLCD, 2009, s. 1)
Při spuštění displeje je automaticky již z výroby nastavená osmibitová komunikace. Proto, chceme-li komunikovat 4bitově, musíme provést inicializaci pro 4bitovou komunikaci. Pokud ovšem tuto inicializaci vynecháme nebo jí provedeme špatně, nebude display s největší pravděpodobností pracovat správně. Jak probíhá inicializace pro čtyř bitovou komunikaci je ukázáno na obrázku 22. Snad ještě pro upřesnění: přenos dat v této komunikaci probíhá tak, že se nejprve pošle horní polovina bajtu a následně se pošle spodní polovina bajtu.
39
Obrázek 22: Inicializace 4bitové komunikace LCD displeje (zdroj: Matoušek, LCD Modul, 2011, s. 3)
Ve vlastním programu v mikroprocesoru nám zajišťuje tuto inicializaci funkce void init(). Tato funkce není nic jiného než přepsané hodnoty z obrázku 22 do jazyka C51. Ale pro úplnost zde je tato funkce uvedena a popíšeme si ji komentářem.
40
1. 2. 3. 4. 5. 6. 7.
void init(){ cekej(); cekej(); P2 = 50 P2 = 48; cekej(); cekej();
Na prvním a druhém řádku je realizováno čekání, které musí být delší než 15 ms, kvůli správnému náběhu displeje. Na následujícím řádku se na port P2 odešle hodnota 50, která v binárním kódu znamená 0011 0010. Kde horní čtyři bity realizují DB7 až DB4 a druhý bit zastupuje signál E, tedy povolení vstupu. Na řádku 5 se hodnota 48, jenž binárně znamená 0011 0000, odešle také na port P2. Tedy prakticky se vlastně zopakuje předchozí hodnota bez nastaveného druhého bitu. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
P2 = 50 P2 = 48; cekej(); P2 = 50; P2 = 48; cekej(); P2 = 34; P2 = 32; cekej(); pisprikaz(40); pisprikaz(1); pisprikaz(12); pisprikaz(6); }
Tento postup posílání dat se nemění a plně odpovídá hodnotám z obrázku 22, který je uveden výše. Až od řádku 17 po řádek 20 je menší změna. Zde se neposílají hodnoty přímo, ale je zde zavedena funkce pisprikaz(), jejíchž parametrem je hodnota, kterou chceme na port P2 posílat. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
void pisprikaz(char c) { P2 = (c&240)+2; P2 = c&240; P2 = (c<<4)+2; P2 = c<<4; cekej(); }
Parametr, který dáme této funkci, musíme ještě dále zpracovat, než jej odešleme na samotný port. Na řádku 24 hodnotu z parametru vymaskujeme pomocí hodnoty 240. Tato hodnota binárně znamená 1111 0000, tedy zachovává pouze horní čtyři bity. A k této hodnotě se ještě přičte hodnota dvě. Tato hodnota znamená, že se linky RS a E nastaví do jedničky. Tímto se povolí vstup a řekne se, že se posílají data. Řádek 25 41
pouze zopakuje poslání horní poloviny bajtu hodnoty parametru. Na následném řádku se v tomto parametru posunou spodní čtyři bity na místo horních, to proto abychom poslali i spodní polovinu dat. Takovým to způsobem funguje posílání dat do LDC displeje.
42
6 Software V této kapitole se zaměříme na hlavní program a popíšeme si jeho nejdůležitější funkce, které jsou následně doplněny komentářem.
6.1 Popis vlastního programu pro mikroprocesor Program nahraný v procesoru, jak už je nastíněno v předchozích kapitolách, zajišťuje několik procesů. Prvním z nich je, že čte stavy pinů rotačních mikrospínačů, jejich zpracování a následné přepočítání hodnot. Z vypočtených výsledků sestaví šestnácti bitová čísla, která pošle přes SPI na D/A převodník a hodnoty, které se objevují na výstupech zdroje, se zobrazí na LCD displeji. Jak už bylo řečeno, tento program je naprogramovaný v jazyce C a zkompilovaný v programu µVison 3 od společnosti Keil. Dále budou popisovány jen ty funkce a programové konstrukce, které se v tomto programu vyskytují. 1. 2.
#include
#include <stdio.h>
3. 4. 5.
#define CLK P3_7 #define MOSI P3_5 #define CS P3_4
6. 7.
int pocet_U = 0; int pocet_I = 0;
Výraz na prvním řádku znamená, že si aplikace načte knihovny potřebné pro správnou činnost procesoru. Zde si musíme dát pozor, abychom načítali knihovny těch procesorů, které opravdu používáme, protože většinou každý typ procesoru používá různé druhy knihoven. A z toho důvodu by pak následně nemusela být zaručena správná funkce programu. Druhý řádek nám zajišťuje, že se do aplikace nahrají funkce potřebné pro přesměrování výpisu funkcí printf(). Výrazy #define nemají nikterak zásadní vliv na chod programu, spíše nám slouží ke zjednodušení. Proto abychom v programu stále dokola nepoužívali například číselné označení portů a riskovali tím, že nějaké číslo spleteme a způsobíme tím nefunkčnost kódu. Zavedeme si jeho pomocný název, který pak používáme v celém zdrojovém kódu. Následující dva řádky definují, jakých datových typů budou deklarované proměnné. Tento datový typ zahrnuje pouze celá čísla, a to v rozsahu od -32 768 až do 32 767. Datový typ float zahrnuje všechna kladná i záporná desetinná čísla a jeho rozmezí se pohybuje od - 3,4*1038 do 3,4*1038, zároveň 43
se proměnným pocet_U a pocet_I nastaví výchozí hodnota na nulu. Všimněte si, že každý příkaz se ukončuje na konci řádku středníkem. To aby linker věděl, že bude následovat další příkaz. 8. 9. 10. 11. 12.
void cekej() { int w; for(w = 0; w<1500; w++); }
13. 14. 15. 16. 17.
void cekej2() { int i; for(i = 0; i < 25; i++); }
Tyto dvě funkce cekej() a cekej2() jsou naprosto totožné. Liší se jenom v době čekání, proto si popíšeme jenom jednu z nich. Void cekej() {} je definice nenávratové funkce s názvem cekej. V prvním kroku si definujeme proměnou w a následně vstoupíme do cyklu for. For cyklus se vyznačuje tím, že se nejprve provede nastavení proměnné na výchozí polohu. Dále následuje porovnání, zda-li je hodnota proměnné menší než 1 500. Pokud ano, zvýší se obsah této proměnné a provádí se další příkazy vložené do smyčky for. Pokud se stane, že podmínka již neplatí, tedy hodnota je větší než 1 500, tak se příkazy vnořené do for cyklu neprovádí a program se vrací tam, odkud byla funkce cekej() zavolána. Zde se teda jedná pouze o zpožďovací funkce. 18. 19. 20. 21. 22. 23. 24. 25.
void pisprikaz(char c) { P2 = (c&240)+2; P2 = c&240; P2 = (c<<4)+2; P2 = c<<4; cekej(); }
44
26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47.
void init() { cekej(); cekej(); P2 = 50; P2 = 48; cekej(); cekej(); P2 = 50; P2 = 48; cekej(); P2 = 50; P2 = 48; cekej(); P2 = 34; P2 = 32; cekej(); pisprikaz(40); pisprikaz(1); pisprikaz(12); pisprikaz(6); }
Předchozí dvě funkce jsou určené pro obsluhu LCD displeje, které jsme již vysvětlili v kapitole 5.2.3. Proto abychom se vyhnuli duplicitním informacím, již zde komentáře vynecháme, ale kód si zde uvedeme jenom pro úplnost, aby bylo patrné, kde se v programu tyto funkce nacházejí. 48. 49. 50. 51. 52. 53. 54. 55. 56.
char putchar(char c) { P2 = (c&240)+2+1; P2 = (c&240)+1; P2 = (c<<4)+2+1; P2 = (c<<4)+1; cekej(); return c; }
Funkce char putchar(char c) úzce souvisí s funkcí printf(), proto si tyto funkce zde popíšeme najednou. Samotná funkce printf() v jazyce C zajišťuje formátovaný výpis hodnot základních datových typů. Tato funkce v jazyce C51 je zrealizována jako funkce putchar(). Pomocí této funkce lze přesměrovat výpis prostřednictvím sériového kanálu na kterékoliv zařízení, které právě potřebujeme. Samozřejmě si tělo této funkce musíme patřičně nastavit, jak je viditelné na řádcích 50 až 55. Konstrukce typu printf("U=%4.1f V", napeti); z řádku 64, má následující význam. Do uvozovek píšeme to, co bychom chtěli zobrazit na LCD, v tomto případě se bude vypisovat následující výraz U=. Kombinace znaků %4.1 znamená, že výpis bude na čtvrté pozici s přesností na jedno desetinné místo. Konverze f určuje, ve kterém místě se má zobrazit hodnota obsažená v proměnné napeti. A ihned za touto konverzí se vypíše ještě znak V. Dobré je 45
si všimnout, že proměnné, jejichž hodnoty chceme zobrazit, se píší mimo uvozovky a oddělují se čárkou. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66.
void main() { int pom_U ; int pom_I ; float napeti = 0; float proud = 0; init(); printf("U=%4.1f V", napeti); pisprikaz(192); printf("I=%4.3fA", proud);
Funkce void main() je základní funkcí pro všechny procesory, které se programují v jazyce C, konkrétněji v jeho modifikaci C51. V této funkci se nachází hlavní program, který procesor vykonává. Tato funkce je rozdělena na několik částí. Nejprve to jsou vlastní definice jednotlivých proměnných a jakési prvotní funkce pro nastavení jednotlivých přípravků. Jako je třeba v našem případě funkce init(), která se vyvolá, aby došlo ke správnému nastavení LCD displeje, jak jsme si uvedli v kapitole 5.2.3. Následující řádky, konkrétně 64, 65 a 66, slouží k prvotnímu zobrazení na LCD. To abychom po spuštění programu měli na LCD nějaká data a display nebyl prázdný do té doby, než by došlo ke změně stavu na jednom nebo druhém rotačním mikrospínači. 67. 68. 69. 70.
while(1) { pom_U = read_U(); pom_I = read_I();
Na řádku 67 začíná cyklus while. Zde by bylo dobré upozornit, že veškeré příkazy a funkce se v této smyčce stále opakují, protože deklarace podmínky while(1) je neustále pravdivá. Na tomto jevu je také založen princip tohoto cyklu. Nejprve se provede test na definovanou podmínku uvedenou v závorce. Pokud je podmínka pravdivá, tak se provádí jednotlivé příkazy, které jsou do tohoto cyklu vnořeny. A naopak, pokud je podmínka neplatná, tak se její příkazy přeskočí a pokračuje se příkazy následujícími. Na řádku 69 si do proměnné pom_U uložíme hodnotu, kterou nám vrátila funkce read_U(). O jaké hodnoty se může jednat, si vysvětlíme v kapitole 6.1.1. Totéž se provede i pro proměnou pom_I. 71. 72. 73. 74. 75.
if(pom_U != 0) { pocet_U = pocet_U + pom_U; napeti = (float)pocet_U / 10; if (pocet_U < 0) pocet_U = 0;
46
Dále následuje podmíněný příkaz if (řádek 71). Tento příkaz má v závorce uvedenou podmínku, v našem případě pom_U se nesmí rovnat nule. Pokud je podmínka splněna, provedou se příkazy, které jsou do něho vnořeny. Když podmínka splněna není skočí se na příkaz else, tady pokud je definovaný. V našem případě není, tudíž by se tato podmínka přeskočila a pokračovalo by se dalšími instrukcemi. Na řádku 73 si do proměnné pocet_U uložíme její předcházející hodnotu a přičteme si k ní hodnotu, kterou nám vrátila funkce read_U(). Na následujícím řádku si do proměnné napeti uložíme hodnotu pocet_U vydělenou deseti. Zde je dobré si všimnout syntaxe (float). Jedná se o tak zvané přetypování, protože proměnná pocet_U je definována jako integer, což jsou celá čísla. A pokud vydělíme nějaké číslo od jedné do devíti deseti, tak vždy dostaneme desetinné číslo. Proto zde toto přetypování zavádíme, abychom na LCD byli schopni zobrazovat volty po jedné desetině. Následující řádek zajišťuje, že pokud hodnota v proměnné pocet_U bude menší než nula, tak se tato proměnná automaticky nastaví na nulu. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91.
printf("U=%4.1f V", napeti); pisprikaz(128); Posli_U(pocet_U); } if(pom_I != 0) { pisprikaz(192); pocet_I = pocet_I + pom_I; proud = (float)(pocet_I*2)/1000; if (pocet_I < 0) pocet_I = 0; printf("I=%4.3fA", proud); pisprikaz(128); Posli_I(pocet_I); } }; }
Výpis pomocí funkce printf() jsme si vysvětlili výše, proto jej zde můžeme přeskočit. Na řádku 77 se nachází funkce pro obsluhu LCD displeje, která má parametr 128 dekadicky. Na dalším řádku se volá funkce posli_U s parametrem pocet_U, která nám zajistí odeslání dat do D/A převodníku. Řádky 80 až 88 jsou pro obsluhu proudu a prakticky totožné jako konstrukce pro napětí. Je zde jenom jeden malý rozdíl v tom, že je zde ještě jedna funkce pro obsluhu LCD a to pisprikaz(192), který zajišťuje přemístění kurzoru na první pozici ve druhém řádku LCD.
47
6.1.1 Popis funkce int read_U() V této podkapitole se zaměříme na funkci, která má na starosti čtení pinů a jejich následné vyhodnocování. Podrobněji si rozebereme funkci int read_U(), i když v samotném programu se nachází ještě obdobná funkce int read_I(), která se od této liší pouze v tom, že místo maskování pěti se provádí maskování deseti. 1. 2. 3. 4. 5. 6.
int read_U() { unsigned char stav1, stav2, var1, var2, a; do { stav1 = ~P1&0x05;
Na řádku 3 máme nadefinované proměnné. Dále následuje cyklus do while. Tento cyklus se liší od cyklu while tím, že po vkročení do jeho těla se nejprve provedou všechny příkazy, které se v něm nacházejí, a jako poslední se provede podmínka. Pokud je podmínka splněna, tak se program již do cyklu nevrací a pokračuje následujícími instrukcemi. Ovšem pokud podmínka splněna není, tak program setrvává v těle cyklu tak dlouho, něž se podmínku podaří splnit. Řádek 6 až 8 pracuje jako softwarové ošetření zákmitů, které vznikají točením rotačního mikrospínače. Samotný řádek 8 ukládá do proměnné stav1 hodnotu z portu P1, která je znegována a následně vymaskována hodnotou 5. Proč tomu tak je, je patrné z obrázku 14 v kapitole 5.2.1. Pro upřesnění: nás v tuto chvíli zajímá pouze bit 0 a bit 1. 7. 8. 9. 10. 11.
cekej2(); stav2 = ~P1&0x05; } while(stav1 != stav2); var1 = stav1;
12.
cekej2();
Dále následuje malé zpoždění a znovu čtení pinu z portu P1, ale tentokrát se ukládá do proměnné stav2. Tyto instrukce jsou vnořené do cyklu do while a na řádku 19 se provádí porovnávání, dokud si proměnné stav1 stav2 nejsou rovny. Jakmile se podaří opustit tento cyklus, hodnota stav1 se uloží do proměnné var1. Provede se další čekání a následuje další cyklus do while, který se chová úplně stejně jako cyklus před ním.
48
13. 14. 15. 16. 17. 18. 19. 20.
do { stav1 = ~P1&0x05; cekej2(); stav2 = ~P1&0x05; } while(stav1 != stav2); var2 = stav1;
Opět si čte stavy pinů a provádí se tak dlouho, dokud si nejsou proměnné rovny. Po ukončení cyklu se do proměnné var2 opět uloží stav1. 21.
a = ((var1&5)<<4)+(var2&5);
Řádek 21 je o trochu složitější v tom, že se zde do proměnné a ukládá hodnota, která je složena ze dvou. Tak tady var1 vymaskujeme pěti čímž si zaručíme, že budeme pracovat pouze s bity 0 a 2. Operace vymaskování je ve skutečnosti bitový součin. Provedeme tedy tuto operaci a výsledek následně posuneme na místo nejvyšších čtyř bitů. K tomuto mezivýsledku ještě přičteme hodnotu proměnné var2, kterou jsme před tím také vymaskovali hodnotou pět, aby nám nezměnila již hotové vyšší čtyři bity. 22. 23. 24. 25. 26. 27.
if(a == 0x01 || a == 0x15 || a == 0x54 || a == 0x40) return 1; if(a == 0x04 || a == 0x45 || a == 0x51 || a == 0x10) return -1; return 0; }
Následně proměnou a podrobíme testování pomocí podmíněných příkazů if. Na řádku 22 testujeme jednotlivé hodnoty, které jsme si uvedli v kapitole 5.2.1. Jedná se o hodnoty, které můžeme dostat z rotačních enkodérů. Pokud se hodnota rovná nějaké hodnotě z řádku 22, tak funkce read_U() vrátí hodnotu 1. V případě, že je hodnota rovna některé z řádku 24, vrátí funkce -1. A v posledním případě, když se hodnota nerovná žádné uvedené, tak funkce vrací hodnotu nula.
6.1.2 Popis funkce int Posli_U(unsigned int pocet_U) Tato kapitola pojednává o funkci int Posli_U(unsigned int pocet_U). Práce této funkce je posílat data na D/A převodník pomocí SPI sběrnice. Jejím parametrem je pocet_U. Zde si rozebereme pouze tuto funkci, i když v programu je ještě funkce int Posli_I(unsigned int pocet_I), která je skoro totožná s touto funkcí. Liší se pouze v tom, že místo kanálu dva je používán kanál jedna, což se odráží v hodnotě proměnné nastaveni. 49
1. 2. 3.
4.
void Posli_U(unsigned int pocet_U) { unsigned int nastaveni = 0, j = 0, cislo = 0, Nastav = 0, pom_L = 0, pom_H = 0; nastaveni = 176
Na řádku 3 si opět nadefinujeme proměnné a jejich prvotní hodnoty. Následující řádek je tak zvaně konfigurační, protože si do proměnné nastaveni uložíme hodnotu 176 dekadicky, která binárně znamená hodnotu 1011 0000. S touto hodnotou budeme i následně pracovat. Když si vezmeme významy jednotlivých bitů, tak je třeba si uvědomit, že tato hodnota je vyšší bajt posílaný přes SPI do D/A převodníku a pro lepší zorientování nám poslouží obrázek 20 z kapitoly 5.2.2. 5. 6.
CS = 0; if(pocet_U >= 255 && pocet_U < 4095)
Na následujícím řádku zdrojového kódu nastavíme vodič CS do logické nuly. Na řádcích 6 a 12 se nacházejí dva podmíněné příkazy. V jejich podmínkách jsou rozděleny hodnoty proměnné pocet_U na dva intervaly. Jeden z těchto intervalů zahrnuje hodnoty této proměnné, kdy jsou rovny od 0 do 255 a druhý pokrývá rozsah od 255 do 4 095. Tyto dva rozsahy se musí rozlišovat, protože se liší jejich následné složení 16bitového čísla potřebného pro poslání na D/A převodník. 7. 8. 9. 10. 11.
{ pom_H = (pocet_U&3840)>>8; Nastav = nastaveni + pom_H; pom_L = pocet_U&255; }
Řádky 8 až 10 tedy pracují s vyšším rozsahem než je 255, je tedy nutné, aby se do proměnné pom_H uložila hodnota proměnné pocet_U s vymaskováním 3 840 (to je binárně hodnota 1111 0000 0000) a s následným posunutím bitů o osm míst doprava. Tímto si zaručíme, že bity díky hodnotě větší než 255, které se již nevejdou do prvního bajtu, budeme mít zachované v neporušeném stavu jako čtyři nejnižší bity v proměnné pom_H. Dále následuje proměnná Nastav, která se skládá jednak z proměnné nastaveni, tedy hodnoty 176 a jednak hodnoty, kterou má proměnná pom_H. Následující konstrukce na řádku 10 uloží do proměnné pom_L hodnotu pocet_U vymaskovanou 255. To z toho důvodu, že kdyby byla tato hodnota větší než 255, tedy nevešla by se do jednoho bajtu, tak abychom tuto hodnotu „ořízli“ pouze na spodní bajt, protože bity, které jsou již ve vyšším bajtu, máme zahrnuty a připraveny v hodnotě pom_H.
50
12. 13. 14. 15. 16.
if(pocet_U < 255) { pom_L = pocet_U Nastav = nastaveni; }
Podobný postup aplikujeme i u hodnoty pocet_U, která je menší než 255. S tím rozdílem, že zde nemusíme skládat horní bajt, tedy proměnou Nastav a tedy tato konstrukce je jednodušší. 17. 18. 19. 20. 21. 22. 23.
for (j = 0; j < 8; j { MOSI=(Nastav&0x80) > 0x0; CLK = 0 CLK = 1; Nastav = Nastav<<1; }
Od řádku 17 až po řádek 30 probíhá vlastní odesílání připravených hodnot přes SPI sběrnici na D/A převodník. Řádkem 17 začíná rozvětvený cyklus for, který se bude podle nastavení osmkrát opakovat, protože bude posílat horní bajt tedy osm vyšších bitů, které nám zajišťují správnou konfiguraci D/A převodníku. Řádek 19 zajišťuje vymaskování prvního bitu a jeho následné odeslání na SPI přes vodič MOSI. Následující dva řádky nastaví CLK na logickou nulu a v zápětí na logickou jedničku. Tím zajistí vygenerování náběžné hrany, kterou potřebujeme pro potvrzení datového bitu, jak je patrné na obrázku 5 v kapitole 4.2.3. Poslední konstrukcí v této části programu je, že do proměnné s názvem Nastav uložíme hodnotu v této proměnné s posunutím o jeden bit doleva. Tímto jsme si zaručili, že při dalším opakovaném vymaskování, které se provádí na řádku 19, budeme maskovat následující bit, než jak tomu bylo v předchozím případě. Kdybychom toto posunutí opomněli, tak bychom vlastně stále dokola maskovali jeden a ten samý bit a tím by byla špatně provedená celá konfigurace. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
cislo = pom_L; for (j = 0; j < 8; j++) { CLK = 0; MOSI=(cislo&0x80) > 0x0; CLK = 1; cislo = cislo<<1; } CS = 1; }
Na řádku 24 si pouze uložíme hodnotu proměnné pom_L, tedy osm bitů číselné hodnoty, jenž se bude posílat na D/A převodník, do proměnné cislo. For cyklus 51
začínající na řádku 25 je principově úplně stejný jako jeho předchůdce z řádku 17 s tím rozdílem, že se zde posílá spodní bajt, tedy pouze data. Poslední instrukcí je, že musíme ještě vrátit hodnotu CS do logické jedničky. A tím jsme potvrdili odeslání jednoho dvou bajtového čísla přes SPI do D/A převodníku. Asi nemusíme podotýkat, že tento jev se opakuje vždy, při jakékoliv změně rotačních enkodérů.
52
7 Ověřování funkčnosti zdroje Po sestavení veškerého hardwaru a nahrání softwaru do mikroprocesoru a následného oživení, se můžeme podívat na samotné testování zdroje. Největším problémem ihned po zpracování signálů z rotačních enkodérů bylo spojit digitální část s analogovou. Povedlo se docílit toho, že napěťová složka se nechá nastavovat pomocí výstupních hodnot z D/A převodníku od 0 V do 30 V, toto bych považoval jako dobrý výsledek nad rámec zadání. Regulace napětí je plynulá s krokem nastavení po jedné desetině voltu. Ovšem ukázalo se, že ne vždy se hodnoty na LCD s hodnotami skutečnými na výstupu zdroje stoprocentně shodují. Vlivem nepřesností v osazených součástkách se mohou tyto dvě hodnoty od sebe odlišovat. Postupným testováním bylo zjištěno, že se tyto hodnoty od sebe liší řádově v desetině voltů. Například pokud máme na LCD displeji hodnotu 23,5 V, tak na výstupních svorkách se může objevit hodnota 23,4 V. V rozmezí od 0 V do 20 V byla největší chyba do 0,02 V. Po překročení 20 V se chyba postupně zvětšuje a největší zjištěná neshoda byla právě těchto 0,1 V. Funkčnost proudového omezení byla testována na zátěži, jejíž hodnota činila 82 Ω. Při tomto testování vyplynulo, že velikost nastavování proudového omezení funguje, ale již neodpovídá zobrazovaným hodnotám na displeji. Proudovému omezení bylo věnováno hodně času, protože se zprvu nedařilo, aby toto proudové omezení vůbec fungovalo. Nakonec se to tedy povedlo a proudové omezení s těmito neshodami funguje. Napájecí zdroj má v sobě ochranu proti zkratu. Z počátku se s testováním této funkce raději moc nepočítalo, ale při manipulaci při testování došlo k tomu, že se výstupy omylem zkratovaly a tím tedy byla nechtěně vyzkoušena i tato bezpečností funkce, která též pracuje, tak jak má.
53
8 Závěr 8.1 Splnění cílů Cílem této bakalářské práce bylo navrhnout a následně zkonstruovat napájecí zdroj řízený mikroprocesorem. Tento zdroj měl mít nastavitelné hodnoty napětí a proudového omezení. Vlastní regulace veličin měla být provedena pomocí rotačního enkodéru respektive rotačního mikrospínače. Převod mezi digitální a analogovou částí měl být řešen pomocí D/A převodníku s minimálním rozlišením osmi bitů. Rozsahy jednotlivých regulovaných veličin byly definovány u napětí od 0 V do 20 V, samozřejmě stejnosměrných. A rozsah proudového omezení měl být definován od 0 A do 2 A. Nastavené hodnoty měly být zobrazeny na LCD displeji. Vlastní typ procesoru nebyl nějak přesně stanoven, pouze byla stanovena kritéria, která by měl procesor splňovat. Jejich znění bylo, aby procesor nebyl příliš drahý, měl potřebné periférie a disponoval dostatečným výpočetním výkonem. Vytyčené hlavní cíle této bakalářské práce se víceméně povedlo splnit. A mým snažením bylo, aby byla práce ještě vylepšena. Místo klasických D/A převodníků je použit jeden dvoukanálový s rozlišením dvanáct bitů místo osmi. A navíc tento převodník používá pro svoji komunikaci SPI sběrnici, čímž je ušetřeno mnoho vodičů a tím kladeny menší nároky na procesor. Rozsah napětí se povedlo rozšířit místo požadovaných od 0 V do 20 V na maximální hodnotu 30 V. Napájecí zdroj bude využit při práci v laboratoři na naší Vysoké škole polytechnické v Jihlavě. Další uplatnění by mohl tento přístroj nalézt v dílně amatérských domácích kutilů.
8.2 Problémy a jejich řešení Při popisu řešení daného problému, typu zdrojů či dalších situací je převážně vycházeno ze znalostí získaných při studiu na Vysoké škole polytechnické v Jihlavě a z publikacích psaných profesory, kteří se touto problematikou též specializovali.
54
V této práci jsme často narazili na problém uvést teorii do praxe. Často se zde stávalo, že teorie byla pochopena správně, ale špatné bylo uvedení do praxe. Mezi největší problémy patřilo zejména snímání pinů z rotačních enkodérů, kde docházelo vlivem otáčení k zákmitům, které jsou nakonec softwarově ošetřeny dvojím čtením a dvojím vzorkováním pinu. Dalším takovým problémem bylo, propojit analogovou a digitální část, aby analogová správně pracovala dle příkazů digitální části. I tento problém byl nakonec vyřešen. I když se vyskytly malé neshody mezi zobrazováním na LCD a skutečnými hodnotami na výstupu zdroje, jak je uvedeno výše v kapitole 7. U napěťové složky jsou odchylky téměř zanedbatelné a proudové části by neměl být do budoucna tento problém dořešit a dotáhnout do úplného konce.
8.3 Možnosti rozšíření Jako možná rozšíření tohoto napájecího zdroje by přicházela v úvahu hned dvě rozšíření. Jedním z nich by bylo přidat externí chlazení, nějaký druh ventilátoru, který by ofukoval operační zesilovač a tím by se klesající teplotou snižoval i jeho ztrátový výkon. Kdyby byl plošný spoj analogové části předělán tak, že by se zesílily jeho vodivé cesty, aby popřípadě vydržely větší proud, mohl by zdroj být regulován na podstatně větší proudové omezení. Dosavadní proudové omezení se teoreticky pohybuje lehce přes dva ampéry. A po tomto zásahu by klidně mohlo mít i šest ampér. Aby ventilátor neběžel stále, tedy aby zbytečně nechladil, když by to ještě nebylo potřeba, nechalo by se k ventilátoru přidat teplotní čidlo, které by snímalo teplotu na chladiči. Toto čidlo by mohlo být propojené s procesorem, kde by se v jeho programu přidala funkce, která by tuto teplotu neustále hlídala. Pokud by došlo k překročení stanoveného limitu, tak by procesor podal povel a ventilátor by začal ochlazovat zesilovač, dokud by teplota neklesla pod stanovenou mez. Popřípadě použil by se ještě větší LCD display než je použit nyní v této práci, tedy dvouřádkový s osmi znaky na řádek, ale například čtyřřádkový, mohla by se pro informaci naměřená teplota na chladiči stále zobrazovat. A pracovník by ihned věděl, zda nedochází k nějakému velkému přehřátí zesilovače a jeho následnému zničení.
55
Druhým takovým rozšířením, které by se čas od času mohlo hodit, by bylo mít na zdroji vedle svorek pro stejnosměrné napětí ještě další dvě svorky pro střídavou složku. U tohoto rozšíření by stačilo použít trafo s větším počtem sekundárních vinutí.
56
9 Seznam použitých zdrojů BRTNÍK, B.: Elektrotechnika pro informatiky II.. Jihlava, 2008. 127 s. Učební text. Vysoká škola polytechnická Jihlava. MATOUŠEK, D.: C pro mikrokontroléry ATMEL AT89S52 : příklady a aplikace pro C51 ve vývojovém prostředí KEIL uVision3. 1. vydání. Praha : BEN - technická literatura, 2007. 240 s. ISBN 978-80-7300-215-9. MATOUŠEK, D.: Mikroprocesorová technika : přednášky. 1. opravené vydání. Jihlava : Vysoká škola polytechnická, 2008. 73 s. MATOUŠEK, D.; BRTNÍK, B.: Programování mikrokontrolérů s jádrem 8051 : Názorné příklady a funkční programy pro AT89S52. 1. vydání. Praha : BEN - technická literatura, 2010. 152 s. ISBN 978-80-7300-264-0. MATOUŠEK, D.: MROTSW. Jihlava, 2010. 1 s. Učební text. Vysoká škola polytechnická Jihlava. MATOUŠEK, D.: LCD MODUL. Jihlava, 2011. 6 s. Učební text. Vysoká škola polytechnická Jihlava. MATOUŠEK, D.: MLCD. Jihlava, 2009. 1 s. Učební text. Vysoká škola polytechnická Jihlava. MATOUŠEK, D.: Práce s mikrokontroléry ATMEL 4. díl – Atmega16 . 1. vydání. Praha : BEN - technická literatura, 2010. 320 s. ISBN 978-80-7300-274-9. GM Electronic: MCP4922 [online]. 2011 [cit. 2011-04-19]. Dostupný z WWW: http://www.gme.cz/_dokumentace/dokumenty/321/321-017/dsh.321-017.1.pdf. GM Electronic: BDW83C [online]. 2011 [cit. 2011-05-9]. Dostupný z WWW: http://www.gme.cz/_dokumentace/dokumenty/211/211-093/dsh.211-093.1.pdf. HansInteractive: Rotační enkodér [online]. 2011 [cit. 2011-05-19]. Dostupný z WWW: http://www.hansinteractive.wz.cz/rotacni_enkoder.html.
57
hw.cz: Napájecí zdroj 0-30 V s regulovatelným proudem 2 mA-3 A. [online]. 2005 [cit. 2011-04-29]. Dostupný z WWW: http://hw.cz/Teorie-a-praxe/Konstrukce/ART1438-Napajeci-zdroj-0-30V-sregulovatelnym-proudem-2mA--3A.html.
58
10 Seznam obrázků Obrázek 1: Blokové schéma síťového napájecího zdroje............................................... 12 Obrázek 2: Znázornění funkce transformátoru ............................................................... 13 Obrázek 3: Můstkový usměrňovač ................................................................................. 14 Obrázek 4: Rozložení vývodů AT89S52 ........................................................................ 19 Obrázek 5: Načasování přenosu SPI............................................................................... 20 Obrázek 6: Schéma zapojení AT89S52 .......................................................................... 23 Obrázek 7: DPS s AT89S52 ........................................................................................... 24 Obrázek 8: Rozmístění součástek a padů ....................................................................... 24 Obrázek 9: Vodivé cesty digitální části z pohledu spojů................................................ 25 Obrázek 10: Schéma analogové části ............................................................................. 27 Obrázek 11: DPS analogové části................................................................................... 30 Obrázek 12: Vodivé cesty analogové části z pohledu spojů........................................... 30 Obrázek 13: Rozložení součástek a padů ....................................................................... 30 Obrázek 14: Schéma zapojení rotačního mikrospínače .................................................. 33 Obrázek 15: Rozpoznání směrů otáčení ......................................................................... 33 Obrázek 16: Rozbor hodnot rotačního mikrospínače ..................................................... 34 Obrázek 17: Rozmístění vývodů MCP4922 ................................................................... 36 Obrázek 18: Schéma zapojení MCP4922 ....................................................................... 37 Obrázek 19: Časování komunikace na SPI..................................................................... 37 Obrázek 20: Formát přenášených dat ............................................................................. 38 Obrázek 21: Schéma zapojení LCD displeje .................................................................. 39 Obrázek 22: Inicializace 4bitové komunikace LCD displeje ......................................... 40
59
11 Seznam tabulek Tabulka 1: Hodnoty z portu P1 prvního enkodéru – směr doprava................................ 35 Tabulka 2: Hodnoty z portu P1 prvního enkodéru – směr doleva .................................. 35
60
12 Seznam příloh na CD Složky: •
Datasheets – datasheety nejvýznamnějších součástek,
•
Eagle – vytvořené projekty,
•
Keil – vývojové prostředí pro program mikroprocesoru,
•
Software – Program mikroprocesoru.
61