Rövid ujjgyakorlatként pár alkatrészből és jónéhány sor kódból összerakhatunk egy egyszerű, de bővíthető frekvenciamérőt, közben pedig összebarátkozunk az USB-s PIC-ekkel és a Microchip USB library-vel. Hogy miért USB-s? Abból a feltételezésből kiindulva, hogy gyakorlatilag minden háztartásban van számítógép, ésszerűnek látszik arra terhelni a kijelzést és a számításigényes műveletek egy részét, így maga a műszer olcsóbb tud maradni. Persze egy frekvenciamérőnél amúgy sincs túl nagy kijelző, de ha az alapokat megismerjük most, akkor bonyolultabb műszerekkel se lesz problémánk később.
Nem is tépem tovább a számat, itt a hatalmas kapcsolási rajz:
És a letölthető PIC firmware illetve Windows-os kód. Visual Studio-val fordul mind a kettő, persze a PIC-hez kell az MCC18 fordító is.
Néhány észrevétel már az elején:
- Itt a PIC18F2455 látható, de ebből a családból bármelyikkel helyettesíthető. Más USB képes PIC-ekkel is, de akkor érdemes a Microchip USB Library-ból kiindulni, ugyanis amit itt találsz, azt kicsit kiheréltem hogy olvashatóbb legyen.
- Ez az áramkör simán elmegy az USB tápjáról, úgyhogy nyugodtan össze lehet rakni úgy is. Ahogy egyre több mindent akasztunk rá, előbb-utóbb ez a teljesítmény kevés lesz (és a 0-5V se túl sok komolyabb műszerekhez), így később érdemes lesz saját tápot készíteni neki, és csak figyelni az USB kábel csatlakoztatását (ez van most a rajzon).
- A bemenő jelnek vannak korlátai, a PIC TMR0 számlálóját hajtjuk vele, amihez legalább 0.2Vdd és 0.8Vdd között kell váltakoznia. A mérhető maximum frekvencia olyan 10 MHz-re jön ki. Egy bemeneti fokozattal és egy frekvencia osztóval használhatóbb műszert tudunk ebből csinálni.
- A mérés pontossága attól függ, mennyi ideig mérünk. Ez a kódban az InterruptCount-al szabályozható. A TMR1 megszakítás kb. 22.8Hz-el érkezik, de ha az InterruptCount = 1, csak minden másodikra mér, kb. 11.4Hz-el. Ez a mérés pontossága is. Ha van egy hitelesített frekvenciamérőnk, a pontos szorzót érdemes ahhoz belőni.
Röviden a működésről:
Microchip USB Library:
Aki még nem ismeri, annak röviden leírom melyik fájlban mi található.
- Az USB könyvtárba benézni sem érdemes, azt egyszer jól megírták, működik. Minden ami paraméterezhető, egyel kijjebb van.
- HardwareProfile.h: Ez írja le, hogy melyik lábon mi van.
- usb_config.h: Az USB Library beállításai. Érdemes megjegyezni, hogy itt található az USB_POLLING vagy USB_INTERRUPT flag, ami beállítja, hogy az USB feladatok pollozva vagy megszakításból fussanak. Mivel frekvencia mérésnél jó lenne, ha a mérés vége viszonylag pontosan következne be, mi pollozást használunk.
- usb_descriptors.c: Az USB eszközt leíró VID és PID, illetve a stringek lelőhelye. Éles projektben a Microchip megkér minket, hogy ne az ő VID-jét használjuk.
- interrupt.c: Az alacsony és a magas prioritású megszakítások kódjai
- user.c: Az UserInit függvénybe tehetjük a saját inicializáló utasításainkat, a ProcessIO függvény folyamatosan futó feladatok végzésére használható (itt van az USB polling is), a ServiceRequests függvényben az USB-n érkező kéréseket szolgálhatjuk ki.
Gyakorlatilag ezek a fájlok ugyanazok, mint amiket a Microchip a Generic Demo-jához ad. Amítől ez frekvencia mérő lesz, az a FreqMeter.c és .h fájlokban található.
Induláskor a TMR0 16 biten számol felfele a bejövő jel minden periódusára. Ha a 16 bit körbefordul, a keletkező megszakításban az UpperFreq értéke nő egyel. Minden második (InterruptCount-al állítható) TMR1 megszakítás kiolvassa a TMR0 aktuális értékét és az UpperFreq-t, majd nullázza azokat.
Egy USB utasítás van definiálva, a READ_FREQ. Ez visszaadja a legutoljára mért frekvenciát.
PC szoftver:
A Microchip driver-ét és az ahhoz kapcsolódó mpusbapi.dll-t használjuk. A drivert a driver könyvtárból fel kell telepíteni, az .inf fájlban található a VID és a PID, ha véletlenül át szeretnénk írni.
A többit kicsit túlbonyolítottam, de használható: az usbdriver egy C-s program, ami a dll-t használja, ehhez van egy C# wrapper, az usbwrapper.
Maga a FreqMeter egy C# alkalmazás, indulásakor megnyitja az USB-s eszközt, majd bizonyos időnként kiadja a READ_FREQ parancsot, és megjeleníti a kiolvasott frekvenciát. Itt található a szorzó, amivel lehet kalibrálni egy pontos frekvenciamérőhöz.
Ugyan ez a műszer így frekvencia mérésére éppen hogy csak alkalmas, azért remélem sikerült használható információkat és példakódokat összeszednem az USB-s PIC-ek programozásáról, és talán azok, akik eddig nehezen szánták rá magukat, mert túl bonyolultnak találták a protokollt, mostmár könnyebben fognak boldogulni vele.
UPDATE: Képes vagyok három sor kódot is elrontani, úgyhogy frissítettem a rarokat hibajavított verziókkal.