Bakalářská práce - Vysoké učení technické v Brně
Transkript
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 VU 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⋅mq= 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
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...
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, ...
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...
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...
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ší...
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
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ó...
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 ....................................................
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...