• No results found

Mjukvara

In document Ammunition for measurements (Page 50-54)

F¨orutom A/D-omvandlaren och processorn utg¨or ¨aven programvaran som kon- struerats f¨or processorn en av huvudkomponenterna i labsystemet. I huvudsak utf¨or programmet initieringar, sk¨oter kommunikation med processorns periferien- heter (till exempel minnen, A/D-omvandlare och PC via UART) samt flyttar samplad data. Programkoden hittas i bilaga B och i figur 4.4 ses fl¨odesschemat ¨over programmet. Sektionen beskriver ¨overgripande de delar som det konstruerade programmet inneh˚aller.

4.2.1

Initieringar

F¨or att inte samplingsfrekvenserna f¨or respektive signaler ska bli p˚averkade av de instruktioner och den dataflyttning som sker mellan tv˚a sampel, s˚a valdes en tillr¨ackligt h¨og klockfrekvens f¨or processorn f¨or att undvika att dessa frekven- sproblem skulle uppst˚a. Frekvensen valdes genom att kontrollera att samtliga samplingsfrekvenser h¨olls korrekta med hj¨alp av m¨atningar med oscilloskop. Core- klockfrekvensen (klocka f¨or processork¨arnan, CCLK) valdes till 540MHz och sys- temklockans (klocka f¨or bussar till periferienheter, SCLK) frekvens valdes till

Figur 4.4: Schema ¨over programfl¨odet

54MHz. Dessa frekvenser sattes genom att st¨alla in de register som styr den in- terna PLL:en4

som i sin tur matas med klockpulser fr˚an en 27MHz oscillatorkrets p˚a utv¨arderingskortet.

I/O-pinnarna (programmable flags, PF’s) initierades f¨or att sk¨ota handskakssig- nalerna till A/D-omvandlaren och styra transistorn i urladdningskretsen. Pinnen som tar emot signalen EOC5

fr˚an A/D-omvandlaren ¨ar ocks˚a konfigurerad s˚a att den genererar ett avbrott i programfl¨odet, som g¨or att en avbrottsrutin k¨ors. Avbrottet genereras d˚a EOC signalen ¨andras fr˚an etta till nolla, det vill s¨aga att den triggar p˚a negativ flank eftersom signalen ¨ar aktivt l˚ag. Vilka pinnar som sk¨oter vilken funktion visas i tabell 4.1.

Tre timers anv¨ands i programmet. En anv¨ands till att best¨amma seriekommu- nikationens ¨overf¨oringshastighet och tv˚a har endast i uppgift att m¨ata tidsperi- oder och p˚a s˚a s¨att skapa lagom l˚anga f¨ordr¨ojningar i programmet. Timern f¨or serie¨overf¨oringsfunktionen ¨ar ¨aven initierad s˚a att den genererar avbrott d˚a den anv¨ands. Serie¨overf¨oringsfunktionen som ¨aven kallas autobaud detection beskrivs

4

Phase Locked Loop

5

PF Funktion I/O 0-2 Kanaladress p˚a AD-omvandlare O

3 Urladdningstransistor O

4 End of conversion (EOC) I

5 Conversion start (CONVST) O

6 Chip select (CS), Read (RD) O

7 - -

8-15 8 bitar samplingsdata I

Tabell 4.1: Funktioner f¨or programmable flags

noggrannare senare i kapitlet. ¨

Aven A/D-omvandlaren initieras i DSP-programmet i den m˚an att omvand- laren v¨acks upp ur l˚agstr¨omsl¨age och utf¨or en omvandling. Omvandlaren ¨ar sedan redo att anv¨andas i programmet.

SDRAM:et initieras inte i koden eftersom det g¨ors automatiskt d˚a programmet k¨ors via USB fr˚an utvecklingsmilj¨on Visual DSP++. D˚a programmet d¨aremot ska bootas fr˚an exempelvis ett ickeflyktigt minne s˚a ¨ar det d¨aremot n¨odv¨andigt att initiera SDRAM:et, vilket d˚a sker i en separat initieringsfil.

Eftersom lagringen av samplingsdata sker i det externa SDRAM:et ist¨allet f¨or i det interna minne p˚a DSP-chipet, m˚aste de arrayer som allokeras minnesmappas mot just SDRAM:et. Minnesmappningen sker med hj¨alp av l¨ankaren i program- mets linker description file.

4.2.2

Samplingsrutinen

Samplingsrutinen som ¨ar huvuddelen i programmet ¨ar i sin tur uppdelad i tv˚a delar. Den f¨orsta delen samplar de fem olika kanalerna i cirkul¨ara buffrar som h˚aller den m¨angd samplingsdata som inh¨amtats under en sekund. Hur stora dessa buffrar ¨ar minnesm¨assigt beror p˚a respektive kanals samplingsfrekvens. D˚a DC- signalen g˚ar h¨og ¨overg˚ar samplingsrutinen till sin andra del d¨ar den inh¨amtar data fr˚an samtliga signaler i ytterligare 150 millisekunder, det vill s¨aga s˚a l¨ange som skottet tar emot programmeringssignaler. Varje samplingsdata lagras s˚a fort det inh¨amtats, kontinuerligt i det externa SDRAM:et.

F¨or att kunna h˚alla samtliga kanalers samlingsfrekvenser konstanta ¨ar sam- plingsrutinen konstruerad med en intern periodtid som ¨ar h¨alften s˚a stor som pe- riodtiden f¨or den snabbast samplade kanalen. Under den tiden ska rutinen hinna med kanaladressering, ¨ovrig kommunikation med A/D-omvandlaren som kr¨avs f¨or att en omvandling ska utf¨oras samt lagring av data. J¨amna perioder samplas den snabbaste kanalen (HF-signalen) och ¨ovriga kanaler delar p˚a de udda perioderna.

Som tidigare beskrivits i sektion 3.1.1 p˚a sida 7, s˚a kan en cirkul¨ar buffer kon- strueras av en array som har sitt sista element knutet till sitt f¨orsta. DSP:er ¨ar dessutom i regel optimerade f¨or att hantera cirkul¨ara buffrar mycket snabbt och ef- fektivt. Under samplingsrutinens f¨orsta del sparas en sekunds data f¨or varje kanal i cirkul¨ara buffrar. Med dessa cirkul¨ara buffrar begr¨ansas allts˚a den data som sparas innan samplingsrutinen g˚ar in i sin andra del, oberoende av tiden fr˚an att program- met startas till dess att DC-signalen g˚ar h¨og. F¨or att avg¨ora n¨ar n¨asta position i en cirkul¨ar buffer ¨ar˚aterigen den f¨orsta ¨ar det l¨attaste och kodm¨assigt ”snyggaste” att anv¨anda modulo-operatorn (det vill s¨aga procenttecknet, ’%’). Modulo-operatorns funktion ¨ar att dividera tv˚a tal, men ist¨allet f¨or att avge kvoten som resultat som i vanlig division blir resultatet ist¨allet resten. I samplingrutinen visade sig modulo- operatorn g¨ora rutinen l˚angsam och som tidigare beskrivits ¨ar det mycket viktigt f¨or samplingsfrekvenserna att rutinens interna periodtid h˚alls konstant. Problemet innebar att ett omst¨andigare s¨att med if-satser, som unders¨okte om n¨asta element i buffern f¨orv¨antades vara det f¨orsta, ist¨allet implementerades. Det senare s¨attet fungerade mycket snabbare ¨an det med modulo-operatorn och anv¨andes d¨arf¨or ist¨allet i rutinen. Den slutsats som kunde dras var att anv¨andandet av modulo vid skapandet av cirkul¨ara buffrar inte automatiskt utnyttjade det st¨od f¨or dessa buffrar som DSP:er vanligen inneh˚aller. Med korrekta initieringar av DAG-register (se sektion 3.1.1 p˚a sida 7) skulle st¨odet f¨or cirkul¨ara buffrar kunna anv¨andas, men eftersom detta st¨od maximalt kan hantera fyra buffrar ˚at g˚angen utnyttjades inte m¨ojligheten (applikationens fem kanaler kr¨aver fem buffrar).

4.2.3

Data¨overf¨oring

N¨ar programmet k¨ort samplingsrutinen f¨ardigt ska ¨overf¨oring av samplingsdata till en PC kunna ske. ¨Overf¨oringen valdes seriell via processorns UART-port. Pro- grammet startar seriekommunikationen d˚a en PC skickar tecknet ’@’ till proces- sorn, vilket triggar ett interrupt. Genom att m¨ata det skickade tecknets pulsbredd, med hj¨alp av en timer (i autobaud mode), best¨ammer programmet p˚a s˚a s¨att den ¨overf¨oringshastighet som PC:n anv¨ander sig av och s¨ander ¨aven sj¨alv data i den hastigheten forts¨attningsvis. N¨ar data¨overf¨oringshastigheten ¨ar fastst¨alld b¨orjar sedan ¨overf¨oringen av samplingsdatan. Datan som ¨ar lagrad i SDRAM-minnet som integers (variabel f¨or heltal) kommer efter ¨overf¨oringen att tolkas av PC:ns terminalprogram som ASCII-kod. F¨or att representera A/D-omvandlarens 8-bitars resultat med ett heltal ist¨allet f¨or endast ett tecken enligt ASCII-tabellen s˚a ska- pades en rutin som omvandlade varje siffra i resultatet till motsvarande ASCII- tecken. P˚a detta s¨att ¨ar den ¨overf¨orda datan mycket l¨attare att hantera f¨or ett mottagande program.

In document Ammunition for measurements (Page 50-54)

Related documents