HTML

Műszer

Hobby és amatőr elektronika, műszerépítés a XXI. században

Címkék

Friss topikok

  • Nite: @fromi: Ha egy bejegyzéssel kapcsolatos kérdésed van, akkor jobb odaírni kommentbe, mert esetleg m... (2010.11.26. 15:17) FAQ

Licenc

Creative Commons Licenc

Primitív USB-s frekvenciamérő ~10MHz

Nite 2010.01.25. 12:28

 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.

Címkék: usb pic frekvenciamérő

Szólj hozzá!

A bejegyzés trackback címe:

https://muszer.blog.hu/api/trackback/id/tr371700379

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása