Bakalářská práce - Vysoké učení technické v Brně

Transkript

Bakalářská práce - Vysoké učení technické v Brně
VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ
BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH
TECHNOLOGIÍ
ÚSTAV RADIOELEKTRONIKY
FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION
DEPARTMENT OF RADIO ELECTRONICS
ŘÍZENÍ ANTÉNNÍHO ROTÁTORU POMOCÍ
MIKROPROCESORU ATMEL
TUNING OF ANTENNAS ROTATOR BY MICROPROCESSOR ATMEL
BAKALÁŘSKÁ PRÁCE
BACHELOR THESIS
AUTOR PRÁCE
PETR ZATLOUKAL
AUTHOR
VEDOUCÍ PRÁCE
SUPERVISOR
BRNO 2010
Ing. ZBYNĚK LUKEŠ, Ph.D.
LICENČNÍ SMLOUVA
POSKYTOVANÁ K VÝKONU PRÁVA UŽÍT ŠKOLNÍ DÍLO
uzavřená mezi smluvními stranami:
1. Pan/paní
Jméno a příjmení:
Bytem:
Petr Zatloukal
Machátova 379/18/B
Olomouc – Slavonín, 78301
7. října 1987 ve Šternberku
Narozen/a (datum a místo):
(dále jen „autor“)
a
2. Vysoké učení technické v Brně
Fakulta elektrotechniky a komunikačních technologií
se sídlem Údolní 53, Brno, 602 00
jejímž jménem jedná na základě písemného pověření děkanem fakulty:
prof. Dr. Ing. Zbyněk Raida, předseda rady oboru Elektronika a sdělovací
technika (dále jen „nabyvatel“)
Čl. 1
Specifikace školního díla
A Předmětem této smlouvy je vysokoškolská kvalifikační práce (VŠKP):
 disertační práce
 diplomová práce
 bakalářská práce
 jiná práce, jejíž druh je specifikován
jako ...................................................... (dále jen VŠKP nebo dílo)
Název VŠKP:
Vedoucí/ školitel VŠKP:
Ústav:
Datum obhajoby VŠKP:
Řízení anténního rotátoru pomocí mikroprocesoru Atmel
Ing. Zbyněk Lukeš Ph.D.
Ústav radioelektroniky
__________________
VŠKP odevzdal autor nabyvateli*:
 v tištěné formě – počet exemplářů: 2
 v elektronické formě – počet exemplářů: 2
B Autor prohlašuje, že vytvořil samostatnou vlastní tvůrčí činností dílo shora popsané
a specifikované. Autor dále prohlašuje, že při zpracovávání díla se sám nedostal
do rozporu s autorským zákonem a předpisy souvisejícími a že je dílo dílem
původním.
C Dílo je chráněno jako dílo dle autorského zákona v platném znění.
D Autor potvrzuje, že listinná a elektronická verze díla je identická.
*
hodící se zaškrtněte
Článek 2
Udělení licenčního oprávnění
1. Autor touto smlouvou poskytuje nabyvateli oprávnění (licenci) k výkonu práva
uvedené dílo nevýdělečně užít, archivovat a zpřístupnit ke studijním, výukovým
a výzkumným účelům včetně pořizovaní výpisů, opisů a rozmnoženin.
2. Licence je poskytována celosvětově, pro celou dobu trvání autorských a majetkových
práv k dílu.
3. Autor souhlasí se zveřejněním díla v databázi přístupné v mezinárodní síti
 ihned po uzavření této smlouvy
 1 rok po uzavření této smlouvy
 3 roky po uzavření této smlouvy
 5 let po uzavření této smlouvy
 10 let po uzavření této smlouvy
(z důvodu utajení v něm obsažených informací)
4. Nevýdělečné zveřejňování díla nabyvatelem v souladu s ustanovením § 47b zákona
č. 111/ 1998 Sb., v platném znění, nevyžaduje licenci a nabyvatel je k němu povinen
a oprávněn ze zákona.
Článek 3
Závěrečná ustanovení
[1]Smlouva je sepsána ve třech vyhotoveních s platností originálu, přičemž po jednom
vyhotovení obdrží autor a nabyvatel, další vyhotovení je vloženo do VŠKP.
[2]Vztahy mezi smluvními stranami vzniklé a neupravené touto smlouvou se řídí
autorským zákonem, občanským zákoníkem, vysokoškolským zákonem, zákonem o
archivnictví, v platném znění a popř. dalšími právními předpisy.
[3]Licenční smlouva byla uzavřena na základě svobodné a pravé vůle smluvních stran,
s plným porozuměním jejímu textu i důsledkům, nikoliv v tísni a za nápadně
nevýhodných podmínek.
[4]Licenční smlouva nabývá platnosti a účinnosti dnem jejího podpisu oběma
smluvními stranami.
V Brně dne: 28. května 2010
…...........................................................
Nabyvatel
…...........................................................
Autor
ABSTRAKT
Bakalářská práce se zabývá návrhem a realizací obvodu pro řízení a diagnostiku stavu
komerčně dostupných anténních rotátorů, které obecně slouží k natáčení antén
s úzkou – směrovou vyzařovací charakteristikou do požadovaného směru příjmu
a vysílání. Rotátory řízené mikrokontrolery jsou z principu schopny komunikovat s
osobními počítači, které mohou být použity pro případnou automatizaci měření
a do kterých se dnes nejčastěji prostřednictvím softwarových deníků zapisují data
o uskutečněných radiových spojeních v radioamatérském provozu.
KLÍČOVÁ SLOVA
řídící modul anténního rotátoru, řízení mikrokontrolerem, AVR, ATmega16
ABSTRACT
The bachelor thesis deals with design and realization of a tool for controlling and
diagnosing of the state of commercially available antenna rotators, which serve
for angling of narrow directional antennas to the required direction of receiving
and transmitting.
Antenna
rotators
controlled
by microcontroller
are
able to communicate with personal computers, which might be used for appropriate
measuring automatisation and are today used for collecting data about realized radio
amateur connections through software logs.
KEYWORDS
antenna rotator controller, microcontroller managed, AVR, ATmega16
ZATLOUKAL, P. Řízení anténního rotátoru pomoci mikroprocesoru Atmel. Brno:
Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií,
2010. 54 s. Vedoucí bakalářské práce Ing. Zbyněk Lukeš, Ph.D.
PROHLÁŠENÍ
Prohlašuji, že svou bakalářskou práci na téma Řízení anténního rotátoru pomocí
mikroprocesoru Atmel jsem vypracoval samostatně pod vedením vedoucího bakalářské
práce a s použitím odborné literatury a dalších informačních zdrojů, které jsou všechny
citovány v práci a uvedeny v seznamu literatury na konci práce.
Jako autor uvedené bakalářské práce dále prohlašuji, že v souvislosti s vytvořením
této bakalářské práce jsem neporušil autorská práva třetích osob, zejména jsem nezasáhl
nedovoleným způsobem do cizích autorských práv osobnostních a jsem si plně vědom
následků porušení ustanovení § 11 a následujících autorského zákona č. 121/2000 Sb.,
včetně možných trestněprávních důsledků vyplývajících z ustanovení § 152 trestního
zákona č. 140/1961 Sb.
V Brně dne
....................................
(podpis autora)
PODĚKOVÁNÍ
Děkuji vedoucímu bakalářské práce Ing. Zbyňkovi Lukešovi, Ph.D. a Ing. Václavovi
Šnajdrovi za účinnou metodickou, pedagogickou a odbornou pomoc a další cenné rady
při zpracování mé bakalářské práce.
V Brně dne
....................................
(podpis autora)
OBSAH
Seznam obrázků..............................................................................................................x
Seznam tabulek..............................................................................................................xi
Úvod.................................................................................................................................1
1 Rotátory Yaesu a Create............................................................................................2
1.1 Rozbor stávajících výrobků............................................................................2
1.2 Odlišnosti řídících modulů Yaesu..................................................................3
1.3 Odlišnosti řídících modulů Create..................................................................3
1.4 Komunikace s řídícím modulem rotátoru.......................................................3
1.4.1 Rádiová stanice – řídící modul rotátoru..................................................3
1.4.2 Řídící modul rotátoru – osobní počítač (PC)..........................................4
1.5 Mechanické parametry rotátoru Create RC–5................................................4
2 Návrh řízení mikrokontrolerem................................................................................5
2.1 Výběr mikrokontroleru...................................................................................5
2.2 Návrh výkonové části.....................................................................................5
2.3 Generování PWM pro řízení rychlosti otáčení...............................................7
2.4 A/D převody...................................................................................................9
2.5 Sériová linka, USB a převodník FT232........................................................10
2.6 LCD display s řadičem HD4478...................................................................10
2.7 Rotační snímač natočení...............................................................................11
2.8 Běh programu, kalibrace...............................................................................12
2.8.1 Uložení kalibračních hodnot do EEPROM...........................................13
2.9 Popis obsluhy a připojení řídícího modulu rotátoru.....................................14
2.9.1 Ovládací prvky předního panelu řídícího modulu rotátoru...................15
2.9.2 Zadní panel řídícího modulu rotátoru...................................................15
2.9.3 Ukázky obsluhy anténního rotátoru a připojení modulu.......................16
3 Obslužný software a HRD®.....................................................................................17
3.1 Program Řízení rotátoru...............................................................................17
3.1.1 Vlastnosti programu..............................................................................17
3.1.2 Stručný popis funkce ovládacího programu..........................................17
3.1.3 Sériový port...........................................................................................17
3.2 Kompatibilita s Ham Radio Deluxe®...........................................................19
3.3 Vytvářený program ve vývojovém prostředí................................................19
4 Testování řídícího modulu rotátoru........................................................................20
4.1 Rozsah regulace rychlosti otáčení................................................................20
4.2 Přesnost natočení..........................................................................................20
4.3 Elektrické parametry.....................................................................................20
4.4 Mechanické parametry..................................................................................20
5 Závěr..........................................................................................................................21
Literatura......................................................................................................................22
Seznam symbolů, veličin a zkratek.............................................................................23
Seznam příloh...............................................................................................................24
SEZNAM OBRÁZKŮ
obr. 1: Všesměrová anténa.................................................................................................1
obr. 2: Směrová anténa......................................................................................................1
obr. 3: Zapojení motoru rotátoru a koncových spínačů (krajní poloha)............................2
obr. 4: Můstek motoru rotátoru s bipolárními tranzistory.................................................5
obr. 5: Můstek motoru rotátoru s unipolárními tranzistory...............................................7
obr. 6: Principiální schéma vyhodnocení úhlu natočení rotátoru......................................9
obr. 7: Doporučené zapojení výrobce, výstupní průběhy snímače polohy......................11
obr. 8: Závislost zpětnovazebního napětí na natočení rotátoru.......................................13
obr. 9: Blokové schéma možného uspořádání pracoviště................................................14
obr. 10: Přední panel řídícího modulu rotátoru...............................................................15
obr. 11: Zadní panel řídícího modulu rotátoru................................................................15
obr. 12: Obsluha rotátoru pomocí programu Řízení anténního rotátoru.........................16
obr. 13: Obsluha rotátoru terminálovým programem HyperTerminal® (Windows®)...16
obr. 14: Obsluha rotátoru programem Ham Radio Deluxe®..........................................16
obr. 15: Výpis Správce zařízení (Windows®).................................................................16
obr. 16: Rozpracovaný program ve vývojovém prostředí Turbo C++ 2006®................19
ix
SEZNAM TABULEK
tab. 1: CAT příkazy pro obsluhu rotátoru..........................................................................3
tab. 2: Vybrané příkazy pro obsluhu rotátoru pomocí převodníku GS-232......................4
tab. 3: Vybrané mechanické a elektrické parametry rotátoru Create RC–5......................4
tab. 4: Příkazy pro obsluhu řídícího modulu rotátoru......................................................14
tab. 5: Popis předního ovládacího panelu řídícího modulu rotátoru................................15
tab. 6: Popis konektorů a svorek zadího panelu řídícího modulu rotátoru......................15
x
ÚVOD
Antény jsou nezbytnou součástí rádiové přenosové trasy. Mohou se dělit podle toho,
zda vyzařují elektromagnetické vlny do všech směrů stejně, nebo zda jsou schopny
energii koncentrovat do užšího prostoru. Jedná se pak o antény všesměrové
nebo směrové.
Všesměrové antény jsou většinou pevně umístěny a jejich poloha se v průběhu
používání nijak nemění. U směrových antén je situace odlišná. Aby se daly přijímat
rádiové signály a služby z různých směrů, je potřeba anténu umístit tak, aby maximum
její vyzařovací charakteristiky směřovalo právě do toho směru, odkud přijímaný rádiový
signál přichází. Toto pak platí i pro vysílání.
Pokud jsou ze směrových antén sestaveny pevné přenosové trasy, manipuluje se
se směrovou anténou pouze při prvotní instalaci. Pokud jsou ale potřebné vlastnosti
směrové antény a zároveň je potřeba přijímat a vysílat rádiový signál postupně
z různých a do různých směrů – takový požadavek může vzniknout při radiolokaci
stejně tak dobře jako při radioamatérském provozu – musí být anténa snadno a rychle
směrovatelná přímo za provozu.
Zařízení, která umožňují změnu azimutu antény popřípadě i jejího elevačního úhlu se
nazývají anténní rotátory. Tato práce se zabývá pouze rotátory s možností změnit úhel
natočení antény – azimut.
Samotné rotátory se skládají nejčastěji ze stejnosměrného motoru, jehož otáčky se
dají měnit pouhým přepólováním napájecího napětí, převodovky do pomala
a převodníku úhlu natočení na eklektickou veličinu. V nejjednodušším případě je tento
převodník vytvořen tak, že je s výstupní hřídelí rotátoru spojen běžec precizního více
otáčkového potenciometru. Všechny tyto části jsou uloženy v těle rotátoru, který je pak
možno dobře mechanicky přichytit k anténnímu stožáru nebo namontovat do jeho paty.
Následující ilustrativní grafy dokreslují pojem všesměrové a směrové antény. Jedná
se o změřené relativní velikosti intenzity elektrického pole kolem antény v závislosti na
směru (úhlu), ze kterého bylo měření provedeno. Je vidět, že směrová anténa nyní
nejlépe vyzařuje (přijímá) z pomyslného směru 45°, kdybychom chtěli pomyslný směr
např. 90°, museli bychom anténu pootočit.
obr. 1: Všesměrová anténa
obr. 2: Směrová anténa
1
1
ROTÁTORY YAESU A CREATE
1.1 Rozbor stávajících výrobků
Rotátory firmy Yaesu i Create jsou osazeny stejnosměrnými komutátorovými motory.
Někdy mohou být rotátory osazeny i krokovými motory, jejich řízení ale potom
vyžaduje složitější řídící obvody. Změna smyslu otáčení komutátorového motoru a tím
i rotátoru je provedena změnou směru toku proudu motorem. Toho se docílí jeho
přepólováním.
Maximální úhel přetočení rotátoru je omezen mechanickými spínači uvnitř rotátoru,
které jsou v sérii s jeho motorem a jsou přemostěny polovodičovou diodou tak, aby
v případě vytočení rotátoru do krajní polohy a rozepnutí koncového spínače byl
proudový okruh uzavřen pro případný opačný směr proudu otáčející rotátor na druhou
stranu. Viz obrázek obr. 3.
obr. 3: Zapojení motoru rotátoru a koncových spínačů (krajní poloha)
Pro účely řízení natočení rotátoru je jeho výstupní hřídel spřažena s hřídelí
zpětnovazebního potenciometru.
Indikaci natočení rotátoru se většinou provádí na řídícím modulu rotátoru. U řídících
modulů firem Yaesu i Create je ručka indikátoru natáčena malým stejnosměrným
komutátorovým motorem. Motor indikátoru je opět spřažen s hřídelí zpětnovazebního
potenciometru a celý mechanismus se až na robustnost a velikost velice podobá
samotnému mechanismu rotátoru.
Řízení rychlosti otáčení je u těchto modulů provedeno sériovou regulací napětí
bipolárním či unipolárním výkonovým tranzistorem. U obou firem pracují regulátory
pravděpodobně (u řídících modulů firmy Create jistě) ve spojitém režimu. Tato metoda
regulace není sice příliš energeticky výhodná, ale neprodukuje téměř žádné
elektromagnetické rušení jako je tomu u regulátorů pulzně řízených. Tím pádem odpadá
nutnost jakékoli filtrace stejně tak jako případné problémy s rušením příjmu.
2
1.2 Odlišnosti řídících modulů Yaesu
➢ změna otáček motoru jeho přepólováním je prováděna dvojicí výkonových relé
➢ řízení je částečně osazeno číslicovými obvody
1.3 Odlišnosti řídících modulů Create
➢ změna otáček motoru jeho přepólováním je prováděna mechanickým
přepínačem
➢ řízení je plně analogové
1.4 Komunikace s řídícím modulem rotátoru
1.4.1 Rádiová stanice – řídící modul rotátoru
Řídící modul rotátoru firmy Yaesu lze přímo propojit s rádiovou stanicí stejné
značky. Obsluha anténního rotátoru pak může probíhat pomocí samotné stanice.
Rádiová stanice se dále nechá ovládat pomocí osobního počítače. Komunikace
probíhá podle komunikačního protokolu CAT (Computer Aided Transceiver).
Hardwarově je vyřešena pomocí sériového portu (RS-232). Protokol CAT obsahuje
příkazy složené z kombinací alfanumerických znaků. Jednotlivé příkazy jsou vždy
ukončeny znakem „ ; “ – středník. Komunikace počítače a stanice je obousměrná.
Tzn. že aktuální nastavení stanice, potažmo rotátoru, anténních tunerů popř. dalších
prvků se dají číst i měnit.
Sada příkazů obsluhy rotátoru je popsána tabulkou tab. 1, převzato z [15]
tab. 1: CAT příkazy pro obsluhu rotátoru
Rotátor se tedy dá roztočit podle nebo proti směru hodinových ručiček, příkaz by pak
byl „RO2;“ nebo „RO1;“. Nechá se zastavit příkazem „RO0;“. Změna rychlosti otáčení
může být po 1% snižována nebo zvyšována příkazy „RO3;“ nebo „RO4;“. Pokud
chceme odečíst stav rotátoru, pošleme příkaz „RO;“. Odpověď je pak ve tvaru „RO
stav_rotátoru natočení_rotátoru_ve_stupních rychlost_otáčení_rotátoru_v_procentech;“.
Anténní rotátor je tedy propojen s rádiovou stanicí a ta je připojena k osobnímu
počítači. Ovládání rotátoru lze uskutečnit přímo ze stanice nebo může být dálkově
ovládána celá stanice včetně rotátoru pomocí počítače.
3
1.4.2 Řídící modul rotátoru – osobní počítač (PC)
Hardwarové propojení stanice a řídícího modulu rotátoru lze přímo uskutečnit pouze
u vysokých modelových řad tranceiverů Yaesu. Pokud je použita stanice bez
harwarového výstupu pro řízení rotátoru, mže být anténa natáčena pomocí ovládacích
prvků na samotném řídícím modulu anténního rotátoru. Obsluha antény může být ale
realizována i prostřednictvím osobního počítače. Řídící modul rotátoru je pak
k osobnímu počítači připojen pomocí převodníku s označením Yaesu GS-232A nebo
GS-232B. Propojení modulu GS-232 a počítače je vyřešeno pomocí sériové linky RS232.
tab. 2: Vybrané příkazy pro obsluhu rotátoru pomocí převodníku GS-232
Příkaz
Mxxx
reakce
směr
rotátor natočí anténu do požadovaného azimutu xxx od 000 do 360°
zápis
C
žádost o aktuální azimut, vrátí se „+0xxx“ kde xxx je aktuální azimut°
čtení
C2
žádost o aktuální azimut a elevaci, vrátí se „+0xxx+0yyy“
kde xxx je aktuální azimut° a yyy aktuální elevace°
čtení
R
rotátor zahájí natáčení vpravo
zápis
L
rotátor zahájí natáčení vlevo
zápis
zastavení rotátoru
zápis
S nebo A
Xn
Wxxxyyy
žádost o nastavení rychlosti otáčení rotátoru (pouze v azimutu, elevační rychlost
zápis
se nedá regulovat), kde n je celé číslo 1 až 4, regulace má tedy 4 stupně
nastavení azimutu a elevace antény
(xxx azimut 000° až 360°, yyy elevace 000° až 180°)
zápis
Některé příkazy využívá i navržený řídící modul anténního rotátoru řízený
mikropočítačem Atmel kvůli dosažení kompatibility s programy pro dálkovou správu
rádiových stanic a jejich příslušenství. Např. Ham Radio Deluxe®.
1.5 Mechanické parametry rotátoru Create RC–5
tab. 3: Vybrané mechanické a elektrické parametry rotátoru Create RC–5
Parametr
hodnota
kroutící moment
50Nm
brzdící moment
900Nm
maximální vertikální zatížení
400kg
rychlost otáčení
1 ot. min-1 max.
průměr stožáru
48 až 65mm
váha rotátoru
5kg
elektrický výkon
6W
napájecí napětí/proudový odběr
15V(DC) max./3A
přesnost natočení rotátoru podle zpětné vazby
±3°
převod do pomala
šnekový
4
2
NÁVRH ŘÍZENÍ MIKROKONTROLEREM
2.1 Výběr mikrokontroleru
Výběr mikrokontroleru byl ovlivněn požadavkem na dostatečný počet vstupně
výstupních bran. Předpokládala se komunikace s řadičem LCD displaye, ovládání
natočení rotátoru tlačítky z řídícího panelu rotátoru, indikace směru otáčení rotátoru
dvěma LED diodami na panelu rotátoru, zadávání nového úhlu natočení rotátoru
rotačním enkodérem, komunikace s PC přes USB (pomocí USB/UART převodníku),
pulzně šířková regulace výstupního napájecího napětí (PWM) pro motor rotátoru. Další
vstupně výstupní brány jsou ponechány pro možné pozdější rozšíření komunikace
řídícího modulu rotátoru se samotnou radiovou stanicí. Výběr mikrokontroleru byl dále
zúžen požadavkem na pohodlné vytvoření programu pro mikrokontroler ve vyšším
programovacím jazyce C, nikoliv v jazyce symbolických adres. Těmto požadavkům
vyhovuje například mikrokontroler Atmega16 řady AVR firmy Atmel. Vzhledem
k dobrým zkušenostem s tímto mikrokontrolerem byl nakonec pro řízení anténního
rotátoru vybrán.
2.2 Návrh výkonové části
Ovládání motoru rotátoru bylo vyřešeno můstkem z polovodičových prvků, viz
obr. 1. Pro změnu otáček motoru je zapotřebí měnit polaritu jeho napájecího napětí.
Tato změna by se dala provést i mechanickým přepínačem nebo pomocí relé tak, jak je
to běžnou praxí u komerčních řídících modulů. Řešení polovodičovým můstkem bylo
zvoleno kvůli možnosti snadného rozšíření o řízení rychlosti otáčení motoru pulzně
šířkovou modulací (PWM), která by se dala generovat řídícím mikrokontroler.
obr. 4: Můstek motoru rotátoru s bipolárními tranzistory
Jako výkonové spínací tranzistory T1 až T4 byly vybrány typ BD243 (vodivost N)
a BD244 (vodivost P). Antiparalelně k tranzistorům jsou zapojeny ochranné – nulové
5
diody D1 až D4 1N4148, které slouží k ochraně tranzistorů před napěťovými špičkami,
které vznikají při jejich vypnutí, protože je můstek zatížen částečně induktivní zátěží
(motor rotátoru). Diody D4 a D2 tedy v okamžiku vypnutí tranzistorů T3 a T1 převezmou
proud tekoucí indukčností a umožní tak její vybití. Stejná situace platí i pro diody D3
a D1 při rozepnutí T4 a T2.
Můstek byl dimenzován s rezervou na maximální proud 3 A. Z datasheetu, resp.
z převodní charakteristiky pro tranzistory BD243 a BD244 bylo odečteno, že proudový
zesilovací činitel je při kolektorovém proudu I C =3 A roven asi h 21 E ≃40 .
To znamená, že do báze by měl téci proud alespoň
I B≥
IC
3
= ≃75 mA .
h21 E 40
(1)
Proud 75 mA je relativně vysoká hodnota, pokud by měl být dodán přímo z portu
mikrokontroleru. Je tedy potřeba před výkonový tranzistor zapojit ještě budící stupeň.
Jako budící tranzistory byly zvoleny BC337 (vodivost N). Jejich proudový zesilovací
činitel při I C =75 mA byl pesimisticky odhadnut h 21 E =100 , stejně tak jako napětí
kolektor - emitor v saturaci U CEsat =0,4 V . Bázové rezistory výkonových prvků jsou
potom vypočítány jako
U CC −U CEsat −U BE 12−0,4−0,8
=
≃120 Ω
IB
75⋅10−3
(2)
kde UCC je napájecí napětí, UCEsat je saturační napětí kolektor - emitor budícího
tranzistoru a UBE napětí báze - emitor výkonového tranzistoru. Výsledný odpor byl
zaokrouhlen směrem k nejbližšímu nižšímu v řadě.
Kolektory budících tranzistorů poteče proud asi 75 mA, při proudovém zesilovacím
činiteli h 21 E =100 by měl být proud bází větší než 750 μA (po modifikaci ze vztahu 1).
Odpory rezistorů mezi bázemi budících tranzistorů a porty mikrokontroleru jsou pak
pro tranzistory T7 a T8 zvoleny 3,9 kΩ, pro T5 a T6 3,3 kΩ s ohledem na dva přechody
v sérii (po modifikaci ze vztahu 2).
Při proudu 75 mA a úbytku napětí asi 10,9 V vzniká na bázových odporech
výkonových prvků tepelná ztráta
2
−3 2
P C = R⋅I =120⋅75⋅10  ≃675 mW
(3)
na samotném plně zatíženém výkonovém prvku pak asi
P C =U CEsat⋅I C =0,3⋅3≃0,9 W
(4)
Tranzistory v pouzdru TO220 nelze se ztrátovými výkony kolem 1 W bez chladiče
dost dobře provozovat. DPS (deska plošných spojů) měla být podle současných trendů
co nejmenší, proto byla montáž chladičů tranzistorů zavržena stejně tak jako celá
koncepce polovodičového můstku osazeného bipolárními tranzistory.
6
Východiskem z této situace je použití výkonových unipolárních tranzistorů
MOSFET (tranzistory řízené polem), které mají nízký odpor otevřeného kanálu.
S rezervou byly zvoleny IFRZ44 (kanál N) a IRF4905 (kanál P). Můstek byl sestaven
viz obr. 2. Pro plné otevření unipolárních tranzistorů je potřeba napětí o velikosti asi 8
až 10 V, maximální napětí výstupního portu mikrokontroleru je 5 V. Proto musí být
zapojení doplněno o potenciálové oddělení můstku a mikrokontroleru. Toto se nechá
lehce realizovat čtveřicí optočlenů. Svítiví prvek je ovládán mikrokontrolerem, výstupní
tranzistor připojuje řídící elektrodu na kladné napájecí napětí (v případě IRFZ44) nebo
na nulový potenciál (v případě IRF4905).
obr. 5: Můstek motoru rotátoru s unipolárními tranzistory
Rezistory s odporem 10 kΩ mají za úkol definovat klidový - uzavřený stav můstku.
Zenerovy diody zapojené mezi elektrodami gate a source chrání řídící elektrody
tranzistorů před nebezpečným napětím, které by mohlo prorazit izolaci řídící elektrody
od zbytku polovodiče. Rezistory s hodnotou odporu 1 kΩ tvoří případný pracovní odpor
zenerovým - ochranným diodám, jinak by mohly být vypuštěny.
2.3 Generování PWM pro řízení rychlosti otáčení
Generování časového průběhu napětí pro PWM modulaci probíhá v mikrokontroleru
hardwarově, tzn. mimo běh programu. Toto výrazně zjednodušuje obslužný program
mikrokontroleru.
Generování PWM probíhá na základě hardwarových porovnávacích jednotek. To jsou
vnitřní jednotky mikrokontroleru, které jsou schopny porovnávat aktuální obsah registru
určitého čítače s uživatelem zadanou hodnotou a při shodě jsou schopny vyvolat
přerušení, přepsat stav výstupního portu atp.
V tomto případě je časování PWM zajištěno interním čítačem 1 mikrokontroleru
ATmega16. Mód generování PWM je nastaven na rychlou PWM řízenou 8 bitovým
7
časovačem. Před dělička časovače je nastavena na dělící poměr ND 256. Jednotlivé fáze
vytváření PWM průběhu by se daly pro toto nastavení popsat tak, že při přetečení
časovače 1 je výstupní brána daného PWM kanálu nastavena do vysoké úrovně.
Hodinový signál mikrokontroleru běží, jsou vykonávány nesouvisející instrukce
a na pozadí se s každou jeho 256. periodou zvyšuje obsah registru časovače 1
o jedničku. Obsah registru časovače a paměťového místa, kde je uložena hodnota
k porovnání, je neustále monitorován hardwarovou porovnávací jednotkou.
V okamžiku, kdy je obsah těchto dvou paměťových míst stejný, nastaví se výstupní
brána daného PWM kanálu do nízké úrovně.
Podle velikosti čísla k porovnání je tedy možné řídit čas trvání vysoké resp. nízké
úrovně na výstupní bráně daného PWM kanálu vzhledem k opakovací periodě.
Ovlivňuje se tak tedy činitel plnění výstupního obdélníkového průběhu napětí DCL.
S měnícím se činitelem plnění DCL se mění také střední hodnota výstupního napětí
U střední =
DCL [%]
⋅U H
100 %
(5)
kde UH je velikost napájecího napětí, nebo napětí vysoké úrovně.
PWM průběh napětí je veden na vysílací stranu optočlenu, který na svém výstupu
ovládá příslušné řídící elektrody výkonových spínacích tranzistorů. Na měnící se střední
hodnotu výstupního napětí reaguje motor rotátoru kýženou změnou otáček.
Při hodinovém kmitočtu mikrokontroleru 8 MHz je jedna perioda hodinového signálu
rovna
T OSC =
1
f OSC
=
1
=125 ns
8⋅106
(6)
S velikostí dělícího poměru děličky čítače ND je doba přetečení n - bitového časovače
rovna
t=T OSC⋅N D⋅2n =125⋅10−9⋅265⋅28 ≃8,2 ms frekvence asi 120 Hz
(7)
Generovaný PWM průběh má tedy parametry f ≃120Hz , 0 %DCL [%]≤100 % .
Jestliže je můstek napájen asi 12 V, jsme schopni regulovat střední hodnotu výstupního
napětí v rozmezí 0 VU střední ≤12 V (pro jednoduchost jsou zde zanedbány úbytky
napětí na otevřených kanálech spínacích prvků). Obnovovací frekvence PWM byla
s ohledem na hardwarové možnosti zvoleného mikrokontroleru a hlavně s ohledem
na optimální chování motoru při této obnovovací frekvencí zvolena na asi 120 Hz.
PWM regulace výkonu má dobrou účinnost blížící se v teoretické rovině ke 100%,
nevýhodou je obdélníkové výstupní napětí, které má spektrum bohaté na vyšší
harmonické složky.
8
2.4 A/D převody
A/D převod je obecně vyjádření elektrické veličiny na její číselnou reprezentaci
s přihlédnutím k velikosti veličiny referenční. Přesnost, respektive rozlišení A/D
převodu je dána efektivním počtem bitů daného převodníku. Efektivní počet bitů
znamená počet bitů, jež se dají považovat za relevantní. To znamená, že nejsou
postiženy vlastním šumem převodníku apod.
Při všech A/D převodech potřebných k řízení anténního rotátoru je využíván
interní 10 bitový napěťový A/D převodník mikrokontroleru ATmega16 s 8 kanálovým
programově ovládatelným multiplexorem. Jedná se o převody spojené s řízením
rychlosti otáčení rotátoru a převody spojené s vyhodnocováním aktuálního natočení
rotátoru.
Pro A/D převod platí
m=
U
n
⋅2 −1
U ref
(8)
kde m je výsledná číselná reprezentace převáděného napětí, U je vstupní – převáděné
napětí, Uref je napětí referenční a n počet bitů daného A/D převodníku.
Úhel natočení rotátoru je vyhodnocován podle principiálního schematu zapojení viz.
obr. 3. Výstupní hřídel rotátoru je spojena s hřídelí více otáčkového potenciometru
uvnitř těla rotátoru. Potenciometr je zapojen jako dělič napětí napájený 5 V, jeho výstup
je přiveden na vstup 0 multiplexoru A/D převodníku.
Podobným způsoben je řízena i rychlost otáčení rotátoru. Na panelu řídícího modulu
je umístěn potenciometr zapojený jako dělič napětí, jehož výstup je přiveden na vstup 1
multiplexoru A/D převodníku. Jeho výstupní napětí korespondující s požadovanou
rychlostí otáčení je opět převedeno na jeho číselný obraz. Touto hodnotou jsou
po zahození dvou bitů s nejnižší váhou plněny registry výstupních porovnávacích
jednotek PWM.
výstupní příruba
rotátoru
+5 V
ATmega16
převodovka
UCC, Uref
rotátor
U
A/D_0
A/D_1
A/D_2
.
.
M
část řízení
obr. 6: Principiální schéma vyhodnocení úhlu natočení rotátoru
9
2.5 Sériová linka, USB a převodník FT232
Komunikace s PC byla vyřešena pomocí sériového komunikačního modulu (UART)
mikrokontroleru ATmega16. Pro komunikaci byl vybrán asynchronní režim, 8 datových
bitů, žádná paritní kontrola, jeden stop bit, bitová rychlost 9600 bit/s, datový tok není
nijak řízen.
V dnešní době přestává být většina přenosných osobních počítačů osazována
sériovým portem RS232. Tento trend se začíná projevovat i u stolních počítačů. Sériové
rozhraní RS232 je vytlačováno sériovým rozhraním USB poskytující vyšší komunikační
rychlosti. Na tento trend bylo zareagováno při návrhu a konstrukci řídícího modulu
anténního rotátoru. Mikrokontroler ATmega16 disponující UART komunikačním
modulem byl doplněn o obousměrný převodník USB/UART RL232 firmy FTDI.
Převodník se po připojení USB strany k osobnímu počítači přihlásí operačnímu
systému jako virtuální sériový port, např. COM 3. Obslužný software řízení anténního
rotátoru (nebo např. terminálový program) vyšle příkaz na daný virtuální sériový port,
tato data jsou přenesena přes rozhraní USB, převodník řídícího modulu rotátoru je
přijme a převede na sériový komunikační protokol srozumitelný UART komunikační
jednotce mikrokontroleru. Příkaz je obslužným programem mikrokontroleru dekódován
a vykonán. Komunikace řídícího modulu rotátoru a osobního počítače může může
probíhat obousměrně.
2.6 LCD display s řadičem HD4478
Řídící modul anténní rotátoru byl navrhován jak pro řízení pomocí osobního počítače
tak pomocí obslužných prvků přímo na modulu. Aby bylo možné odečítat aktuální úhel
natočení antény stejně tak jako další pomocné informace, byl řídící modul doplněn
o LCD display.
Byl zvolen jednořádkový maticový LCD display se 16 znaky. Každý znak je tvořen
maticí pixelů o velikosti 5x8. Daný LCD display je již výrobcem doplněn o řadič, který
výrazně usnadňuje jeho obsluhu.
S řadičem je možné komunikovat v 8 nebo 4 bitovém režimu. Byl zvolen 4 bitový
režim, s ohledem na poloviční počet datových vodičů. Ke komunikaci jsou tedy
zapotřebí 4 datové signály DB7 až DB4 , signál R/ S pro rozlišení, zda jsou vysílána
 pro rozlišení, zda se data z řadiče čtou nebo naopak
data nebo instrukce, signál R/ W
 , kterým se určuje okamžik vzorkování
do řadiče zapisují a synchronizační signál E
datové sběrnice. Komunikace tedy hardwarově zabírá bez jednoho pinu celý port
mikrokontroleru.
10
2.7 Rotační snímač natočení
Rotační snímač změny natočení je zařízení, které je schopné převést otáčivý pohyb
na sled elektrických obdélníkových impulzů. Z frekvence vzniklých obdélníkových
průběhů napětí je možné stanovit rychlost otáčení. Z jejich vzájemné fáze potom směr
otáčení. Existuje několik možných konstrukcí rotačních snímačů. S ohledem na cenu
byl zvolen rotační snímač polohy s mechanickými kontakty. Doporučené zapojení
výrobce snímače polohy zobrazuje obr. 7 převzatý z [7].
obr. 7: Doporučené zapojení výrobce, výstupní průběhy snímače polohy
Rotační snímač polohy je na řídícím modulu anténního rotátoru použit pro vložení
nového azimutu, pod který chceme anténu, resp. rotátor natočit.
K řídícímu mikrokontroleru je snímač připojen tak, že sestupná hrana na jednom z
jeho výstupů spouští externí přerušení mikrokontroleru. V této době je vzorkován druhý
výstup snímače. Podle jeho aktuální logické úrovně je vyhodnocen směr otáčení
a upraven obsah proměnné uchovávající zadávaný azimut. Dále je také s každou
sestupnou hranou monitorován (a resetován) stav interního časovače, který
vyhodnocuje, jak rychle se voličem otáčí. Podmínka je velice jednoduchá, pokud je
obsah časovače vyšší než číslo reprezentující stanovený časový úsek (nebo je-li čítač
vypnut, resp. přerušení od jeho přetečení), znamená to, že se voličem otáčí pomalu.
Krok se nastaví na jeden úhlový stupeň pro jemné nastavení požadované hodnoty.
Pokud se ale v přerušení od synchronizace rotačního voliče zjistí, že obsah časovače je
nižší než stanovené číslo, znamená to, že se voličem otáčí dostatečně rychle na to, aby
si systém mohl myslet, že uživatel se s nejvyšší pravděpodobností snaží nastavit azimut
hodně vzdálený od toho současného a nastaví mu krok na deset úhlových stupňů pro
pohodlně hrubé přiblížení se k cílovému azimutu. Pokud je voličem poté otáčeno opět
pomalu, krok se vrátí k jednomu úhlovému stupni pro přesné dostavení.
Snímač polohy je dále vybaven axiálním tlačítkem. Toho je využito pro potvrzení
nově zvoleného azimutu.
Doporučené zapojení výrobce bylo kvůli ošetření mechanických zákmitů doplněno
o filtry. Jedná se jednoduše o připojení keramických kondenzátorů paralelně
ke spínacím kontaktům rotačního voliče. Byl to experimentální počin, který se osvědčil.
Byla tím tak vytvořena jakási RC dolní propust.
11
2.8 Běh programu, kalibrace
Po startu řídícího mikrokontroleru probíhají inicializační procedury. Po jejich
dokončení je na LCD displej vykreslena úvodní obrazovka. V přerušení od interního
časovače probíhají periodicky A/D převody. Monitorují se také požadavky z předního
panelu rotátoru, jsou obnovována data na LCD displeji a je sledován provoz na UART
rozhraní. Rotační enkodér je vybavován v externím přerušení kvůli jeho složitější
funkci (synchronizace na hranu obdélníkového napětí generovaného při jeho otáčení,
kdy se musí rozhodovat o směru jeho otáčení).
Pokud dojde po zapnutí napájení řídícího modulu ke stisku a přidržení obou tlačítek
směru až do odeznění úvodní obrazovky, přejde řídící modul rotátoru do režimu
kalibrace. Ta je popsána v následujících odstavcích.
Z grafu závislosti výstupního napětí zpětnovazebního děliče na úhlu natočení rotátoru
obr. 5 je patrné, že při krajních polohách natočení rotátoru není jeho výstupní napětí
rovno nule nebo maximálnímu – napájecímu napětí (dělič je napájen 5 V stejně jako
řídící mikrokontroler, referenční napětí A/D převodníku je taktéž 5 V). To znamená, že
nulový úhel natočení rotátoru neodpovídá hodnotě A/D převodu 0 a maximální úhel
natočení rotátoru neodpovídá hodnotě A/D převodu 1024 (10 bitový A/D převodník).
Matematickým modelem závislosti výstupního napětí děliče na úhlu natočení rotátoru
je tedy přímka posunutá po vertikální ose souřadného systému. Pro její determinaci je
potřeba vypočítat směrnici a aditivní konstantu.
Výpočet směrnice závislosti výstupního napětí na úhlu natočení:
k=
380
mmax−mmin
(9)
kde mmax a mmin jsou číselné reprezentace UMAX a UMIN.
Výpočet aditivní konstanty:
q=−
380
⋅m =−k⋅m min
m max −m min min
(10)
Výpočet aktuálního úhlu natočení rotátoru pak proběhne jako:
k⋅mq=
380
380
⋅m−
⋅m min
mmax −m min
mmax −mmin
(11)
kde m je číselná reprezentace aktuálního výstupního napětí zpětnovazebního děliče
rotátoru.
12
Hodnoty mmax a mmin se navíc mohou napříč výrobní sérií rotátorů stejného typu lišit.
Nepřesnosti v odečtu úhlu natočení rotátoru jsou kompenzovány výše zmíněným
způsobem.
obr. 8: Závislost zpětnovazebního napětí na natočení rotátoru
Kalibrace prozatím uvažuje pouze rozdílné elektrické parametry a předpokládá stejné
seštelování krajních dorazů napříč výrobní sérií rotátorů tak, že maximální úhel
přetočení je právě 380°. Řídící program dále neuvažuje chybu linearity zpětnovazebního
prvku.
2.8.1 Uložení kalibračních hodnot do EEPROM
Jelikož kalibrace vyžaduje přetočení rotátoru do jedné z krajních poloh a následně do
té druhé, může v závislosti na výchozí poloze rotátoru trvat i 90 sekund při plné
rychlosti otáčení rotátoru. Navíc vyžaduje průběžnou kontrolu a zásahy uživatele.
Aby navíc nebyly kalibrační hodnoty po každém výpadku nebo odpojení napájecího
napětí ztraceny a kalibrace se tak při každém opětovném zapnutí řídícího modulu
nemusela provádět znova, jsou hodnoty uloženy do EEPROM paměti mikropočítače,
která je schopna uložená data udržet i bez napájecího napětí.
Následující část zdrojového kódu mikropočítače zachycuje důležité kalibrační
procedury, které je nutné vykonat.
Správná identifikace horní a dolní krajní polohy
if (r_max <= r_min)
{
azimut_change = r_max; //azimut change
r_max = r_min;
r_min = azimut_change;
}
//prohození horní a dolní meze, pokud je třeba
Uložení proměnné typu integer do EEPROM paměti
#include <avr\eeprom.h>
eeprom_write_word(0x00, r_min);
eeprom_write_word(0x02, r_max);
//zápis do eeprom paměti, adresa, 16b data
//zápis do eeprom paměti, adresa, 16b data
13
2.9 Popis obsluhy a připojení řídícího modulu rotátoru
Aktuální úhel natočení antény lze průběžně odečítat z LCD displeje - B. Nový úhel
natočení antény může být zadán formou číselné hodnoty pomocí rotačního voliče úhlu
natočení - A a potvrzen jeho stiskem, nebo formou příkazu z připojeného PC. Rotátor
může být také spuštěn tlačítky směru - C a D. V tomto případě se pak rotátor bude
otáčet stále na zvolenou stranu až do vypnutí hardwarovými koncovými vypínači uvnitř
rotátoru (vytočení do krajní polohy) nebo do dalšího stisku kteréhokoli tlačítka
směru - C nebo D. Řešení řídícího modulu anténního rotátoru přijímá řídící příkazy ze
všech zdrojů obsluhy, tedy z předního ovládacího panelu a zároveň z osobního počítače.
Napětí pro otáčení rotátoru je vždy indikováno rozsvícením příslušné LED diody
směru - E nebo F. Pokud je ale rotátor vytočen do jedné či druhé krajní polohy a je
zastaven hardwarovými koncovými vypínači, není tento stav nijak indikován, LED
dioda příslušného směru zůstává svítit, napájení motoru rotátoru taktéž zůstává aktivní,
ale rotátor se již dále neotáčí.
Obsluha anténního rotátoru pomocí PC probíhá pomocí komunikace přes příslušný
virtuální sériový port. K tomu může být v nejjednodušším případě využit kterýkoli
terminálový program, např. HyperTerminal® pod systémem Windows®, nebo ovládací
software Řízení anténního rotátoru, který byl pro tento účel vytvořen. Rotátor může být
obsluhován také pomocí programu Ham Radio Deluxe® (podprogram Rotator).
tab. 4: Příkazy pro obsluhu řídícího modulu rotátoru
Příkaz
parametry
reakce
směr
Mxxx
xxx je požadovaný azimut
od 000° do 360°
rotátor natočí anténu
do požadovaného azimutu xxx
zápis
R
L
-
rotátor zahájí natáčení vpravo
zápis
-
rotátor zahájí natáčení vlevo
zápis
S nebo A
-
zastavení rotátoru
zápis
C
-
MPxxx
xxx je požadovaná rychlost
otáčení rotátoru od 0 do 100%
žádost o aktuální azimut, vrátí se
„+0xxx“ kde xxx je aktuální azimut°
uloží se rychlost otáčení, pokud se rotátor
točí, je změna rychlosti otáčení okamžitá
čtení
zápis
Následující obrázek znázorňuje blokové schema uspořádání rádiového pracoviště.
Bloky napájecí zdroj a osobní počítač mohou být připojeny k napájecí síti 230V AC.
obr. 9: Blokové schéma možného uspořádání pracoviště
14
2.9.1 Ovládací prvky předního panelu řídícího modulu rotátoru
obr. 10: Přední panel řídícího modulu rotátoru
tab. 5: Popis předního ovládacího panelu řídícího modulu rotátoru
Ovládací prvek význam
A
rotační volič úhlu natočení rotátoru
(azimutu) s potvrzovacím tlačítkem
B
LCD displej
C,D
tlačítka směru spuštění rotátoru
E,F
LED diody směru otáčení rotátoru
2.9.2 Zadní panel řídícího modulu rotátoru
obr. 11: Zadní panel řídícího modulu rotátoru
tab. 6: Popis konektorů a svorek zadího panelu řídícího modulu rotátoru
Konektor
potenciometr
rotátoru
PC
motor rotátor
napájení
označení
význam
OUT
střed zpětnovazebního děliče napětí (výstup)
5V
napájení zpětnovazebního děliče napětí
GND
zem zpětnovazebního děliče napětí
USB
USB (Universal Serial Bus),
konektor A pro komunikaci s PC
poz
výstup pro motor rotátoru (+), PWM, 12V
neg
výstup pro motor rotátoru (-), PWM, 12V
12 V
hlavní napájení
GND
zem
15
2.9.3 Ukázky obsluhy anténního rotátoru a připojení modulu
Obrázky zachycují různé možnosti obsluhy anténního rotátoru. Konkrétní způsob
obsluhy vždy závisí na rozhodnutí operátora.
obr. 12: Obsluha rotátoru pomocí programu obr. 13: Obsluha rotátoru terminálovým
programem HyperTerminal® (Windows®)
Řízení anténního rotátoru
obr. 14: Obsluha rotátoru programem Ham Radio Deluxe®
Podle následujícího obrázku by mělo vypadat připojení FTDI USB/UART
převodníku (USB Serial Converter), pokud jsou nainstalovány ovladače, vytvoří se
i virtuální sériový port USB Serial Port (např. COM4).
obr. 15: Výpis Správce zařízení (Windows®)
16
3
OBSLUŽNÝ SOFTWARE A HRD®
Pro účely obsluhy anténního rotátoru byl vytvořen ovládací program Řízení rotátoru.
Poskytuje základní povely pro běžný provoz rotátoru. Je koncipován pod operační
systém Windows®, má grafické rozhraní.
3.1 Program Řízení rotátoru
3.1.1 Vlastnosti programu
Ovládací program je napsán v jazyce C, resp. v C++. Byl vytvořen v prostředí Turbo
C++ 2006® za použití grafické nástavby programu. Pro běh programu jsou potřebné
knihovny Borland®, které jsou obsaženy např. v instalačním balíku prostředí Turbo C++
2006®.
3.1.2 Stručný popis funkce ovládacího programu
Nejstyčnější funkcí ovládacího programu je otevření sériového portu osobního
počítače. Jedná se sice o virtuální sériový port (emuluje ho připojení USB převodník
FT232), ale ovládací program k němu přistupuje, jako by šlo o fyzický.
Důležitou části stojící za zmínku je také časování programu. To zabezpečují objekty
T Timer. Jedná se zejména o zpoždění čtení ze sériového portu generované po odeslání
žádosti o aktuální azimut. Prodleva je potřebná pro přijetí žádosti, její zpracování a
odvysílání odpovědi řídícím modulem anténního rotátoru.
Další časovače jsou volitelné. Jeden generuje časové značky pro periodické načítání
azimutu antény a druhý se stará o generování pulzů pro mikroposuv rotátoru.
3.1.3 Sériový port
Obsluha sériového portu probíhá pomocí funkcí API (Application Programming
Interface). Jsou to funkce umožnující programu, resp. programátorovi přístup
k fyzickým (hardwarovým) prostředkům počítače, tedy např. i k sériovému portu.
Následující ukázky zdrojového kódu jazyka C++ se vztahují právě k operacím se
sériovým portem.
Otevření sériového portu
DCB dcbCommPort;
BOOL bPort;
COMMTIMEOUTS CommTimeouts;
DWORD BytesRead;
/*Otevření portu pomocí funkce WIN32 API CreateFile, CreateFile vrátí HANDLE COM_hancle
non-overlapped serial I/O.*/
char com_port[10];
strcpy(com_port, "COM");
strcat(com_port, IntToStr((*ComboBox1).ItemIndex + 1).c_str());
//výběr COM portu
COM_handle = CreateFile(com_port, GENERIC_READ | GENERIC_WRITE, 0, 0,
OPEN_EXISTING, 0, 0);
17
Konfigurace sériového portu
/* Načti aktuální DCB parametry*/
dcbCommPort.DCBlength = sizeof(DCB);
GetCommState(COM_handle, &dcbCommPort);
/*Pomocí funkce WIN32 API BuildCommDCB nachystej konfiguraci portu.*/
if(!BuildCommDCB("baud=9600 parity=N data=8 stop=1", &dcbCommPort))
{
COM_handle = NULL;
}
/*Pomocí funkce WIN32 API SetCommState uplatni aktuální konfiguraciportu z DCB. Pokud by se
nedala uplatnit, zavři port.*/
if(!SetCommState(COM_handle, &dcbCommPort))
{
CloseHandle(COM_handle);
COM_handle = NULL;
}
/*Nachystej CommTimeouts parametry.*/
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 250;
CommTimeouts.WriteTotalTimeoutMultiplier = 1;
/*Pomocí funkce WIN32 API SetCommTimeouts uplatni aktuální konfiguraci z BCD. Pokud se to
nepodaří, zavři port.*/
if(!SetCommTimeouts(COM_handle, &CommTimeouts))
{
CloseHandle(COM_handle);
COM_handle = NULL;
}
while(CommFlag)
{
Application->ProcessMessages();
ReadFile(COM_handle, InBuffer, 100, &BytesRead, NULL);
if(BytesRead)
{
InBuffer[BytesRead] = 0;
}
}
Uzavření sériového portu
CloseHandle(COM_handle);
COM_handle = NULL;
Čtení a zápis probíhají jakoby šlo o operace čtení a zápisu do souboru. Čtení je
provedeno příkazem
ReadFile(COM_handle, InBuffer, 12, &BytesRead, NULL);
//přečte 12 znaků z bufferu sériového portu,
zápis pak příkazy
TransmitCommChar(COM_handle, 'R');
//odešle přes sériový port znaky 'R' - žádost o spuštění otáčení vpravo
FlushFileBuffers(COM_handle);
//nepodmíněné odvysílání bufferu
18
3.2 Kompatibilita s Ham Radio Deluxe®
Kompatibility s programem Ham Radio Deluxe® je dosaženo pouze vhodnou volbou
ovládacích příkazů řídícího modulu rotátoru. Navržený řídící modul používá některé
příkazy, které jsou v podstatě identické s ovládacími příkazy převodníku GS-232 firmy
Yaesu, jehož podpora je v HRD® již zakotvena.
3.3 Vytvářený program ve vývojovém prostředí
Vývojové prostředí umožňuje také vytvoření grafického rozhraní programu. Funguje
to tak, že programátor vybere objekt, např. tlačítko, umístí ho do grafické podoby své
aplikace, dále si vybere funkci tohoto objektu, např. „na kliknutí,“ prostředí samo
vygeneruje patřičný zdrojový kód zabezpečující vybavení kliknutí na příslušné tlačítko
a programátor do něj doplní další zdrojový kód příkazů, které se mají vykonat při stisku
daného tlačítka.
obr. 16: Rozpracovaný program ve vývojovém prostředí Turbo C++ 2006®
Příklad zdrojového kódu vybavení kliknutí na tlačítko T Button:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
funkce_tlacitka();
//funkce provedená při stisku tlačítka Button1
}
19
4
TESTOVÁNÍ ŘÍDÍCÍHO MODULU
ROTÁTORU
4.1 Rozsah regulace rychlosti otáčení
Rychlost otáčení rotátoru se dá regulovat v poměru asi 1 : 2. Minimální čas potřebný
na přetočení rotátoru je při nominálním napětí 13,8 V asi 60 s.
4.2 Přesnost natočení
Výrobce garantuje u samotného modulu rotátoru chybu natočení podle
zpětnovazebního potenciometru ±5 ° . Změřená chyba úhlu natočení rotátoru je menší
±3 ° .
4.3 Elektrické parametry
maximální rozsah napájecího napětí...........................8 - 14 V
maximální odebíraný proud........................................3 A
4.4 Mechanické parametry
výška řídícího modulu.................................................58mm
šířka řídícího modulu..................................................146mm
hloubka řídícího modulu.............................................72mm
hmotnost řídícího modulu...........................................cca 400g
20
5
ZÁVĚR
Byl navržen a sestaven řídící modul anténního rotátoru Create RC–5, který umožňuje
diagnostiku jeho stavu a jeho ovládání. Pomocí realizovaného řídícího modulu
anténního rotátoru lze dosáhnout tedy zejména nastavení požadovaného azimutu
rotátoru a odečtení jeho aktuální hodnoty.
Řídící modul umožňuje sám o sobě jednoduché ovládání rotátoru prostřednictvím
uživatelského rozhraní jeho předního panelu. Je možné ho ale taktéž připojit přes USB
k osobnímu počítači. Na tom může být spuštěna některá z ovládacích aplikací.
V nejjednodušším případě může jít o terminálový program např. HyperTerminal®, může
být použit speciálně pro tento účel vytvořený ovládací program Řízení anténního
rotátoru, nebo se může využít kompatibility navrženého modulu s celosvětově
uznávaným program dálkové obsluhy rádiových stanic a jejich příslušenství Ham Radio
Deluxe®.
Sestavený řídící modul rotátoru prošel prvními testy s tím, že jeho hlavní funkce
pracují správně. Vypisuje aktuální úhel natočení rotátoru na LCD displeji, reaguje
na povely zadané panelovými tlačítky a ovladači, reaguje a odpovídá na povely poslané
přes rozhraní USB ať už přes HyperTerminal®, program Řízení anténního rotátoru nebo
HRD®, dá se regulovat rychlost jeho otáčení (příkazem přes USB).
Uživatelsky příjemná se zdá být např. i automatická úprava kroku rotačního voliče
předního panelu pro zadávání nového azimutu rotátoru. Při pomalém otáčení je jeho
krok nastaven na jeden úhlový stupeň, nicméně pokud je potřeba přemístit se např. přes
tři čtvrtiny možného rozsahu a dojde k rychlému roztočení voliče, nastaví se jeho krok
na deset úhlových stupňů, aby dopravil uživatele rychleji k cílovému úhlu a aby se při
opětovně pomalém otáčení voličem zase vrátil k rozlišení jednoho úhlového stupně
pro co nejpřesnější zadání požadované hodnoty.
Další styčnou vlastností je možnost provedení kalibrace krajních poloh rotátoru, takže
např. při enormních výkyvech teploty při jeho použití nebo při výměně samotného
modulu rotátoru může dojít opětovně k obnovení funkce celého systému v nejvyšší
možné přesnosti. Předností kalibračních procedur je uložení jednou získaných
kalibračních hodnot do volatilní paměti (paměti, která udržuje uložená data i bez
dodávky energie) tak, že je řídící modul byť s minulými kalibračními hodnotami
připraven při dalším zapnutí ihned k provozu. Provádění kalibrace je při uvážení
nutnosti pouze přetočit rotátor postupně do jeho krajních poloh velice jednoduché a je
limitované pouze omezenou rychlostí otáčení rotátoru.
Celý řídící modul je osazen do přístrojové krabice (neparotěsná, nevodotěsná) a je
vybaven šroubovacími konektory s velkoplošnými kontakty nedeformujícími
připojované vodiče pro jednoduchou přenositelnost a snadnou montáž na cílovém nebo
např. i na dočasném vysílacím pracovišti vyžadující pouze úzký plochý šroubovák.
Možná rozšíření a vylepšení:
➢
propojení řídícího modulu rotátoru a samotné stanice Yaesu FT-950
21
LITERATURA
[1] YAESU: Amateur Radio Division of Vertex Standard [online] [cit. 15. 5. 2009].
Dostupné na www: http://www.yaesu.com
[2] Herout, P., Učebnice jazyka C – 1. díl, Kopp, České Budějovice, 2007, 271 stran
[3] Herout, P., Učebnice jazyky C – 2. díl, Kopp,České Budějovice, 2007, 166 stran
[4] Atmel Corporation ATmega16 DATASHEET [online] [cit 6.9.2009]. Dostupné
na http://www.alldatasheet.com (řídící mikropočítač)
[5] AVR [online] [cit. 15. 5. 2009]. Dostupné na www: http://avr.hw.cz/
[6] Fairchild Semiconductor BD243, BD244 DATASHEET [online] [cit. 6.9.2009].
Dostupné na http://www.alldatasheet.com (bipolární výkonové tranzistory)
[7] GM Electronic P-RE20S DATASHEET [online] [cit. 12.10.2009]. Dostupné
na http://www.gme.cz (rotační snímač otočení)
[8] FTDI Ltd. FT232RL DATASHEET [online] [cit.
na http://www.alldatasheet.com (USB/UART převodník)
6.9.2009].
Dostupné
[9] Hitachi Semiconductor HD4478 DATASHEET [online] [cit. 6.9.2009]. Dostupné
na http://www.alldatasheet.com (LCD displej)
[10] NXP
IRFZ44
DATASHEET
[online]
[cit.
6.9.2009].
na http://www.alldatasheet.com (spínací MOSFET N–kanál)
Dostupné
[11] International Rectifier IRF4905 DATASHEET [online] [cit. 6.9.2009]. Dostupné
na http://www.alldatasheet.com (spínací MOSFET P–kanál)
[12] Sharp
PC817B
DATASHEET
[online]
na http://www.alldatasheet.com (optočleny)
[13] YAESU
FT-950
MANUAL
na http://www.yaesu.com
[online]
[cit.
[cit.
6.9.2009].
Dostupné
20.11.2009].
Dostupné
[14] YAESU FT-950_CAT MANUAL [online] [cit. 20.11.2009].
na http://www.yaesu.com (Computer Aided Tranceiver – příkazy)
Dostupné
[15] GS-232A
MANUAL
[online]
[cit.
20.11.2009].
na http://www.yaesu.com (příkazy Yaesu převodníku)
Dostupné
[16] Regulace - automatizace BOR SMR 300-100 [online] [cit. 20.11.2009]. Dostupné
na http://www.regulace.cz (krokové motory)
[17] Creative Design Corp., RC5–1D INSTRUCTION MANUAL, 2nd Edition,
Jun. 2004 (rotátor)
[18] Creative Design Corp., Azimuth Rotators [online] [cit. 26.11.2009]. Dostupné
na http://www.cd-corp.com/eng/ama/top.htm
[19] Fleury P., Frýza T., Breining T., C knihovna pro obsluhu LCD displeje s řadičem
HD44780
[20] Borland C++ Builder 6 Developer’s Guide; 2002.
22
SEZNAM SYMBOLŮ, VELIČIN A ZKRATEK
PWM ....... pulse-width modulation,
pulzně šířková modulace, metoda regulace
střední hodnoty napětí a proudu (výkonu)
DCL ....... Duty CycLe,
činitel plnění [%], základní parametr PWM modulace,
vyjadřuje kolik procent periody trvá vysoká úroveň
A/D ....... Analog/Digital,
převod elektrické veličiny na číselnou reprezentaci
PC ....... Personal Computer,
osobní počítač (přenosný, stolní ..)
USB ....... Universal Serial Bus,
sériové komunikační rozhraní
CAT ....... Computer Aided Transceiver (Yaesu),
dálková obsluha stanice a jejího příslušenství pomocí PC
FET ....... Field Effect Transistor,
tranzistory řízený polem
MOSFET ....... Metal Oxide Semiconductor FET
LCD ....... Liquid Crystal Display,
displej, zobrazovací prvek s tekutými krystaly
LED ....... Light Emitting Diode,
světlo vyzařující dioda
UART ....... Universal Asynchronous Receiver Transmitter,
modul (vysílač a přijímač) sériové linky
RS-232 ....... komunikační standard, resp. RS232C (z roku 1969)
EEPROM ....... Electrically Erasable Programmable Read-Only Memory,
volatilní paměť, je schopna udržet
uložená data i bez dodávky elektrické energie
API ....... Application Programming Interface,
softwarový přístup k hardwarovým prostředkům PC
HRD® ....... Ham Radio Deluxe®,
software pro dálkovou správu stanic a příslušenství
TButton ....... tlačítko, objekt aplikace v jazyce C++
TTimer ....... časovač, objekt aplikace v jazyce C++
23
SEZNAM PŘÍLOH
A
Návrh zařízení........................................................................................................25
A.1
Desky plošných spojů..............................................................................25
A.2
Osazovací výkresy...................................................................................26
A.3
Schema zapojení......................................................................................27
B
Seznam součástek...................................................................................................28
C
přístrojová krabice.................................................................................................29
C.1
Horní část přístrojové krabice..................................................................29
C.2
Dolní část přístrojové krabice..................................................................29
C.3
Přední panel přístrojové krabice..............................................................29
D
Zdrojový kód mikrokontroleru............................................................................30
E
Zdrojový KÓD Aplikace.......................................................................................36
F
Fotogalerie..............................................................................................................42
fot. 1: Základní deska předního panelu řídícího modulu........................42
fot. 2: Základní deska plošných spojů řídícího modulu..........................42
fot. 3: Detail plošného spoje + dodatečné úpravy...................................43
fot. 4: Samotný rotátor, řídící modul bez přístrojové krabice.................43
fot. 5: Pohled na zadní propojovací část řídícího modulu rotátoru.........44
fot. 6: Přední panel řídícího modulu rotátoru, přístrojová krabice..........44
24
A NÁVRH ZAŘÍZENÍ
A.1 Desky plošných spojů
základní deska (120x60mm)
přední panel (120x45mm)
25
A.2 Osazovací výkresy
osazovací výkres základní desky
osazovací výkres předního panelu
26
A.3 Schema zapojení
27
B
SEZNAM SOUČÁSTEK
PARTS LIST REPORT -- rotator_I.pcb -- Wed Dec 23 16:34:21 2009
Reference
Designation
Logic Type
PartType
C1
C2
C3
C4
C5
D1
D2
D3
D4
D5
D6
D7
D8
D9
J1
J2
J3
Q1
Q2
Q3
Q4
Q5
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13
R14
R15
R16
R17
R18
R19
R20
CAP
CAP
CAP
CAP
CAP
DIO
DIO
DIO
DIO
DIO
DIO
DIO
DIO
DIO
CON
CON
CON
TRX
TRX
TRX
TRX
TRX
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
RES
CAP-CK05.....................................................100 n
CAP-CK05.....................................................100 n
E.....................................................................1000 M/16 V
CAP-CK05.....................................................100 n
E.....................................................................47 M/16 V
LED................................................................3 mm, červená
LED................................................................3 mm, červená
1N4007
1N4007
LED................................................................3 mm, červená, debug
1N4007
1N4007
LED................................................................3 mm, žlutá
LED................................................................3 mm, žlutá
ARK110/2......................................................2 póly
ARK110/2......................................................2 póly
ARK110/3......................................................3 póly
IRFZ44
IRF9520
7805................................................................stabilizátor, 1 A
IRFZ44
IRF9520
RES-1/8W......................................................330 Ω
RES-1/8W......................................................330 Ω
RES-1/8W......................................................47 Ω
RES-1/8W......................................................330 Ω
RES-1/8W......................................................10 kΩ
RES-1/8W......................................................10 kΩ
RES-1/8W......................................................10 kΩ
RES-1/8W......................................................10 kΩ
RES-1/8W......................................................470 Ω
RES-1/8W......................................................10 kΩ
RES-1/8W......................................................10 kΩ
RES-1/8W......................................................1 kΩ
RES-1/8W......................................................10 kΩ
RES-1/8W......................................................470 Ω
RES-1/8W......................................................470 Ω
RES-1/8W......................................................470 Ω
RES-1/8W......................................................47 Ω
PT10H............................................................4,7 kΩ
RES-1/8W......................................................330 Ω
RES-1/8W......................................................47 Ω
U1
U2
U3
U4
U5
U6
U7
U8
U14
U15
U16
U17
UND
UND
UND
UND
UND
ANA
UND
UND
UND
UND
UND
UND
USB_A...........................................................zásuvka USB, A
OPTO.............................................................PC817B
USOP28..........................................................FT232RL v redukci
OPTO.............................................................PC817B
POJISTKA
DIL40PZ........................................................ATmega16
OPTO.............................................................PC817B
OPTO.............................................................PC817B
ENKODER.....................................................rotační
USPINAC.......................................................tlačítko
USPINAC.......................................................tlačítko
POTENCIOMETR.........................................10 kΩ
Value
28
C PŘÍSTROJOVÁ KRABICE
Materiálem popisované přístrojové krabice je ocelový plech tloušťky 0,8mm.
Jednotlivé díly jsou sešroubovány samořeznými vruty 4x8mm. Zadní čelo je zhotoveno
pouze z fólie, jedná se o prachovou zábranu (viz. fotogalerie). Na předním panelu je
nalepený štítek s popisem ovládacích prvků, který je zhotoven nízkonákladovou cestou,
tedy papírový zalaminovaný do fólie. Krabice je opatřena samolepícími přístrojovými
nožkami. Povrchová úprava provedena černým matným lakem.
C.1 Horní část přístrojové krabice
C.2 Dolní část přístrojové krabice
C.3 Přední panel přístrojové krabice
Veškeré uvedené míry jsou pouze informativní!!
Přístrojová krabice byla nejprve vyrobena a až po té byl zpětně kreslen její výkres.
29
D ZDROJOVÝ KÓD MIKROKONTROLERU
#include <stdio.h>
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\eeprom.h>
#include <util\delay.h>
#include "lcd_h.h"
//--------------------------------------------------------------------volatile int r_min,r_max;
//hodnoty minimálního a maximálního natočení rotátoru
volatile float azimut;
//hodnota natočení ve azimutpních
volatile float q; //aditivní konstanty
volatile int ADC_hodnota; //aktuální hodnota AD převodníku, filtrováno
volatile int ADC_pole[8];
//pole posledních hodnot převodů
volatile int novy_azimut;
//nový, požadovaný azimut
volatile char USART[16] = "xxxxxxxxxxxxxxxx";
//vyrovnávací řetězec USART kanálu
int USART_buffer_pointer = 0;
//ukazatel na vyrovnávací řetězec USART
volatile unsigned char status = 0;
//stavové slovo rotačního encoderu (7 - enter, 6, 5 - směr otáčení), bitový příazimutp
volatile char krok = 0;
//proměnná pro dynamické řízení kroku enkodéru
volatile char d_krok_zap = 0; //spínač dynamického kroku
//--------------------------------------------------------------------void panel_LED(void)
//obsluha LED diod pro směr otáčení na předním panelu
{
if (TCCR1A & 1<<COM1A1)
//vyhodnocení polarity můstku
{
PORTA |= 1<<6;
//rozsvícení diody 1
}
else PORTA &= ~(1<<6);
//zahsnutí diody 1
if (TCCR1A & 1<<COM1B1)
//vyhodnocení polarity můstku
{
PORTA |= 1<<7;
//rozsvícení diody 2
}
else PORTA &= ~(1<<7);
//zhasnutí diody 2
}
//--------------------------------------------------------------------void ADC_filtrace(void)
//filtrace digitalizovaných dat z převodníku ADC0
{
ADC_hodnota = 0;
//filtrovaná hodnota AD převodníku 0
for(int i = 0; i <= 3; i++) //cyklus součtu pro průměr
{
ADC_hodnota += ADC_pole[i];
//suma všech hodnot
}
ADC_hodnota /= 4;
//filtrovaná hodnota AD převodníku 0
}
//--------------------------------------------------------------------void TX_10 (void)
//odvysílání aktuálního natočení po sériové lince
{
int a;
//pomocná proměnná
int temp = (int)azimut; //pomocná proměnná
UDR = '+'; //odvysílání po USARTU
while ( !( UCSRA & (1<<UDRE)) ); //čekání na dokončení vysílaní
UDR = '0'; //odvysílání po USARTU
while ( !( UCSRA & (1<<UDRE)) ); //čekání na dokončení vysílaní
a = temp / 100;
//stovky
temp -= a * 100;
a |= 0b00110000;
//zakódování do ASCII
UDR = a; //odvysílání po USARTU
while ( !( UCSRA & (1<<UDRE)) ); //čekání na dokončení vysílaní
a = temp / 10;
//desítky
temp -= a * 10;
a |= 0b00110000;
//zakódování do ASCII
UDR = a; //odvysílání po USARTU
while ( !( UCSRA & (1<<UDRE)) ); //čekání na dokončení vysílaní
a = temp; //jednotky
a |= 0b00110000;
UDR = a; //odvysílání po USARTU
while ( !( UCSRA & (1<<UDRE)) ); //čekání na dokončení vysílaní
char i = 0;
for (i = 0; i < 6; i++)
{
UDR = '0'; //odvysílání po USARTU
while ( !( UCSRA & (1<<UDRE)) ); //čekání na dokončení vysílaní
}
UDR = 13; //carriage return
while ( !( UCSRA & (1<<UDRE)) ); //čekání na dokončení vysílaní
}
//--------------------------------------------------------------------void USART_blank (void)
//vymazání USART
{
int i;
for (i = 0; i<16; i++)
30
{
USART[i] = ' ';
}
}
//--------------------------------------------------------------------void USART_prijem (void) //příjem dat a příkatů přes sériovou linku
{
int i;
//ukazatel řetězce USART
int j;
//pomocný ukazatel
char USART_temp[16]; //kopie globálního pole USART
int temp = 0;
//dočasná pracovní proměnná
for (i = 0; i <= 15; i++) //kopie USART do USART_temp
{
USART_temp[i] = USART[i];
//kopie prvku USART do USART_temp
}
for (j = 0; j <=15; j++) //přerovnání USART_temp tak, aby případný # byl na jeho konci
{
if (USART_temp[0] != 'M')
//synchronizace na znak #
{
temp = USART_temp[0];
for (i = 0; i <= 14; i++) //14+1!
{
USART_temp[i] = USART_temp[i+1];
//přerovnání
}
USART_temp[15] = temp;
}
if (USART[j] == 'C')
//požadavek na odeslání aktuálního natočení rotátoru
{
TX_10(); //převod proměnné azimut ASCII soustavy a odvysílání po sériové lince (aktuální natočení rotátoru)
USART_blank();
//vymazání USART bufferu
}
if (USART[j] == 'R')
//doprava?
{
status &= ~(1<<0);
//neaplikuj proceduru "natoc" (volný mód natáčení z PC)
TCCR1A &= 0b01011111;
//můstek deaktivován
TCCR1A |= 1<<COM1A1;
//+12V, můstek aktivován!!
USART_blank();
//vymazání USART bufferu
}
if (USART[j] == 'L')
//doleva?
{
status &= ~(1<<0);
//neaplikuj proceduru "natoc" (volný mód natáčení z PC)
TCCR1A &= 0b01011111;
//můstek deaktivován
TCCR1A |= 1<<COM1B1;
//-12V, můstek aktivován!!
USART_blank();
//vymazání USART bufferu
}
if (USART[j] == 'S')
//stop?
{
status &= ~(1<<0);
//neaplikuj proceduru "natoc" (volný mód natáčení z PC)
TCCR1A &= 0b01011111;
//můstek deaktivován
USART_blank();
//vymazání USART bufferu
}
}
if (USART_temp[0] == 'M')
//nový azimut!
{
temp = 0;
if ((USART_temp[3] >= 0x30) && (USART_temp[3] <= 0x39) && (USART_temp[1] != 'P'))
//čeká se na
zadání posledního čísla, jednotek!
{
temp += 100 * (USART_temp[1] - 48);
//stovky
temp += 10 * (USART_temp[2] - 48);
//desítky
temp += USART_temp[3] - 48;
//jednotky
status |= 1<<0;
//aplikuj proceduru "natoc"
status &= ~(1<<1);
//vypisování aktuálního úhlu natočení
novy_azimut = temp;
//hodnota nového azimutu
USART_blank();
}
if (USART_temp[1] == 'P')
//PWMka
{
temp += 100 * (USART_temp[2] - 48);
//stovky
temp += 10 * (USART_temp[3] - 48);
//desítky
temp += USART_temp[4] - 48;
//jednotky
OCR1A = temp;
OCR1B = temp;
USART_blank();
}
}
if (USART_temp[11] == 'P')
{
OCR1A = temp;
OCR1B = temp;
USART_blank();
}
//hodnota PWM
//hodnota PWM
//může jít o rychlost nebo nový azimut
31
}
//--------------------------------------------------------------------void natoc (int n_azimut)
//procedura natočení rotátoru na zadaný novy_azimut x
{
static float l,r;
if (status & 1<<0)
//příkaz zadán z PC nebo enkoderu
{
if ((azimut - n_azimut > l) || (n_azimut - azimut > r))
aktuální o více jak jeden azimutpeň
{
if ((azimut < n_azimut) && (azimut <= 360))
{
TCCR1A &= 0b01011111;
TCCR1A |= 1<<COM1A1;
l = 5;
r = 0;
}
if ((azimut > n_azimut) && (azimut >= 0))
{
TCCR1A &= 0b01011111;
TCCR1A |= 1<<COM1B1;
r = 5;
l = 0.5;
}
}
//aktivace můstku, pokud se požadovaná hodnota liší od
//rozhodování na kterou stranu začít točit
//můstek deaktivován
//+12V
//můstek deaktivován
//-12V
else
{
TCCR1A &= 0b01011111;
l = 2;
r = 2;
}
//můstek deaktivován
}
}
//--------------------------------------------------------------------void keyboard (void)
//obsluha tlačítek směru na panelu
{
if (!(PINB & 1<<4))
//tlačítko 1
{
while (!(PINB & 1<<4));//zalomená sirka
status &= ~(1<<0);
//neaplikuj proceduru "natoc" (volný mód natáčení klávesami)
status &= ~(1<<1);
//vypisování aktuálního úhlu natočení
if (TCCR1A & 1<<COM1B1)
//točí se na opačnou stranu?
{
TCCR1A &= 0b01011111;
//můstek deaktivován
}
else
{
if (TCCR1A & 1<<COM1A1)
//nejedná se o druhý stisk tlačítka?
{
TCCR1A &= 0b01011111;
//2. stiskem je můstek deaktivován
}
else
{
if ((azimut <= 360) || (status & 1<<3))
//mimo kalibraci
{
TCCR1A &= 0b01011111;
//můstek deaktivován
TCCR1A |= 1<<COM1A1;
//+12V
}
}
}
}
if (!(PINB & 1<<3))
//tlačítko 2
{
while (!(PINB & 1<<3));//zalomená sirka
status &= ~(1<<0);
//neaplikuj proceduru "natoc" (volný mód natáčení klávesami)
status &= ~(1<<1);
//vypisování aktuálního úhlu natočení
if (TCCR1A & 1<<COM1A1)
//točí se na opačnou stranu?
{
TCCR1A &= 0b01011111;
//můstek deaktivován
}
else
{
if (TCCR1A & 1<<COM1B1)
//nejedná se o 2. stisk tlačítka?
{
TCCR1A &= 0b01011111;
//2. stiskem je můstek deaktivován
}
else
{
if ((azimut >= 0) || (status & 1<<3)) //mimo status
{
TCCR1A &= 0b01011111;
//můstek deaktivován
32
TCCR1A |= 1<<COM1B1;
}
//-12V
}
}
}
}
//--------------------------------------------------------------------void kalibrace (void)
//procedura kalibrace, chybí dodělat uložení hodnot kalibrace do EEPROM
{
status |= 1<<3;
//režim kalibrace
int azimut_change;
//pomocná proměnná pro prohození krajních hodnot
lcd_gotoxy(0,0);
lcd_puts("Kalibrace, ENTER");
//úvodní obrazovka kalibrace
while ( ! (status & 1<<7) );
//čeká se na stisknutí klávesy ENTER
_delay_ms(300);
status &= ~(1<<7);
//vymazání příznaku stisknutí klávesy ENTER
lcd_gotoxy(0,0);
lcd_puts("nastav k. p. 1 ");
//výzva k natočení rotátoru do jedné z krajních poloh
_delay_ms(1000);
while ( ! (status & 1<<7))
//čekání na potvrzení krajní polohy ENTERem
{
keyboard(); //příkaz ke spuštění natáčení se očekává z klávesnice
ADC_filtrace();
//filtrace dat z AD převodníku
panel_LED();
//signalizace LED diodami směru na hlavním panelu
char d_temp[16];
sprintf(d_temp, "k. poloha 1 %4.0d", (int)ADC_hodnota);
//výpis aktuální hodnoty AD převodníku
lcd_puts(d_temp);
r_min = (int)ADC_hodnota;
//průběžné ukládání krajní polohy
}
_delay_ms(300);
status &= ~(1<<7);
//vymazání příznaku stisknutí klávesy ENTER
lcd_gotoxy(0,0);
lcd_puts("nastav k. p. 2 ");
//výzva k natočení rotátoru do druhé z krajních poloh
_delay_ms(1000);
while ( ! (status & 1<<7))
//čekání na potvrzení krajní polohy ENTERem
{
keyboard(); //příkaz ke spuštění natáčení se očekává z klávesnice
ADC_filtrace();
//filtrace dat z AD převodníku
panel_LED();
//signalizace LED diodami směru na hlavním panelu
char d_temp[16];
sprintf(d_temp, "k. poloha 2 %4.0d", (int)ADC_hodnota);
//výpis aktuální hodnoty AD převodníku
lcd_puts(d_temp);
r_max = (int)ADC_hodnota;
//průběžné ukládání krajní polohy
}
_delay_ms(300);
status &= ~(1<<7);
//vymazání příznaku stisknutí klávesy ENTER
if (r_max <= r_min)
//prohození horní a dolní meze, pokud je třeba
{
azimut_change = r_max; //azimut change
r_max = r_min;
r_min = azimut_change;
}
eeprom_write_word(0x00, r_min); //zápis do eeprom paměti, adresa, 16b data
eeprom_write_word(0x02, r_max); //zápis do eeprom paměti, adresa, 16b data
lcd_gotoxy(0,0);
lcd_puts("Data ulozena! ");
//potvrzení kalibrace
_delay_ms(1000);
status |= 1<<0;
//aktivace procedury natoc
novy_azimut = 180;
//natočení na 180°
lcd_gotoxy(0,0);
lcd_puts("natacim 180... ");
//potvrzení kalibrace
while (!((azimut <= 360) && (azimut >= 0)));
//čekej na návrat do intervalu
status &= ~(1<<3);
//režim kalibrace ukončen
}
//--------------------------------------------------------------------void azimut_vypis (void)
//výpis aktuálního natočení na display
{
char d_temp[16];
sprintf(d_temp, "azimut:
%3.0d", (int)azimut); //explicitní konverze float na int proměnné azimut
lcd_puts(d_temp);
//výpis na display
}
//--------------------------------------------------------------------void novy_azimut_vypis (void)
{
char d_temp[16];
sprintf(d_temp, "novy azimut: %3.0d", novy_azimut);
lcd_puts(d_temp);
//výpis na display
}
//--------------------------------------------------------------------ISR (ADC_vect) //přerušení od AD převodníků
{
33
static int i = 0;
//ukazatel na pole hodnot AD převodů převodníku 0
ADC_pole[i] = ADCW; //načtení aktuální hodnota ADC0
ADC_filtrace();
//ADC dolní propust
i++;
if (!(i<=3)) //kruhový ukazatel
{
i = 0;
}
}
//--------------------------------------------------------------------ISR (TIMER0_OVF_vect) //přerušení od přetečení časovače 0
{
int static i = 0;
//zpomalení debug led 128x
ADMUX &= ~(1<<MUX0);
//úhel
i++;
ADCSRA |= 1<<ADSC; //vzorkování a nový převod
natoc(novy_azimut);
//natáčení rotátoru
azimut = 379 * (float)ADC_hodnota / ((float)r_max - (float)r_min) + q - 10;
//přepočet na úhel, azimut = k * ADC_hodnota +
q
if (((azimut <= 0) && (TCCR1A & 1<<COM1B1)) && !(status & 1<<3)) //překročení intervalu mimo kalibraci
TCCR1A &= 0b01011111;
//můstek deaktivován
if (((azimut >= 360) && (TCCR1A & 1<<COM1A1)) && !(status & 1<<3))
//překročení intervalu mimo kalibraci
TCCR1A &= 0b01011111;
//můstek deaktivován
if (i == 128)
{
if (PINB & 1<<0)
//debug led
{
PORTB &= ~(1<<0); //zhasni
}
else
PORTB |= 1<<0;
//rožni
i = 0;
}
}
//--------------------------------------------------------------------ISR (TIMER2_OVF_vect) //přerušení od přetečení časovače 2
{
d_krok_zap = 0;
//vypnutí dynamického řízení kroku - otáčení enkodérem je pomalé
krok = 0; //normální krok
TIMSK &= ~(1<<TOIE2);
//zakázání přerušení od časovače 2 -vyhodnocení dynamického kroku pouze při otáčení enkodérem
//GIFR &= ~(1<<INT0); //smazání parazitních příznaků přerušení INT0
//GICR |= 1<<INT0;
//povolení synchronizace enkoderu po odeznění mechanických zákmitů
}
//--------------------------------------------------------------------ISR (USART_TXC_vect)
//sériové vysílání ukončeno
{
}
//--------------------------------------------------------------------ISR (USART_RXC_vect) //sériový příjem dokončen
{
USART[USART_buffer_pointer] = UDR;
//čtení z UDR
if (USART_buffer_pointer >= 15) //reset pointeru na USART
{
USART_buffer_pointer = -1;
//i = 0
}
USART_buffer_pointer++;
//další pozice vyrovnávací paměti, i = 0;
}
//--------------------------------------------------------------------ISR (INT0_vect)
//externí přerušení 1 - synchro pin enkodéru
{
PORTD |= 1<<7;
//rožni
DEBUG LED
status &= ~(1<<0);
//neaplikuj procesuru "natoc" (až po stisknutí ENTERu)
status |= 1<<1;
//vypisování nového azimutu z enkoderu až do stisknutí ENTERu, přijmu z PC, nebo příkazu
klávesnice
TIMSK |= 1<<TOIE2; //povolení přerušení od časovače 2
//GICR &= ~(1<<INT0);//zakázání přerušení 0 kvůli mechanickým záknitům
if (d_krok_zap == 1)
//dynamické řízení kroku?
{
if (TCNT2 < 200)
//rychlé otáčení?
krok = 10; //navýšení kroku
else
krok = 0; //normální krok
}
if (PIND & 1<<6)
//vyhodnocení log 1 enkoderu
{
if (novy_azimut < 360)
novy_azimut+= 1 + krok;
}
if (!(PIND & 1<<6))
//vyhodnocení log 0 enkoderu
{
if (novy_azimut > 0)
novy_azimut-= 1 + krok;
34
}
if (novy_azimut > 360) //úprava kvůli dynamickému kroku
novy_azimut = 360;
if (novy_azimut < 0)
novy_azimut = 0;
d_krok_zap = 1;
//zapnutí dynamického řízení kroku
TCNT2 = 0;
//nastavení časovače 2 - reset
GIFR &= ~(1<<INT0); //smazání parazitních příznaků přerušení INT0
}
//--------------------------------------------------------------------ISR (INT1_vect)
//externí přerušení 0 - ENTER
{
status |= 1<<7;
//příznak ENTERu
PORTD |= 1<<7;
//rožni
DEBUG
if (!(status & 1<<3))
//režim kalibrace
{
status |= (1<<0);
//aplikuj procesuru "natoc"
}
status &= ~(1<<1);
//vypisování úhlu natočení
}
//--------------------------------------------------------------------int main (void)
{
DDRA = 0b11000000; //panel led
DDRB = 0b00000001; //debug led
DDRD = 0b00110000; //výstup pro můstek
TCCR0 = 0b00000011; //vstup čítače 0 je fosc / 64
TIMSK |= 1<<TOIE0; //povolení přerušení od časovače 0
SFIOR = 0b10000000; //ADC spouštěn od přeteční čítače 0
ADCSRA = 0b11001111;
//zapnutí ADC, start převodu, povolení přerušení od ADC, nastavení (předděličky) taktování
UCSRA = 0b00000010; //zdvojnásobení přenosové rychlosti (část nastavení baud rate)
UCSRB = 0b11011000; //povolení přerušení TX, TX dokončeno, zapnutí přijímače a vysílače
UCSRC = 0b10000110; //URSEL = 1 - zápis do UCSRC -> parita vypnuta, 1 stop-bit, 8 datových bitů
UBRRL = 103;
//(UBRRL = 12 pro 1MHz)baud rate = 9600bps
GICR |= 1<<INT0 | 1<<INT1;
//povolení externího přerušení 0 - ENTER, a externího přerušení 1 - synchro pin enkodéru
MCUCR |= 1<<ISC01 | 1<<ISC11; //sestupná pro INT0, sestupná pro INT1
TCCR1A |= 1<<WGM10;
//8-bit rychlá PWM
TCCR1B |= 1<<WGM12 | 1<<CS12; //8-bit rychlá PWM, předdělička na 256 (asi 120Hz)
TCCR2 |= 1<<CS22 | 1<<CS21 | 1<<CS20;
//vstup čítače 2 je fosc / 1024
lcd_init();
//lcd inicializace (4 bitová komunikace, PORTB, ...)
lcd_clrscr();
//počáteční smazání displaye
OCR1A = 255;
OCR1B = 255;
r_min = eeprom_read_word(0x00); //načtení kalibračních hodnot (16b) z paměti
r_max = eeprom_read_word(0x02); //načtení kalibračních hodnot (16b) z paměti
//-----------for (int i = 0 ; i < 3; i++) //inicialiční obrazovka
{
lcd_gotoxy(0,0);
lcd_puts("Antenni rotator!");
_delay_ms(1000);
lcd_gotoxy(0,0);
lcd_puts(" Craete RC- 5 ");
_delay_ms(800);
}
lcd_clrscr();
sei();
//povolenípřerušení, globálně, normální běh programu
if (!((PINB & 1<<5) && (PINB & 1<<4)))
//stisknutá obě tlačítka pro pojezd doleva a doprava
{
kalibrace(); //kalibrační procedura
}
q = - 379 * (float)r_min / ((float)r_max - (float)r_min);
//výpočet aditivní konstanty, azimut = k * ADC_hodnota + q
while(1)
{
USART_prijem();
panel_LED();
//diody směru
keyboard();
//obsluha tlačítek
if (status & 1<<1)
//vypisování aktuálního úhlu natočení
{
novy_azimut_vypis(); //výpis nového novy_azimutu
}
else
{
azimut_vypis();
//vypis aktuálního natočení na LCD
}
}
}
//---------------------------------------------------------------------
35
E
ZDROJOVÝ KÓD APLIKACE
Zdrojový kód programu Řízení anténního rotátoru (hlavičkové soubory, soubory
grafického návrhu atp. jsou na přiloženém datovém nosiči):
//--------------------------------------------------------------------------//#include <stdlib.h>
//#include <conio.h>
//#include <windows.h>
//#include <winbase.h>
#include <string.h>
#include <shlwapi.h>
#include <vcl.h>
#pragma hdrstop
#include "rizeni_rotatoru.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// Deklarace globálních proměnných
HANDLE COM_handle = NULL;
bool CommFlag;
char InBuffer[101];
#define COM_rep 1
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
(*Form1).ClientWidth = 220;
// okno je nastartováno se šířkou 220
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
// tlačítko "odešli azimut"
(*Timer2).Enabled = false;
//
zastavení časovače pro periodické čtení azimutu
char stovky, desitky, jednotky;
int azimut = 0;
//
požadovaný azimut
azimut = (*Edit1).Text.ToInt();
stovky = azimut / 100;
azimut -= 100 * stovky;
desitky = azimut / 10;
azimut -= 10 * desitky;
jednotky = azimut;
stovky += 48;
jednotky += 48;
desitky += 48;
//
úprava na ASCII tvar
int i;
for (i = 0; i < COM_rep; i++)
{
TransmitCommChar(COM_handle, 'M');
TransmitCommChar(COM_handle, stovky);
TransmitCommChar(COM_handle, desitky);
TransmitCommChar(COM_handle, jednotky);
//
odešle přes sériový port "Mpožadovaný azimut"
FlushFileBuffers(COM_handle);
//
nepodmíněné odvysílání bufferu
}
if ((*CheckBox2).State == cbChecked)
//
pokud je aktivní automatické načítaní azimutu
(*Timer2).Enabled = true;
//
zastavení časovače pro periodické čtení azimutu
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
// tlačítko "nastav rychlost"
(*Timer2).Enabled = false;
//
zastavení časovače pro periodické čtení azimutu
char temp[10];
//
pomocná textová proměnná
strcpy(temp, (*Edit2).Text.c_str());
// text Editu2 do temp
strcat(temp, "%");
// k temp připoj znak %
(*Label4).Caption = temp;
36
// temp vypiš do Label4
(*TrackBar1).Position = (*Edit2).Text.ToInt();
//
uprav pozici TrackBar1 podle Edit2
int rychlost;
//
proměnná pro odeslání rychosti
rychlost = (*Edit2).Text.ToInt() * 255 / 100;
//
přepočet na tvar registrů uPC
char stovky = 0, desitky = 0, jednotky = 0;
//
proměnné pro odeslání
stovky = rychlost / 100;
//
počet stovek
rychlost -= stovky * 100;
desitky = rychlost / 10;
//
počet desítek
rychlost -= desitky * 10;
jednotky = rychlost;
//
počet jedniček
stovky += 48;
jednotky += 48;
desitky += 48;
//
úprava na ASCII tvar
int i;
for (i = 0; i < COM_rep; i++)
{
TransmitCommChar(COM_handle, 'M');
TransmitCommChar(COM_handle, 'P');
//
klíčový znak pro odlišení rychlosti od azimutu
TransmitCommChar(COM_handle, stovky);
TransmitCommChar(COM_handle, desitky);
TransmitCommChar(COM_handle, jednotky);
//
potvrzení příkazu
}
if ((*CheckBox2).State == cbChecked)
//
pokud je aktivní automatické načítaní azimutu
(*Timer2).Enabled = true;
//
zastavení časovače pro periodické čtení azimutu
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender)
{
// tlačítko "načti azimut"
(*Timer2).Enabled = false;
//
zastavení časovače pro periodické čtení azimutu
TransmitCommChar(COM_handle, 'C');
//
odešle přes sériový port znak 'C' - žádost o aktuální azimut
FlushFileBuffers(COM_handle);
//
nepodmíněné odvysílání bufferu
(*Timer1).Enabled = true;
//
zapne prodlevu na odpoveď řídícího modulu rotátoru
if ((*CheckBox2).State == cbChecked)
//
pokud je aktivní automatické načítaní azimutu
(*Timer2).Enabled = true;
//
zastavení časovače pro periodické čtení azimutu
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button4Click(TObject *Sender)
{
// tlačítko menu
static bool sw = true;
sw = !sw;
//
proměnná určující přechod mezi menu oknem a oknem nastvaneí
if (sw)
{
(*Form1).Caption = "Řízení rotátoru";
(*Button4).Caption = "Nastavení";
(*Form1).ClientWidth = 220;
//
režim Řízení rotátoru
}
else
{
(*Form1).Caption = "Řízení rotátoru + nastavení";
(*Button4).Caption = "méně";
(*Form1).ClientWidth = 440;
//
režim Řízení rotátoru + Nastavení
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button5Click(TObject *Sender)
{
// počet zpráv o azimutu do minuty
if (((*Edit3).Text.ToInt() >= 1) & ((*Edit3).Text.ToInt() <= 60))
{
(*Edit3).Color = clWindow;
37
(*Timer2).Interval = 60000 / (*Edit3).Text.ToInt();
//
nastavení periody časovače 2 od 100ms do 60s
(*Button5).Enabled = false;
//
vypnutí tlačítka
}
else
(*Edit3).Color = clRed;
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button6Click(TObject *Sender)
{
// tlačítko "otáčej vlevo"
(*Timer2).Enabled = false;
//
zastavení časovače pro periodické čtení azimutu
int i;
for (i = 0; i < COM_rep; i++)
{
TransmitCommChar(COM_handle, 'L');
//
odešle přes sériový port znaky 'L' - žádost o spuštění otáčení vlevo
FlushFileBuffers(COM_handle);
//
nepodmíněné odvysílání bufferu
}
if ((*CheckBox1).State == cbChecked)
{
(*Timer3).Enabled = true;
//
mikroposuv aktivní! - generuje se prodleva pro odvysílání STOP příkazu
(*Button6).Enabled = false;
(*Button8).Enabled = false;
//
deaktivace tlačítek
}
else
{
(*Timer3).Enabled = false;
//
mikroposuv neaktivní, nebude požadováno vysílání zastavovacího příkazu
//
generování prodlevy a odvysílání příkazu STOP
}
if ((*CheckBox2).State == cbChecked)
//
pokud je aktivní automatické načítaní azimutu
(*Timer2).Enabled = true;
//
zastavení časovače pro periodické čtení azimutu
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button7Click(TObject *Sender)
{
// tlačítko "STOP"
(*Timer2).Enabled = false;
//
zastavení časovače pro periodické čtení azimutu
int i;
for (i = 0; i < COM_rep; i++)
{
TransmitCommChar(COM_handle, 'S');
//
odešle přes sériový port znaky 'S' - žádost o zastavení rotátoru
FlushFileBuffers(COM_handle);
//
nepodmíněné odvysílání bufferu
}
(*Button6).Enabled = true;
(*Button8).Enabled = true;
//
aktivace tlačítek směru - odeznění pulzu mikroposuvu
(*Timer3).Enabled = false;
//
deaktivace časovače - příkaz STOP byl odeslán tlačítkem STOP
if ((*CheckBox2).State == cbChecked)
//
pokud je aktivní automatické načítaní azimutu
(*Timer2).Enabled = true;
//
zastavení časovače pro periodické čtení azimutu
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button8Click(TObject *Sender)
{
// tlačítko "otáčej vpravo"
(*Timer2).Enabled = false;
//
zastavení časovače pro periodické čtení azimutu
int i;
for (i = 0; i < COM_rep; i++)
{
TransmitCommChar(COM_handle, 'R');
//
odešle přes sériový port znaky 'R' - žádost o spuštění otáčení vpravo
FlushFileBuffers(COM_handle);
//
nepodmíněné odvysílání bufferu
}
if ((*CheckBox1).State == cbChecked)
{
(*Timer3).Enabled = true;
38
//
mikroposuv aktivní! - generuje se prodleva pro odvysílání STOP příkazu
(*Button6).Enabled = false;
(*Button8).Enabled = false;
//
deaktivace tlačítek
}
else
{
(*Timer3).Enabled = false;
//
mikroposuv neaktivní, nebude požadováno vysílání zastavovacího příkazu
//
generování prodlevy a odvysílání příkazu STOP
}
if ((*CheckBox2).State == cbChecked)
//
pokud je aktivní automatické načítaní azimutu
(*Timer2).Enabled = true;
//
zastavení časovače pro periodické čtení azimutu
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button9Click(TObject *Sender)
{
// tlačítko "otevři port"
DCB dcbCommPort;
BOOL bPort;
COMMTIMEOUTS CommTimeouts;
DWORD BytesRead;
/* Otevření portu pomocí funkce WIN32 API CreateFile,
CreateFile vrátí HANDLE COM_handle
non-overlapped serial I/O.
*/
//"COM4"
char com_port[10];
strcpy(com_port, "COM");
strcat(com_port, IntToStr((*ComboBox1).ItemIndex + 1).c_str());
COM_handle = CreateFile(com_port, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
// Pokud by se port nedal otevřít
if (COM_handle == INVALID_HANDLE_VALUE)
{
}
/* Načti aktuální DCB parametry
*/
dcbCommPort.DCBlength = sizeof(DCB);
GetCommState(COM_handle, &dcbCommPort);
/* Pomocí funkce WIN32 API BuildCommDCB nachystej konfiguraci portu. */
if(!BuildCommDCB("baud=9600 parity=N data=8 stop=1", &dcbCommPort))
{
COM_handle = NULL;
}
/* Pomocí funkce WIN32 API SetCommState uplatni aktuální konfiguraci
portu z DCB. Pokud by se nedala uplatnit, zavři port.
*/
if(!SetCommState(COM_handle, &dcbCommPort))
{
CloseHandle(COM_handle);
COM_handle = NULL;
}
/* Nachystej CommTimeouts parametry.*/
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 250;
CommTimeouts.WriteTotalTimeoutMultiplier = 1;
/* Pomocí funkce WIN32 API SetCommTimeouts uplatni aktuální konfiguraci
z BCD. Pokud se to nepodaří, zavři port.
*/
if(!SetCommTimeouts(COM_handle, &CommTimeouts))
{
CloseHandle(COM_handle);
COM_handle = NULL;
}
while(CommFlag)
{
Application->ProcessMessages();
ReadFile(COM_handle, InBuffer, 100, &BytesRead, NULL);
if(BytesRead)
{
InBuffer[BytesRead] = 0;
}
}
Application->ProcessMessages();
//přerušení od ostatních zdrojů
strcpy(InBuffer, (*Edit1).Text.c_str());
ReadFile(COM_handle, InBuffer, 100, &BytesRead, NULL);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button10Click(TObject *Sender)
{
// nastavení mikroposuvu
if (((*Edit4).Text.ToInt() >= 200) & ((*Edit4).Text.ToInt() <= 2000))
{
39
(*Edit4).Color = clWindow;
(*TrackBar2).Position = (*Edit4).Text.ToInt();
//
nastavení posuvníku délky mikroposuvu podle Editu4
(*Timer3).Interval = (*Edit4).Text.ToInt();
//
nastavení intervalu časovače
(*Button10).Enabled = false;
//
vypnutí tlačítka
}
else
(*Edit4).Color = clRed;
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button11Click(TObject *Sender)
{
// tlačítko "zavři port"
//Uzavření COM portu a vynulovaní HANDLE
CloseHandle(COM_handle);
COM_handle = NULL;
}
//--------------------------------------------------------------------------void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
// posuvník rychlosti
char temp[10];
//
pomocná textová proměnná
strcpy(temp, IntToStr((*TrackBar1).Position).c_str());
//
do temp se nahraje pozice posuvníku
strcat(temp, "%");
//
k temp se přidá znak %
(*Label4).Caption = temp;
//
Label4 vypíše aktuální polohu posuvníku
(*Edit2).Text = IntToStr((*TrackBar1).Position);
}
//--------------------------------------------------------------------------void __fastcall TForm1::TrackBar2Change(TObject *Sender)
{
// posuvník délky mikroposuvu
(*Timer3).Interval = (*TrackBar2).Position;
//
posuvník do timeru!
char temp[10];
//
pomocná textová proměnná
strcpy(temp, IntToStr((*TrackBar2).Position).c_str());
//
do temp se nahraje pozice posuvníku
(*Edit4).Text = temp;
//
Edit4 vypíše aktuální polohu posuvníku
(*Button10).Enabled = true;
//
zapnutí tlačítka
}
//--------------------------------------------------------------------------void __fastcall TForm1::Edit3Enter(TObject *Sender)
{
// vstup do editu počtu zpráv o azimutu
(*Button5).Enabled = true;
//
zapnutí tlačítka
}
//--------------------------------------------------------------------------void __fastcall TForm1::Edit4Enter(TObject *Sender)
{
// vstup do editu délky mikroposuvu
(*Button10).Enabled = true;
//
zapnutí tlačítka
}
//--------------------------------------------------------------------------void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
// zatržítko mikroposuvu
;
}
//--------------------------------------------------------------------------void __fastcall TForm1::CheckBox2Click(TObject *Sender)
{
// zatržítko automatického načítání azimutu
if ((*CheckBox2).State == cbChecked)
{
(*Timer2).Enabled = true;
//
požadováno automatické načítání azimutu
}
else
{
(*Timer2).Enabled = false;
//
není požadováno automatické načítání azimutu
}
40
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
/* časovač pro generovaní prodlevy pro odpověď řídícího modulu
na žádost o odvysílání aktuálního azimutu */
(*Timer1).Enabled = false;
//
deaktivace časovače pro manuální reřim odečítání azimutu
char temp[20];
char rtemp[20];
DWORD BytesRead;
ReadFile(COM_handle, InBuffer, 12, &BytesRead, NULL);
//
přečte 12 znaky z bufferu sériového portu
StrCpyN(temp, InBuffer, 12);
//
12 znaky včetně /NULL
int i = 0;
for (i = 0; i <= 2; i++)
{
rtemp[i] = temp[i+2];
}
rtemp[3] = '°';
// znak "°"
rtemp[4] = '\0';
//
ukončovací znak
//
ořez znaků "+0aaa0000000"
(*Label2).Caption = rtemp;
//
rtemp! výpis do labelu
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
// časovač pro periodické načítání azimutu
TransmitCommChar(COM_handle, 'C');
//
odešle přes sériový port znak '?' - žádost o aktuální azimut
FlushFileBuffers(COM_handle);
//
nepodmíněné odvysílání bufferu
(*Timer1).Enabled = true;
//
zapne prodlevu na odpoveď řídícího modulu rotátoru
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer3Timer(TObject *Sender)
{
// příkaz STOP
int i;
for (i = 0; i < COM_rep; i++)
{
TransmitCommChar(COM_handle, 'S');
//
odešle přes sériový port znaky 'S' - žádost o zastavení rotátoru
FlushFileBuffers(COM_handle);
//
nepodmíněné odvysílání bufferu
}
(*Timer3).Enabled = false;
//
zastavení časovače
(*Button6).Enabled = true;
(*Button8).Enabled = true;
//
aktivace tlačítek směru - odeznění pulzu mikroposuvu
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
// Žádost o uzavření okna
//
Uzavření COM portu a vynulovaní HANDLE
CloseHandle(COM_handle);
COM_handle = NULL;
}
//---------------------------------------------------------------------------
41
F
FOTOGALERIE
fot. 1: Základní deska předního panelu řídícího modulu
fot. 2: Základní deska plošných spojů řídícího modulu
42
fot. 3: Detail plošného spoje + dodatečné úpravy
fot. 4: Samotný rotátor, řídící modul bez přístrojové krabice
43
fot. 5: Pohled na zadní propojovací část řídícího modulu rotátoru
fot. 6: Přední panel řídícího modulu rotátoru, přístrojová krabice modulu
44

Podobné dokumenty

Ubuntu + Synaptic Touchpad + klávesové zkratky

Ubuntu + Synaptic Touchpad + klávesové zkratky zmetek). Compiz sám neumožňuje nastavit odeslání nějaké klávesy, nebo D-Bus zprávy. To samé se týká druhé sekce: buttonbindings. Pomocí dalších nástrojů (xsendkeys, xsendkeycode) je možné tyto sekc...

Více

Programování mikrokontrolérů ATmega32

Programování mikrokontrolérů ATmega32 .INCLUDE - vložení obsahu externího souboru: vloží do zdrojového souboru obsah jiného souboru • Adresování o Přímé adresování: Součástí instrukce je přímo adresa, která odkazuje na zdroj nebo cíl, ...

Více

Ovladače v OS a v ŘS REX

Ovladače v OS a v ŘS REX nalézt na Windows Hardware Developer Central: www.microsoft.com/whdc

Více

Stáhnout materiál Úvod do Deplhi

Stáhnout materiál Úvod do Deplhi • V přirozeném jazyce – nešikovné, nepřehledné • Graficky – vývojové diagramy, struktogramy – přehledné, ale někdy zbytečně pracné • V programovacím jazyce – pokud si zvykneme na přehledný zápis, n...

Více

datasheetu - DH servis

datasheetu - DH servis Devátý byte – nižší byte vypočteného CRC – CRC se vždy počítá od Header byte 2 včetně, tedy od druhého byte do parametru příkazu, tedy do sedmého byte. Pokud nesouhlasí délka zaslaného paketu, nebo...

Více

C++ Builder 4.0 - Tvorba software

C++ Builder 4.0 - Tvorba software Builder. Sem bychom neměli zasahovat, tj. přidávat sem deklarace nebo je odsud odstraňovat. Mohli bychom tím narušit funkci Builderu; v krajním případě by se mohlo stát, že prostředí odmítne s naší...

Více

Počítače a programování 2 - UTEE

Počítače a programování 2 - UTEE Událostí je kliknutí na tlačítko v okně (OnClick), událostí je stisknutí klávesy na klávesnici (onKeyDown) či otočení kolečkem mezi tlačítky myši (OnMouseWheel). Pracujeme-li v

Více

1. Seznámení s C++ Builderem

1. Seznámení s C++ Builderem kostru obsluhy události stisknutí tlačítka (jedná se o funkci, přičemž Builder vytvoří její hlavičku a složené závorky pro zápis těla funkce) a tato (zatím prázdná) funkce je zobrazena v Editoru kó...

Více

Programování v C++ II - Materiály pro výuku IDE C++ Builder

Programování v C++ II - Materiály pro výuku IDE C++ Builder Pouze jedno spuštění aplikace ................................................................................198 Omezení změny velikosti formuláře ....................................................

Více

Programování v jazyce C++ pro 4. ročník

Programování v jazyce C++ pro 4. ročník Seznamy slouží uživateli aplikace jako nabídka možností, ze kterých může jednu položku vybrat. Většina seznamů má položky typu strings = řetězce znaků (texty), proto u nich lze používat stejné meto...

Více