William Sandqvist AD-omvandling
William Sandqvist Ny processor med AD-omvandlare PIC16F628 saknar AD-omvandlare. När vi behöver AD-omvandlare här i skolan använder vi PIC16F874. Många andra PIC- processorer har inbyggd AD- omvandlare, tex. PIC16F AD-kanaler på PORTA och PORTE AN0/RA0/2 AN1/RA1/3 AN2/RA2/4 AN3/RA3/5 AN4/RA5/7 AN5/RE0/8 AN6/RE1/9 AN7/RE2/10
William Sandqvist En AD behöver en DA DA i puben ( Digitalt in Öl ut ) …Digitalt in Spänning ut … I en DA-omvandlare styr det binära talets bitar binärkodade ”strömmar” som summeras till ett analogt spänningsvärde i en resistor.
William Sandqvist Succesiva approximationer AD-omvandling med succesiva approximationsmetoden AD-omvandling enligt metoden succesiva approximationer är jämförbart med att väga en okänd massa med binära vikter på en balansvåg. Man provar steg för steg med att lägga till binära ”vikter” om ” ”. AD-omvandlaren innehåller en DA- omvandlare och en komparator.
William Sandqvist AD-omvandlingen tar tid. För varje bits upplösning krävs ett ytterligare steg. Binära vikter …
William Sandqvist En AD-omvandlare, 8 kanaler Med PIC-processorns AD- omvandlare kan man mäta 8 olika spänningar, en i taget. Kanalvalsmultiplexor.
William Sandqvist Inre eller Yttre referensspänning? AN3 och AN2 kan användas till yttre referensspänning ( jäm- förelsespänning ) och jord. Det enklaste är naturligtvis att använda matningsspänningen ( AV DD och AV SS ) som referens, men det kan finnas olika anledningar till att använda yttre spänningsreferens.
William Sandqvist Yttre precisionsreferens Voltmeter. Det är viktigt att den uppmätta spänningen jämförs med en exakt referens. Om utrustningen tillexempel är batteridriven, så varierar matnings- spänningen för mycket för att vara lämplig som referensspänning. AD-omvandlaren får nu skalfaktorn 4 mV/steg. Division med "4“, för att få skalfaktorn 1 mV/steg, kan man utföra genom att "skifta" det binära talet två steg åt höger. ( Multiplikationer och divisioner innebär mycket programkod för PIC- processorer som saknar inbyggd multiplikatorenhet ). Man ansluter då en yttre referensspänning till ingången AN3. Spänningsreferenskretsen MAX6241 har spänningen 4,096V. Detta "ovanliga" spänningsvärde kommer av att talet 4096 är en tvåpotens, 2 12 = PIC-processor som voltmeter.
William Sandqvist Inre precisionsreferens? PIC12F1840 har en inre referensspänning 1,024. Den inbyggda AD- omvandlaren kan då få 1 mV omvandlingssteg. PIC-processor som voltmeter.
William Sandqvist Högsta upplösning Vill man ha högsta upplösning vid mätning av givarsignaler måste man se till att givarens utspänningsområde och det spänningsområde AD-omvandlaren omvandlar helt "täcker" varandra. I allmänhet krävs det då att både AD- omvandlarens referensspänning och 0-nivå kan justeras. Hög upplösning kräver att AD-omvandlarens referensspänning och 0-nivå kan justeras efter givarens spänningsområde.
William Sandqvist Ex. Linjäriserad NTC-termistor Ett praktiskt exempel är temperaturmätning med en NTC-termistor. En termistor har hög känslighet, men olinjärt temperatursamband. I praktiken seriekopplar man termistorn med en fast resistor så att den ingår i en spänningsdelare. ( Tekniken beskrivs i boken Mätgivare ). Figuren visar sambandet mellan spänning och temperatur för en sådan spänningsdelare. Kurvan börjar vid 0,5 V och slutar vid 3,5V och blir däremellan förvånadsvärt linjär.Mätgivare
William Sandqvist Ex. Linjäriserad NTC-termistor Genom att ställa in V REF- = 0,5V och V REF+ = 3,5V med potentiometrarna, så utnyttjar temperaturgivaren AD-omvandlarens hela spänningsområde. 3,5V 0,5V
William Sandqvist Ratiometrisk inkoppling Ratiometrisk anslutning av en potentiometer till en AD-omvand- lare. Som referensspänning kan den ostabiliserade matningsspän- ningen användas! Ibland behöver man stabila referens- spänningar både till givare och AD- omvandlare. Ett ofta använt konstgrepp är då ratiometrisk anslutning av givaren. Så länge givarens referensspänning och AD-omvandlarens referens- spänning ändrar sig i samma proportioner så omvandlas samma värde. Om man har samma referens- spänning till givare och AD-omvand- lare så ställs det därför inga krav på att den ska vara stabil. Detta är några av anledningarna till att PIC-processorns AD-omvandlare har inkopplingsmöjligheter för externa spänningsreferenser!
William Sandqvist 10 bitar 1024 steg 5 mV/steg Upplösning 0,1% b9b8b7b6b5b4b3b2b1b0b9b8b7b6b5b4b3b2b1b0 AD-omvandlaren är på 10 bitar. Vad kostar en givare som har 10 bitars upplösning? 100 $ ? Vanligare är att man har råd med en 8 bitars givare. (PICprocessorn själv kostar 10 $). Behövs 10 bitars upplösning?
William Sandqvist 8 bitar 256 steg 20 mV/steg Upplösning 1% b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 Behöver man bara 8 bitars upplösning kan man strunta i de två minst signifikanta bitarna och hantera resultatet som en Byte. 8-bitars program
William Sandqvist Vänsterjusterat resultat för 8 bitar Vänsterjusterat. 8 bitarstal: char answer; answer = ADRESH;
William Sandqvist 8 effektiva bitar 256 effektiva steg 5 mV/steg Upplösning 1% 1 0 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 Behöver man bara 8 bitars upplösning kan de två mest signifikanta bitarna få vara konstanta. Man slipper förstärka givarsignalen eftersom steget är 5 mV. Undvik förstärkare En febertermometer behöver bara temperaturområdet 34 …43 (eller hur!) 34 43
William Sandqvist Högerjusterat resultat 10 bitar Högerjusterat. 10 bitarstal: unsigned long answer; answer = 256*ADRESH; answer += ADRESL;
William Sandqvist Vad händer om signalen ändrar sig under omvandlingen? AD-omvandlaren kan aldrig ”ångra” en redan bestämd bit! Resultatet blir ett värde som före- kommit under omvandlingen, men vid en obestämd tidpunkt!
William Sandqvist Problemet Samplingstid- punkten blir obestämd!
William Sandqvist Sample & Hold -krets Lösningen är att den analoga signalen ”fryses” under omvandlingen. Vid AD-omvandlingens start tar en switch ett ”sample” av signalen och lagrar det i en kondensator. PIC-processorernas samplingskondensator har kapacitansen 120 pF.
William Sandqvist ACQUISITION TIME t ACQ Varje gång man har valt/ändrat kanal måste samplingskondensatorn C HOLD hinna ladda upp sig till den analoga spänningen. Detta tar c:a 20 s. En 20 s fördröjning kan enklast programmeras som: char i = 3; do ; while ( --i > 0); /* 4 MHz clock */
William Sandqvist AD-omvandlarens inställningar Det är många inställningar som måste göras för att få fart på AD- omvandlaren! Ett inställningsscript finns som hjälpmedel
William Sandqvist AD-omvandlarens klockfrekvens PIC-processorn är snabbare än AD-omvandlaren. Som klocka för AD- omvandlaren kan PIC-oscillatorns frekvens delad med 2, 8, eller 32 användas. Vid 4 MHz klocka ska oscillatorfrekvensen delas med minst 8 innan den används till AD-omvandlaren.
William Sandqvist Ställa in AD klockfrekvens
William Sandqvist Ställa in portpinnar AN/Ref/Dig
William Sandqvist Vilka kombinationer är möjliga? 8 analoga kanaler, matningen som referens? En analog kanal med ratiometrisk anslutning? Två analoga kanaler, matningen som referens? Oooops!
William Sandqvist Ställa in portpinnar AN/Ref/Dig Glöm inte att också ställa in portpinnarnas TRIS-register. ”1” för ingångar Analoga eller Digitala, ”0” för Digitala utgångar.
William Sandqvist Ställa in AD kanal
William Sandqvist Starta AD och vänta på klar Starta AD- omvandling: GO = 1; Vänta på AD-omvandling klar: while( GO ) ;
William Sandqvist Läsa av resultatet två resultatregister Högerjusterat. 10 bitarstal: unsigned long answer; answer = 256*ADRESH; answer += ADRESL; Vänsterjusterat. 8 bitarstal: char answer; answer = ADRESH;
William Sandqvist Hur snabbt kan man omvandla? Varje AD-omvandling behöver 12 AD-klockcykler plus ett 2 AD-klock- cykler mellanrum mellan omvandlingarna. Används alla 8 kanalerna så reduceras omvandlingshastigheten. T ACQ 20 s måste nu införas mellan kanalbytena. I praktiken behöver PIC-processorn också tid för att göra något med alla mätvärden! Vi använder f osc /8
William Sandqvist AD-lab Blinkfrekvensen ställs in med potentiometern!
William Sandqvist Initiering AD-lab /* AD Setup. Se help Script! */ /* 01.xxx.x.x.x ADclock = fosc/8 xx.000.x.x.x select ch AN0 xx.xxx.0.x.x go = 0, start AD later xx.xxx.x.0.x – xx.xxx.x.x.1 AD unit is ON */ ADCON0 = 0b ; /* 0.xxx.xxxx left justification x.000.xxxx – x.xxx.1110 internal reference, Vref+ = Vcc, Vref- = Vss */ ADCON1 = 0b ; TRISA.0 = 1; /* RA0/AN0 is input */
William Sandqvist while(1) { char i = 3; do ; while ( --i > 0); /* wait tACQ */ GO=1; /* start AD */ while(GO); /* wait for done */ blinktime = ADRESH; /* read result 8 msb */ /* double loop i,j generates blinkfrequency */ for( i=0;i < blinktime; i++) { for( j=0;j < 250; j++); } /* toggle lightdiode on/off */ LED = ! LED; }