Mikrokontroler je nepogrešljiv sestavni del številnih majhnih, a zelo uporabnih domačih naprav, kot so: vremenska postaja, elektronski termostat, elektronska varuška, … Za vsak končni izdelek bomo nemalokrat odšteli veliko več, kot če se projekta lotimo sami. V preteklem nadaljevanju smo spoznali enoto za krmiljenje polnjenja baterij. Prav tako smo spoznali, kako napišemo uporabniško funkcijo in jo preko vodila USB 2.0 prenesemo v mikrokontroler PIC18F26J50 ali PIC32X250F128B.
Tokrat se bomo lotili podrobnosti brezžičnega komunikacijskega protokola, ki se nam je pri predhodnem nadaljevanju »izmuznil«, saj je zanj preprosto zmanjkalo prostora. Uporabili bomo tudi zadnjo dinamično programsko knjižnico s spletne strani PC USB Projects (https://sites.google.com/site/pcusbprojects/5-custom-projects/bd-unified-dll-v4-1-for-all-microcontrollers-supported-by-pc-usb-projects), v katero je že vgrajen komunikacijski protokol za brezžični prenos podatkov. Omenimo še, da je knjižnica zdaj univerzalna in podpira vse mikrokontrolerje iz spletne strani PC USB Projects: MCP2200, PIC16C745, PIC18F2550, PIC18F24J50, PIC18F26J50, in PIC32MX250F128B. Prednastavljeni način delovanja je PIC18F24J50/PIC18F26J50, z ustrezno izbiro nastavitev pa lahko izberemo tudi druge mikrokontrolerje. Primere najdemo na prej omenjeni spletni strani.
Komunikacijski protokol
Vzpostavitev komunikacijskega kanala
Brezžična komunikacija ni nekaj, kar bi bilo enostavno izvedljivo. Zatakne se predvsem, ko želimo prenašati digitalne podatke po dokaj omejenem komunikacijskem kanalu (med 300 Hz in 2500 Hz). Ena izmed možnosti je uporaba impulzno-širinske modulacije, ki smo jo omenili v sedmem nadaljevanju članka v februarski številki Sveta elektronike. Komunikacijski protokol smo zgolj orisali.
Enobitni komunikacijskih moduli niso idealni podatkovni prenosni medij in vnašajo kar precej šuma. Komunikacijski protokol moramo zato izdelati tako, da se v čim večji meri izognemo vplivu šuma in hkrati zagotovimo zanesljiv prenos podatkov. Frekvenca signala in natančnost impulzno-širinske modulacije sta povezana. Pri signalu z nižjo frekvenco lahko dolžino impulza natančneje nastavljamo zato smo uporabili osnovni signal s frekvenco 600 Hz. Za modulator smo uporabili mikrokontroler PIC18F26J50 ali PIC32MX250F128B. Slednji omogoča pri nastavljanju širine impulza celo 32-bitno ločljivost. Vendar smo se prav tako zadovoljili s 16-bitno ločljivostjo. Več je nesmiselno, saj ima komunikacijski kanal, ki ga lahko vzpostavimo z moduloma Hoperf RFC85 in RFC83CL, preveč šuma.
Naslednji premislek je terjala impulzno-širinska demodulacija signala. Širino impulza merimo z 32-bitnimi registri mikrokontrolerja, čeprav nikoli ne preseže 65535; se pa na ta način enostavno izognemo nevarnosti prevrtenja števcev in omogočimo opozorila o napakah, ko gre kaj narobe. Na primeru, da bi mikrokontroler zaznal kak drug signal z drugo frekvenco in drugimi lastnostmi, 32-bitni register omogoča, da naštejemo tudi več kot 65535 impulzov in ugotovimo, da signal nima prave frekvence. Mikrokontroler ga mora preprosto ignorirati, saj ne sme vplivati na prenos podatkov.
Zato je ena izmed osnovnih funkciji, ki se odvijajo pri demodulaciji signala PWM (angl. pulse width modulation), merjenje frekvence impulzno-širinsko moduliranega signala. Mi smo za osnovno za frekvenco izbrali približno 610 Hz (območje od 590 Hz do 630 Hz). Poglejmo, kako poteka zajem signala, Program 1.
Najprej pripravimo mikrokotroler za zajem prednje in zadnje fronte signala. PIC32MX250F128B vrednosti števcev v obeh primerih samodejno shrani. Pri merjenju zajamemo štiri vzorce, kar pomeni štiri 32-bitne vrednosti, ki natančno opisujejo dva zaporedna signala. Vse štiri meritve se odvijajo samodejno v strojni opremi mikrokontrolerja. Zato na koncu vse štiri vrednosti števca preprosto preberemo v 64-bitne spremenljivke in analiziramo, glej Program 2.
Pri računanju dolžine impulza uporabimo drugi par vrednosti števca impulzov, ki določa trajanje periode, ko ima signal vrednost 1. Dolžino signala izračunamo kot razliko med vrednostjo števca ob zadnji fronti signala (iz 1 v 0) in vrednostjo števca ob prvi fronti signala (iz 0 v 1). Upoštevamo tudi možnost prevrtenja števca, do katere pride v primeru, ko je v vrednost števca pri naslednji meritvi manjša kot predhodna vrednost. V tem primeru moramo v 64-bitno spremenljivko naprej prišteti vodilno eno. Vrednost frekvence signala izračunamo iz dolžine celotnega impulza, ki jo izračunamo kot razliko med koncem prvega signala in koncem drugega signala.
AX elektronika d.o.o.
Osnovna zgradba in delovanje PIC18 (9)
2014_SE218_38