Avtor: dr. Simon Vavpotič
2018_268_41
Napredek pri razvoju A/D pretvornikov tipa sigma-delta je omogočil vzorčenje počasnih signalov pri zelo visokih ločljivostih, ki dosegajo celo 32-bitov. To omogoča ne le izjemno kakovostno snemanje nizkofrekvenčnih signalov, ki zaznamujejo naravne pojave, notranje delovanje elektronskih naprav in delovanje v človeškega telesa, temveč tudi njihovo natančno analizo. Natančni A/D pretvornik lahko z nekaj truda izdelamo tudi doma.
Ta vsebina je samo za naročnike
V svetu elektronike je veliko različnih vrst A/D pretvornikov, od katerih je večina integrirana v mikrokontrolerje, saj tako ne zavzemajo dodatnega prostorna na tiskaninah. Vendar njihova ločljivost med (ponavadi 8 in 12 biti) ne zadošča za natančne meritve, za katere še vedno potrebujemo zunanje A/D pretvornike. Največjo natančnost in točnost danes omogočajo A/D pretvorniki, ki delujejo po principu sigma-delta. Nekateri imajo že vgrajena tudi vezja, ki zagotavljajo stabilne referenčne napetosti pa tudi vezja za preverjanje pravilnosti, natančnosti in točnosti njihovega delovanja ter kalibracijo.
V preteklem nadaljevanju smo Microchip PIC32MZ EC Starter Kit z mikrokontrolerjem PIC32MZ2048ECH144 s taktom 200 MHz povezali z A/D pretvornikoma ADS1263, ki smo ga lahko prispajkali le s pomočjo vmesniške tiskanine. S pomočjo vgrajene programske opreme, PIC32MZ EC Starter Kit firmware v2.9.1 – alpha, in programske knjižnice, LIB_PCUSBProjects v7.0.NET4x64.dll za Visual Basic 2015.NET, ki ju lahko prenesemo iz spletne strani https://sites.google.com/site/pcusbprojects, smo usposobili enoto SPI2 PIC32MZ za komunikacijo z ADS1263 in spoznali delovanje njegovih notranjih registrov ter izvedli inicializacijo in prve testne A/D pretvorbe, s katerimi lahko preverjamo kakovost A/D pretvorb kar v samem A/D pretvorniku.
Tokrat se lotimo še izdelave kompleksnejše ugnezdene programske opreme, s katero bomo lahko hitro zajemali podatke v PC, v katerem jih bomo obdelovali v realnem času s pomočjo kompleksnih programskih orodij. Preverjali bomo tudi možnosti za čim natančnejše pretvorbe pri čim višjih hitrostih vzorčenja in pokazali, kako izvedemo samodejno ali programsko kalibracijo A/D pretvornika in njen pomen. Vsekakor pa se ne bomo izognili niti dodatni zaščitni analognih vhodov A/D pretvornika pred prenapetostmi in podnapetostmi ter merjenju in analizi signalov v praksi. Kot vir signalov bomo uporabili dolgovalovno anteno, ki jo bomo izdelali iz zračne tuljave. Hkrati bomo zagotovili tudi simetrično napajanje (+2,5 V in -2,5 V) za analogni del A/D pretvornika, saj lahko le tako zajemamo tudi izmenične signale, ne da bi potrebovali kakršnokoli prilagoditev (denimo vhodni kondenzator). Na ta način lahko brez težav zajemamo tudi enosmerne pozitivne in negativne signale.
Nov napajalnik in sprememba napajanja
Za zagotovitev stabilnega analognega napajanja z napetostima -2,5 V in +2,5 V moramo zgraditi zelo stabilen napetostni vir brez visokofrekvenčnih motenj, značilnih za stikalne napajalnike. Zato je smiselno razmišljati od klasičnem dobro stabiliziranem transformatorskim napajalnikom z usmernikom, pri katerem za glajenje napetosti uporabimo velike kondenzatorje in na koncu napetost s pomočjo napetostnih regulatorjev stabiliziramo na -2,5 V in +2,5 V. Tako se v vezju ne bo mogla pojaviti visokofrekvenčna komponenta, ki jo je težko povsem zgladiti v enosmerno napetost. Vsekakor imamo tu v mislih zelo majhna preostala nihanja napetosti, ki znašajo pod 10 mV, so pa kljub temu dovolj velika, da motijo izjemno natančno, 32-bitno A/D pretvorbo, s katero lahko izmerimo tudi napetostne razlike razreda 0,01 mV. Če hočemo doseči točnost na okoli 26 bitov, moramo temu primerno zagotoviti stabilen vir analognega napajanja.
Velja poudariti, da ADS1263 ni občutljiv na to, ali naprej priključimo VADD in VASS (analogno napajanje), ali pa VDD in VSS (digitalno napajanje). To nam omogoča lažjo izvedbo simetričnega napajanja, vendar moramo paziti, da signalov nanj ne pripeljemo preden priključimo obe napajanji, saj vhodna napetost ne sme presegati razpona napajalnih napetosti. Kakorkoli, A/D pretvornik ne začne delovati, preden nista priključeni obe napajanji.
Nova ugnezdena programska oprema
V preteklih nadaljevanjih smo uporabili že izdelano programsko knjižnico, s katero smo iz osebnega računalnika posredno upravljali enoto SPI 2 mikrokontrolerja PIC32MZ2048ECH144. Zdaj je čas, da čim bolje izkoristimo njegove zmogljivosti. Za nepretrgano zajemanje digitaliziranih vrednosti iz A/D pretvornika je potrebna veriga izravnalnikov, s katero preprečimo izgube pri prenosu podatkov in zagotovimo učinkovitejšo izrabo zmogljivosti mikrokontrolerja in osebnega računalnika. ADS1263 ima le 32 bitov vmesnega pomnilnika za glavni A/D pretvornik in 24 bitov za pomožnega. Zato lahko zadnjo digitalizirano vrednost beremo le med izvajanjem naslednje A/D pretvorbe. Za branje je sicer dovolj časa, saj pretvorbe potekajo relativno počasi in večino dela opravi mikrokontrolerjeva enota SPI; kljub temu pa mora biti mikrokontroler vedno na preži za novim podatkom. Vendar lahko uporabo prekinitev med čakanjem izvaja druge naloge, kot je prenos podatkov v osebni računalnik.
Mikrokontrolerji PIC32 imajo vgrajen prekinitveni krmilnik, katerega prekinitvene vhode lahko vežemo tudi na nekatere priključke na ohišju mikrokontrolerskega čipa. Prav zato smo signal ~DRDY smo vezali na vhod RPE2, ki med fazo zajemanja podatkov proži prekinitveni podprogram za zajemanje posameznega vzorca, s katerimi polnimo trenutni izravnalnik. Enostavni prenos podatkov v osebni računalnik bo potekal preko verige izravnalnikov s po 64 bajti, tako da vsakega v osebni računalnik prenesemo s posebnim ukazom. Po drug strani lahko za hitri prenos podatkov uporabimo hitrejše možnosti, kot je gonilnik CDC, ki posnema delovanje zaporednih logičnih vrat, lahko pa tudi Ethernet povezavo, če jo mikrokontroler omogoča. Slednja je najhitrejša in najsplošnejša, vendar zahteva največ programiranja; se pa lahko mikrokontroler z njo predstavi kot povsem avtonomen mini računalnik, do katerega dostopamo preko intraneta.
Vgrajena programska oprema mora omogočati tudi enostaven dostop do posameznih registrov ADS1263. V ta namen imamo uporabljamo programski vmesnik HID, oziroma vmesnik za komunikacijo računalnika s človekom. Slednji omogoča tudi enostaven zajem podatkov v skupinah po 64 bitov. Hitrejši zajem podatkov lahko npr. dosežemo z gonilnikom CDC.
Uporaba gonilnika CDC
Protokol CDC, oziroma protokol komunikacije računalnika z napravo preko vrat USB, omogoča posnemanje delovanja hitrih zaporednih vrat, kakršna so bila na primer RS232, ki so omogočala tudi povezavo terminalov z računalniki glavnega okvira. Je enostavnejša od Ethernet povezave, a kljub temu dovolj hitra tudi za prenos podatkov iz ADC1263 pri hitrosti zajemanja 38.400 sps (vzorcev na sekundo). Zaradi dvosmernosti jo lahko uporabljamo tudi za krmiljenje A/D pretvornika, če si v ta namen izmislimo ustrezne ukaze, ki so lahko podobni modemskim ukazom, kakršne pozna, na primer brezžični modul ESP8266. Hitrost prenosa podatkov je omejena predvsem s hitrostjo delovanja vmesnika USB, kar pa pri PIC32MZ, ki deluje v skladu s standardom USB 2.0, ni problematično, saj brez težav dosežemo hitrosti tudi 12 Mb/s (megabitov na sekundo), oziroma okoli 1 MB/s. Pri tem moramo upoštevati, da nam ADS1263 vselej vrača 32-bitne vrednosti. Zato potrebujemo za prenos 1 vzorca 4 bajte, lahko pa tudi samo dva, če upoštevamo, da točnost zajemanja vzorcev drastično pade pri visokih hitrostih vzorčenja. Denimo, pri 38.400 sps je po podatkih proizvajalca Texas Instruments, največ 15,6 bita. Tako je najnižja potrebna hitrost podatkovnega toka 76.800 B/s oziroma 75 kB/s. Če k temu dodamo še statusni bajt in kontrolni bajt s kodo CRC ali kontrolno vsoto, moramo prenašati 6 bajtov na vzorec namesto 2, kar pomeni za še trikrat hitrejši, oziroma 225 kB/s. Slednje je še vedno okoli nekajkrat manj, kot omogoča priključek USB 2.0 v načinu. Je pa tudi res, da moramo prenašati tudi dodatne podatke zaradi uporabe protokola CDC, ki je natovorjen na protokol USB.
Da bi se izognili nepotrebnemu prenosu kontrolnega in statusnega bajta, lahko preverjanje pravilnosti posameznega vzorca iz A/D pretvornika izvedemo kar na mikrokontrolerju. Tako, je spet dovolj proti osebnemu računalniku prenašati zgolj 2 bajta, oziroma zgolj toliko bajtov, kolikor jih vsebuje smiselne vrednosti. Pri nižjih hitrostih zajemanja podatkov, od 400 sps do 19.200 sps zadoščajo trije bajti. To pomeni, da je največja potrebna pasovna širina 57.600 B/s, oziroma 56,25 kB/s. To pa je manj kot pri prejšnjem primeru. Po drugi strani, moramo 4 bajte pošiljati samo, če zajemamo s hitrostjo 100 sps ali manj. Tu težav ni, saj je najhitrejši mogoč tok podatkov le 400 B/s.
Koncept ugnezdene programske opreme CDC
Pri izdelavi programske opreme se splača uporabiti dva načina delovanja. Pri prvem prenašamo posamične ukaze, ali beremo ali pišemo posamične vrednosti registrov A/D pretvornika, pri drugem pa le hitro zajemamo podatke iz A/D pretvornika. Pri drugem načinu delovanja potrebujemo poseben znak za prekinitev prenosa podatkov in vrnitev v ukazni način. Glede na to, da je ADS1263 le vir podatkov, je komunikacija v drugo smer skoraj neizkoriščena. Zato je dovolj, da oddamo na primer kodo ESC po tabeli ASCII, ali preprosto pošljemo drug ukaz v izvajanje. Vse ostalo je relativno preprosto, saj mikrokontroler prekine pošiljanje podatkov in zaustavi kontinuirano A/D pretvorbo takoj, ko sprejme nov ukaz ali kodo za prekinitev. Lahko bi se odločiti tudi za način implementacije, kjer pošiljanje zaporedja pretvorjenih vrednosti prekine kakršenkoli povratni znak iz osebnega računalnika, vendar je to odvisno tudi od tega, ali ima do navideznih zaporednih vrat dostop samo naša aplikacija, ali pa se lahko po pomoti poveže še kaka terminalska aplikacija.
Osnovno inicializacijo ADS1263 izvedemo samodejno ob vklopu mikrokontrolerja, ko zgradimo tudi izravnalnik. Slednji je lahko enoten, pri čemer za branje in pisanje iz njega uporabimo ločena kazalca. Zaradi preprečevanja možnosti napak dodatno uporabljamo še števec shranjenih bajtov. Na začetku je števec shranjenih bajtov 0, prav tako pa tudi kazalca za pisanje in branje. Ko vklopimo zajemanje podatkov, se začne izravnalnik polniti s podatki in ob vsaki prekinitvi dobi dodaten vzorec štirih bajtov in dveh kontrolnih bajtov.
Kazalec za pisanje vedno kaže na prvo prosto lokacijo v izravnalniku, medtem ko kaže kazalec za branje na prvo še prebrano lokacijo, ki je najdlje časa v izravnalniku. Bralni kazalec pomikamo naprej z branjem vrednosti po protokolu CDC toliko časa, dokler so v izravnalniku vrednosti, ki jih še nismo prebrali.
Po drugi strani lahko prekinitveni podprogram vpisuje nove vrednosti le, dokler je v izravnalniku še prostor. Slednji kljub vsemu ni majhen, saj lahko pri PIC32MZ obsega kar 500 kB, pri čemer moramo nekaj malega spomina pustiti za spremenljivke. Omenimo še to, da se pomikata kazalca za pisanje in branje ciklično, kar pomeni, da se, ko dosežeta konec izravnalnika, vrneta na začetek. Vendar to ne pomeni, da bomo povozili še ne prebrane podatke. Ključno vlogo igra števec neprebranih vrednosti iz izravnalnika, ki se povečuje s pisanjem in zmanjšuje z branjem. Pisanje zaustavimo le v primeru, ko kazalec za pisanje po ciklu »dohiti« kazalec za pisanje. A k sreči to ni pogosta situacija, saj pomeni, da je nekaj šlo narobe. Praviloma je kazalec za branje tisti, ki dohiti kazalec za pisanje, kar pomeni, da smo prebrali vse vrednosti.
Ugnezdena programska oprema po protokolu CDC
Koncept imamo! Zdaj je čas, da se zares lotimo pisanja ugnezdene programske opreme, ki bo delovala z gonilnikom CDC. V programski knjižnici Microchip Harmony med primeri za USB najdemo tudi cdc_com_port_single, ki omogoča posnemanje enega zaporednega vmesnika. V programu 1 vidimo, kako podatke iz izravnalnika prenašamo v osebni računalnik s pomočjo ukaza USB_DEVICE_CDC_Write. Pri tem najprej preverimo stanje kazalcev za branje (rpoi) in pisanje (wpoi), da ugotovimo, ali so podatki na voljo. V naslednjem koraku prepišemo blok podatkov v izhodni izravnalnik za prenos velikosti BUFF_out_max. Pri tem upoštevamo tudi velikost glavnega izravnalnika, ki je BUFF_max. Ko kazalec rpoi doseže konec izravnalnika, s vrne nazaj na začetek in nadaljuje z branjem, razen ko zmanjka podatkov, glej program 1.
Sledi izvajanje ukaza USB_DEVICE_CDC_Write, s katerim prenesemo vsebino izhodnega izravnalnika na navidezna zaporedna vrata. Od tu jih lahko prebere osebni računalnik.
Poglejmo še, kako sprogramiramo vhodni del za zajemanje ukazov preko navideznih zaporednih vrat. Ta del kode je časovno manj kritičen, saj je ukazov malo, je pa vseeno pomembno, da ukaze mikrokontroler ukaze sprejme v pravilnem vrstnem redu in jih tako tudi izvrši, ko pridejo na vrsto.
Zdaj je na vrsti vhodna komunikacija preko vmesnika CDC, ki omogoča pošiljaje ukazov za izvajanje različnih aktivnosti, denimo branja ali pisanja vrednosti posameznega registra ADS1263, glej program 2.
Kot vidimo, program 2 najprej preveri, ali je kako branje podatkov še v teku. Če ni, nadaljuje in prebere podatke iz vhodnega izravnalnika v vmesni izravnalnik za obravnavo ukazov velikosti BUFF_in_max. Sledi zagon ukaznega procesorja (ki presega obseg tega članka), ki obdela in izvede ukaze za A/D pretvornik. Zgradba ukaznega procesorja je odvisna od naših potreb. Če nočemo izgubljati časa s prenašanjem uporabniku prijaznih tekstovnih ukazov, si lahko izmislimo kratke in učinkovite ukazne kode, ki jih lahko sestavimo podobno kot kode, s katerimi krmilimo ADS1263 preko vmesnika SPI. Po drugi strani, lahko podpremo tudi modemskim podobne ukaze, ki jih brez večjih težav ročno pošljemo tudi preko terminalskega vmesnika, denimo: »SETREG 5,43« pomeni nastavi register 5 na vrednost 43, medtem ko ukaz »GETREG 6« vrne vrednost registra 6, ukaz »START1« pa zažene konstantni prenos podatkov iz A/D pretvornika 1 v osebni računalnik. Nasprotje »START1« pa je ukaz »STOP1«, ki tak prenos podatkov prekine.
Ugnezdena programska oprema po protokolu TCP IP
Glavni prednosti prenosa podatkov po protokolu TCP IP sta večji hitrost in splošnost. Mikrokontroler z njimi postane enakopravni član intranetnega (ali celo internetnega) omrežja. Zato lahko podatke iz A/D pretvornika neposredno prenašamo v katerikoli računalnik v omrežju, ki ima naloženo ustrezno programsko opremo.
Po drugi, strani se moramo pri pisanju programske kode veliko bolj potruditi. Čeprav v Microchipovi programski knjižnici Harmony primerov ne manjka in je še posebej zanimiv primer splošnega spletnega strežnika, web_net_server_nvm_mpfs, kljub temu ne moremo mimo dejstva, da za tak način komunikacije porabimo veliko dragocenega pomnilnika PIC32MZ, ki bi ga lahko izrabili tudi za izravnalnik za vzorce. Hkrati mikrokontroler obremenimo z veliko več dodatnimi naloga in je zato njegova odzivnost manjša. Zato se bolj splača začeti z enostavnejšim primerom, tcpip_tcp_server, ki se osredotoča zgolj na prenos podatkov, ne pa tudi na prikaz spletnih strani.
Omenjeni aplikaciji vsebujeta tudi konzolne statusne izpise, s katerimi lahko preverjamo delovanje prenosa podatkov poreko povezave TCPIP. Programska oprema primerov je namreč zasnovana tako, da podpre navidezna zaporedna vrata po protokolu CDC. Tako je dovolj, da v osebni računalnik namestimo zgolj ustrezno (zastonjsko) aplikacijo za podporo delovanju tekstovnemu terminalu in spremljamo obvestila.
Spremljanje naravnih pojavov
Čeprav spremljanje atmosferskih pojavov morda za marsikoga ni najbolj zanimivo področje, je zanimiva s stališča dobrega izkoristka zmogljivosti A/D pretvornika. Avtorji številnih člankov na spletu se namreč pogosto pritožujejo nad premajhno ločljivostjo zajema podatkov in premajhnim ojačenjem signala z enostavnimi vezji. ADS1263 nima težav z ojačenjem šibkih signalov, ki znašajo zgolj nekaj mV, ločljivost pa je močno odvisna od hitrosti zajema podatkov, a kljub temu impresivna. Dobro je tudi to, da lahko anteno za dolge valove povežemo skoraj neposredno z vhodom A/D pretvornika, katerega analogni del napajamo simetrično z -2,5 V in +2,5 V. Edino, kar moramo dodati, sta zaščitni diodi (npr. 2x 1N914) na analognem vhodu, polarizirani pozitivno in negativno, ki preprečujeta prenapetosti in podnapetosti iz antene.
Ko imamo podatke enkrat v osebnem računalniku, jih moramo še primerno obdelati. Za začetek sem uporabil doma izdelano aplikacijo za izvajanje FFT v realnem času, s katero se da dobro razbrati signale, ki jih zaznava antena v realnem času in izločiti zanimivosti. Še posebej zanimiva možnost je nastavljanje občutljivosti, s katero se lahko prilagodimo moči dolgovalovne antene (več v članku Svet ultranizkih frekvenc; zaznavanje naravnih pojavov in še česa iz SE263).
Natančni merilnik enosmernih napetosti
ADS1263 je zanimiv tudi za laboratorijsko uporabo, saj omogoča izredno natančno merjenje enosmernih napetosti. V resnici ni treba prav dosti in že ga lahko s pomočjo mikrokontrolerja in prikazovalnika LED ali OLED spremenimo v pravi merilni instrument. Pri takem merjenju hitrost prenosa podatkov ni odločilna, zato večino dela opravi kar A/D pretvornik. Naloge mikrokontrolerja so predvsem nadzor nad izvajanjem umerjanja, še posebej z uporabo vgrajenega temperaturnega tipala ter dodatnega A/D in D/A pretvornika. Bistveno je zagotoviti čim več stabilnih in točno prikazanih decimalnih mest izmerjene vrednosti napetosti, ki je osnova tudi za meritve toka in ostale meritve, ki jih podpirajo multimetri.
Nizkofrekvenčni osciloskop
Med zanimive aplikacije sodi tudi možnost izgradnje nizkofrekvenčnega osciloskopa, ki zmore vzorčiti signale do okoli 20 kHz, kar je dovolj tudi za kakovosten zajem in analizo zvoka in govora. Že res, da običajno zmorejo digitalni osciloskopi veliko višje frekvence vzorčenja, a ne zmorejo tako visokih ločljivosti in točnosti, ki sta pomembni za celostno zajemanje informaciji iz nizkofrekvenčnih signalov.
Ko imamo delujoč A/D pretvornik, povezan z osebnim računalnikom, potrebujemo zgolj še ustrezno programsko aplikacijo, ki omogoči želen način prikaza izmerjenih vrednosti v realnem času. Navdih za njeno izdelavo lahko dobimo iz aplikacije SoundardScope, ki je zastonj na voljo na spletni strani http://www.zeitnitz.de/Christian/scope_en. Deluje preko zvočne kartice osebnega računalnika, zato jo lahko enostavno preizkusimo na vzorcih zvoka, ali drugih signalih, ki jih pripeljemo na vhod zvočne kartice. Iz nje lahko razumemo osnovne funkcionalnosti, ki so potrebne za pravilen časovno-napetostni prikaz zaporedij izmerjenih vrednosti signala. Hkrati ne smemo pozabiti, da ima ADS1263 kar 11 analognih vhodnih priključkov, med katerimi preklapljamo s pomočjo vgrajenih multiplekserjev. To omogoča zajem in vzorčenja velikega števila nizkofrekvenčnih signalov hkrati. Zato lahko brez težav izdelamo tudi večkanalni nizkofrekvenčni osciloskop.
Prednosti in slabosti A/D pretvornikov visoke ločljivosti
V elektroniki danes večinoma uporabljamo hitre A/D pretvornike ločljivosti do 16 bitov, saj uporabljamo hitre signale, nasprotno pa so A/D pretvorniki z visokimi ločljivostmi, večjimi od 24 bitov, namenjeni meritvam počasnih signalov, ki večinoma ne izvirajo iz elektronskih naprav, temveč iz naravnih pojavov pa tudi iz človeškega telesa. Zato predstavljajo most med naravnim in umetnim, ki ga lahko s pridom uporabimo tudi na področju bionike…Program 1: Prenos podatkov iz PIC32 v osebni računalnik preko CDC
if(buff_rpoi!=buff_wpoi){ n=0; while((buff_rpoi!=buff_wpoi)&&(n<BUFF_out_max)){ //APP_READ_BUFFER_SIZE if(buff_rpoi>=BUFF_max){ // circulate buff_rpoi=0; } BUFF_OUTPUT[n] = BUFF[buff_rpoi]; n++; buff_rpoi++; } USB_DEVICE_CDC_Write(USB_DEVICE_CDC_INDEX_0,&appData.writeTransferHandle,BUFF_OUTPUT,n, USB_DEVICE_CDC_TRANSFER_FLAGS_DATA_COMPLETE); } Program 2: Prenos podatkov iz osebnega računalnika v PIC32 preko CDC
appData.state = APP_STATE_WAIT_FOR_READ_COMPLETE; if(appData.isReadComplete == true){ appData.isReadComplete = false; appData.readTransferHandle = USB_DEVICE_CDC_TRANSFER_HANDLE_INVALID; USB_DEVICE_CDC_Read(USB_DEVICE_CDC_INDEX_0,&appData.readTransferHandle, appData.readBuffer, BUFF_in_max); if(appData.readTransferHandle == USB_DEVICE_CDC_TRANSFER_HANDLE_INVALID){ appData.state = APP_STATE_ERROR; break; } }