Hej! Jag har precis börjat experimentera lite med ADC på en PIC12F675. Har bland annat en temperatursensor (MCP9701) som ger ut 19,5 mV/C°.
Det jag undrar är hur man med ADC'n kan veta hur många volt som ligger på ADC-pinnen? Om jag t.ex lägger 3 volt på pinnen, hur representeras det värdet i binärt tal?
Ursäkta om det är luddigt skrivet, och tack för eventuell hjälp!
Det beror på vad du har för upplösning på AD-omvandlaren och vilken referensspänning. Vid 10 bitars ADC och 5 volt referens motsvarar 5 volt 1024 bitar. 3 volt motsvarar då 614 bitar.
Nästan alla µC har en ADC där referensspänningen är VDD, vissa kan väljas till lite andra alternativ. Om vi utgår ifrån att VDD är 5V och Vref, att ADC'n kör med 10 bit och att de kommer in 3V är resten enkelt:
("Avläst värde" * 1000*VDD)/1024 = inkommande spänning i mV
Edit: "3 volt motsvarar då 614 bitar"... oh fan, jag trodde att ADC'n hade 10 bit...
Menar du kanske att det avlästa värde skulle bli 614?
Hmmh... räkna lite... 614*1000*5 = 3070000, dela sedan med 1024 = 2998mV
Verkar passa.
Glöm dock inte att lägsta upplösning är 5V/1024 = ~4,88mV
Senast redigerad av Icecap 14 juni 2008, 19:02:57, redigerad totalt 3 gånger.
Så varje steg på en 10-bitars ADC (1024 steg) är alltså 0.25 deg C.
Finessen med att ha just 19,5 mV/dec C är att det blir enkelt
att "översätta" att binärt värde från ADC'n (vid 5V) utan större
beräkningar.
Dividera värdet från ADC'n (d.v.s shifta två steg höger) så har du
värdet i degC.
Så i det här fallet så är det komplett ointressant vilken den
faktiska spänningen på ADC'n är, genom att de har valt
just den "lutningen" på temp-givaren...
Oj, många svar på kort tid! Tack så mycket ni som skrivit, detta hjälper mig oerhört! Ska experimentera vidare och hoppas på bättre lycka den här gången
Edit: Och ja, det stämmer, referensen är samma som VDD.
Var uppmärksam på att denna sensor inte är något precisionsinstrument!
Databladet säger +/- 1 grad typisk avvikelse, men +/- 4 (ojdå!) grader maximum avvikelse för modellen utan "A" på slutet. Med "A" är den "endast" 2 grader....
För att ha något så när garanterad noggrannhet måste Du kalibrera. Som minst en offset, det räker för att ha den som rumstermometer. Skall den användas över ett större temperaturområde behövs nog en kalibreringsabell.
Såhär ser kodraden som läser ADC'n ut (mikroPascal):
temp := (5000 / 1024 * Adc_Read(2)) shr 2;
Så, låt oss säga att jag vill detektera när temperaturen
är uppe i 35 grader. Ska jag då dividera temperaturen
jag vill känna av med antalet grader per steg (som
sodjan skrev)?
Jag har i nuläget inget bättre sätt att analysera ADC-värdet än att spara värdet i det interna EEPROM'et och sedan läsa av med Wisp628.
Men hur menade du med att "shifta två steg höger"? Menar du ADC-värdet som det är, eller efter man har gjort beräkningen med spänningsreferensen som strombom och Icecap skrev?
Och här kommer det ett annat problem som jag har upplevd ofta:
temp := (5000 / 1024 * Adc_Read(2));
Detta blir fel!
Gör såhär:
unsigned long Calc; (Vad det nu heter i Pascal, en 32-bitars variabel utan förtecken)
Calc := ADC_Read(2);
Calc := Calc * 5000;
Calc := Calc shr 10; ' Samma som att dela med 1024
Temp := Calc;
Orsak:
När ADC_Read(2) utföres är resultatet ett WORD (16 bit utan förtecken). Om man då multiplicerar direkt kan resultatet bli 5.115.000 vilket ju är "liiiite mer" än vad en 16-bitars variabel kan innehålla, resten blir kastat bort.
Vid att överföra till en 32-bitars variabel FÖRST och sedan räkna kommer all "matten" att vara i 32-bit storlek, när man sedan överför till Temp blir det 16 bit igen men då är det lugnt ju.
Senast redigerad av Icecap 14 juni 2008, 21:24:45, redigerad totalt 1 gång.
Icecap: Tack så mycket! Dessvärre verkar det inte spela någon roll hur jag än gör så funkar det inte Efter din beräkning, innehåller då variabeln temp temperaturen i grader celcius eller är det "steg" om 0,25 C° som sodjan pratade om?
Ta det lungt...
Du har ju precis *börjat* felsöka.
Självklart at det inte fungerar än...
Börja med att ta reda på vilket värde du får från ADCn.
När det inte fungerar så är det ingen bra ide att försöka
göra allt på en gång. Ta ett steg i taget, få det att fungera
(och förstå det), ta sedan nästa. Börja med att verifiera att
du får rimliga värden från ADCn alls...