Sida 2 av 3

Postat: 15 juni 2008, 00:42:56
av bengt-re
man kör väl inte högnivåskit på en liten 12fxxx.... ??

mcp9700 och 12hv615 anväder jag som kombination i en design, men utau spänningsreferens är det bara fånigt att diskutera senorns tolerans. 7805 är rikigt dålig referens......

kasta in en sw-uart så kan du debugga din ad-kod enkelt.

Postat: 15 juni 2008, 08:13:23
av Icecap
unzuf: nä nä... nu får du klappa hästen lite. Du ville veta hur man kunde räkna ut spänningen på ADC-ingången, värdet du får med min uträkning är i mV vilket jag anger.

Vill du ha temperatur i hela grader ska du göra som sodjan säger och med det system är hela grader nog det enda vettiga.

Blanda inte ihop saker.

Postat: 15 juni 2008, 09:31:12
av bengt-re
2,5V spänningsref och vänsterskiftat A/D-res så har du ungefär 10mV per bit och 10mV/K är upplösningen - följdaktligen så räknar du bort 0x32 så har du hela grader direkt. I ärlighetens namn så är det inte någon större mening att höja upplösningen över detta då mcp9700 är inte såååå exakt...

Gör så så har du mycket lättskriven asm-kod... HIttar du en 2,56V spänningsref så ökar din noggranhet lite, men... änven med enpunktskalibrering så har du helt oki noggranhet även med en billigare och mer lättillgänglig 2,50V ref.

Postat: 15 juni 2008, 22:36:59
av unzuf
Jag hade verkligen kört in på fel spår igår. Blev helt snurrig av alla siffror, borde dessutom ha läst era svar mer noggrant. Det har iallafall löst sig nu. Tack för all hjälp!

Postat: 16 juni 2008, 01:12:21
av sodjan
> Det har iallafall löst sig nu.

Hur då ?

Postat: 16 juni 2008, 01:33:33
av unzuf
Jag gjorde som så att istället för att få värdet i grader celsius så läser jag enbart värdet i mV. Eftersom jag inte är ute efter speciellt hög noggrannhet så funkar detta.

Enligt databladet för sensorn så ger den ut 400 mV vid 0 C°. Det värdet subtraherar jag från variabeln som innehåller antalet mV. För att kolla om temperaturen är lika med eller över 35 C° så har jag gjort på följande vis:

Kod: Markera allt

var
   adc_rd   :   word;
   tlong     :   longint;
begin
   adc_rd := ADC_read(2);
   tlong := adc_rd*5000;
   adc_rd := tlong shr 10; // <-- resultat i mV
   adc_rd := adc_rd - 400;

   if adc_rd >= 683 then SetBit(GPIO, 5); // är tempen 35 C° eller mer? ja = tänd LED
end.
683 mV kommer alltså ifrån:

35 C° x 0.0195 V = 0.6825 V = ~683 mV.


Kan tyckas krångligt, men det verkar fungera. Mätte temperaturen med multimetern precis vid ytan på sensorn när jag blåste på den med en hårtork, och LEDen tänds vid (ganska) rätt värde (har ej gjort någon kalibrering).

Edit: Jag är inte säker på om detta är helt rätt, men som sagt, den verkar "trigga" vid rätt temperatur iallafall...

Postat: 16 juni 2008, 10:24:26
av sodjan
OK, bra att du hittade en lösning. Ett par saker bara...

Istället för att dra bort 400 och multiplicera med 5000 vid varje
ADC avläsning, så kan du räkna ut vilket ADC värde som motsvarar
din gräns först (d.v.s en gång) och sedan jämföra ADC värdet
med denna gräns direkt.

Eller åtminstånde lägga till 400 till 683 och jämföra med det, då slipper
du att dra av 400 varje gång.

Slutligen så anses det lite ohyffsat att bara avsluta en tråd med
"det har löst sig", utan att ge en riktig förklaring till hur. Om man har
lagt ner tid på att föreslå lösningar så vill man självklart även veta
hur det löste sig... :-)

Postat: 16 juni 2008, 10:37:21
av Icecap
Jovars, sodjan har rätt: idéen med ett forum är att frågor och svar kan visas öppet, alla lärar något då.

Och uträkningen jag angav kan i nästan alla fall "rensas ut" till passande värden á la vad sodjan anger.

Alltså:
* 0°C ger 400mV vilket bör ge ett AD-värde på 82 (avrundat lite)
* 35°C ger 682,5mV vilket bör ger ett AD-värde på 140 (avrundat lite)

AD-värden: 140 - 82 = 58, alltså 58 för 35°C skillnad.

Detta betyder att du kan räkna:
Temp = (AD - 82) * 35 / 58;
och få temperaturen direkt i grader.

Postat: 16 juni 2008, 11:28:40
av Niklas-k
Nu vart det lite fel Icecap. Sensorn ger ut 400 mV vid 0 grader Celsius och stiger för varje grad 0.0195 Volt vilket då ger 35*0.0195 + 0.4 = 1.0825 Volt. Det ger sedan ett ADC värde på cirka 222.

Postat: 16 juni 2008, 11:56:32
av Icecap
Nåväl, då är det ju bara att justera värden enl. detta.

Postat: 16 juni 2008, 12:25:12
av Niklas-k
Om du vill optimera koden. Pröva

Kod: Markera allt

var
adc_rd   :   word;

begin
    adc_rd := ADC_read(2);
    If adc_rd >= 222 then SetBit(GPIO, 5); // är tempen 35 C° eller mer?
ja = tänd LED
end.

Postat: 16 juni 2008, 12:26:41
av unzuf
@sodjan: Aha, du menar så.. Smart! Tänkte aldrig så långt, tack för tipset. Då slipper man ju en massa onödiga beräkningar om man ändå bara vill ha reda på ett enda fast värde.

Och angående mitt sätt att avsluta tråden så kan jag hålla med om att det var j**ligt ohyfsat, med tanke på att ni hjälpt mig flera ggr. Till mitt försvar har jag bara att säga att tiden var lite knapp. Ska bättra mig betydligt på den fronten.

Postat: 16 juni 2008, 12:28:26
av unzuf
@Icecap och @Niklas-k: Skall prova detta, tack tack :)

Postat: 16 juni 2008, 12:37:10
av sodjan
Ett annat sätt att slippa beräkningar (och få det snabbt) är att använda
en lookup-tabell som "översätter" från ADC-värde till temperatur.
Tabellen kan beräknas i förväg med Excel eller något liknande, med
lite kreativt jobb i Excel så kan man få lämpliga data-definitioner som
kan klippas in i koden direkt. D.v.s om man faktiskt behöver temperaturen
för en LCD display eller liknande.

Re: Fråga angående ADC på en PIC12F675

Postat: 13 april 2009, 00:11:37
av Cryptomaster
Nu drar jag upp en gammal tråd, stötte på "problem" när jag skulle göra samma sak som trådens författade gjorde.

Sitter med en 16F88 och skall visa temperatur på en LCD 44780.

Allting fungerar som jag vill, problemet kommer när jag skall räkna ut temperaturen.
10-bit AD värde kommer till min variabel.
Från variabeln visar jag värdet, decimalt ut på LCD'n: 186
Samma värde, skiftas 2 steg höger enligt sodjans inlägg tidigare i tråden: 46

Det är 24 grader i rummet.

Är det något man måste tänka på, addera/dra av från värdet för att få det korrekt ?