Fråga angående ADC på en PIC12F675

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26742
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg 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.
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg 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!
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det har iallafall löst sig nu.

Hur då ?
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg 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...
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
Icecap
Inlägg: 26742
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Niklas-k
Inlägg: 355
Blev medlem: 10 mars 2004, 15:59:21
Ort: Katrineholm

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26742
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nåväl, då är det ju bara att justera värden enl. detta.
Niklas-k
Inlägg: 355
Blev medlem: 10 mars 2004, 15:59:21
Ort: Katrineholm

Inlägg 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.
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg 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.
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg av unzuf »

@Icecap och @Niklas-k: Skall prova detta, tack tack :)
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
Cryptomaster
Inlägg: 593
Blev medlem: 17 december 2005, 02:23:20
Skype: crypto-master
Ort: Nyköping

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

Inlägg 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 ?
Skriv svar