Läsa av temperatur genom ADC på AVR

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Läsa av temperatur genom ADC på AVR

Inlägg av jadler »

OK, jag gillar både matematik och programmering, men nu skulle jag uppskatta lite hjälp med tips och tankar.

Jag köpte en bunt temperaturberoende motstånd från Seeedstudio, på deras sida finns en tabell som visar förväntad resistans i kΩ vid olika temperaturer. Tabellen är en bild i jpg-format, jag har klippt och klistrat och gjort om den till en fil jag kunde OCR:a och har nu tabellen i OpenOffice.org.

Jag vet hur jag använder ADC på AVR och Arduino, men jag är osäker på hur jag med god precision skall läsa av resistansen med ADC och omvandla mitt 10-bitarsvärde till temperatur. För en tid sedan hittade jag Limor/ladyadas sidor om hur man kan läsa av sensorer, och på sidan om FSR beskriver hon hur man kan gå tillväga för att läsa av just ett varierande motstånd (under rubriken Analog voltage reading method en bit ned på sidan). Hennes koppling ser ut så här:
Bild
Hon skriver att spänningen till ADC kommer att vara Vo = Vcc ( R / (R + FSR) ) och alltså inte korrelera linjärt mot sensorns resistans. Jag har också förstått att pulldown-motståndet avgör inom vilket område man får högst upplösning.

När jag har plottat sensorns resistans enligt tabell mot temperatur får jag denna kurva:
Bild
som inte ser särskilt linjär ut. Jag är osäker på hur jag skall kunna omvandla ADC-värden till temperatur, vilken beräkning jag skall använda (eller om jag skall använda en "look up table"). Den smalare linjen är utifrån den ekvation som står till vänster, programmets försök att hitta en logaritmisk kurva som stämmer överens med givna värden. Om jag använder en logaritmisk (log10) skala för resistans får jag en rakare linje, men fortfarande lätt böjd, och jag vet inte hur jobbigt det är för en AVR att räkna på logaritmer.

Till saken hör, i det aktuella projektet, att jag egentligen är intresserad av ett begränsat mätområde, ungefär -25 °C till +10 °C. Precisionen vid temperaturer över detta område är ointressant. (Jag kommer snart med en projektbeskrivning som förklarar mer.)

Medan jag skrev detta har jag i mitt kalkylark lagt in ladyadas ekvation för spänning till ADC, och omvandlat detta till de värden jag får med en 10-bitars ADC, utifrån ett visst värde på pulldown-motståndet. Jag plottar det temperaturområde som jag är intresserad av och ändrar pulldown-motståndet, och till min förvåning kan jag genom att justera det fasta motståndet få ett nästan linjärt samband mellan ADC-värde och temperatur inom det område som jag är intresserad av!
Bild
ADC-värden på X-axeln, temperatur i °C på Y-axeln, pulldown 33kΩ, Vcc 5V

Det verkar inte bättre än att jag löste mitt eget problem medan jag skrev detta, men jag sparar tråden ändå. Dels har jag inte bekräftat att detta fungerar i praktiken, dels kan andra ha nytta av mina funderingar och resultat, dels undrar jag fortfarande om det inte finns ett bättre sätt än att prova sig fram med kalkylark och grafer.

Är någon intresserad av mina beräkningar följer här mitt stora kalkylark följt av en CSV jag tänkte använda för en ev lookup table.
http://nyfiken.org/filer/10k3950-reordered-10-ocrad.ods
http://nyfiken.org/filer/10k3950-cleaned.csv

Det var för övrigt första gången jag provade på OCR under Linux, och det tog några försök innan jag fick det att fungera bra. Jag delar gärna med mig av erfarenheterna om någon är intresserad. Klart smidigare än att mata in 151 sifferpar manuellt.

Tillägg: Med enkel heltalsmatematik verkar jag teoretiskt kunna få en precision på 1 °C inom det aktuella området. Pseudokod:

Kod: Markera allt

int temperature = adc(therm) * 8 / 100 - 40;
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Läsa av temperatur genom ADC på AVR

Inlägg av sodjan »

> men nu skulle jag uppskatta lite hjälp med tips och tankar.

Använd en temp-sensor istället.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Läsa av temperatur genom ADC på AVR

Inlägg av jadler »

Med risk för att verkar korkad ber jag om ett förtydligande. Menar du något som har en binär utgång, 1-wire/I2C/UART? Nu råkar jag ha dessa hemma, och jag antar att jag även i framtiden kan komma att behöva läsa av resistans och omvandla icke-linjärt till något målvärde. Självklart vore det smidigare med något som ger värdet direkt i form av siffror, det håller jag med om, men det är lite Kajsa Warg just nu. :-)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Läsa av temperatur genom ADC på AVR

Inlägg av sodjan »

En givare som ger ett temperaturvärde ut, antingen
som en "mV/C" eller som ett rent digitalt värde.
Aja, det kan ju fungera med den där också, men det blir
betydligt mer jobb...
Användarvisningsbild
4kTRB
Inlägg: 20670
Blev medlem: 16 augusti 2009, 19:04:48

Re: Läsa av temperatur genom ADC på AVR

Inlägg av 4kTRB »

Du kan ju alltid stycka upp kurvan i mindre bitar och ha en linjär
funktion för varje bit. Säg -25V till -10, -10 till -5 osv.
Kurvan är ju väldigt snäll mellan -25 och +10 så du behöver inte så många.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Läsa av temperatur genom ADC på AVR

Inlägg av jadler »

sodjan: Jag förstår vad du menar och respekterar det till fullo. Om jag började från början skulle jag följa ditt råd, helt klart. Nu sitter jag med en bunt av dessa och ett par KTY81-120 som fungerar på liknande sätt, och jag försöker förstå den generella principen vad gäller att från en µC läsa av en resistans och återskapa ett användbart värde. Jag gissar att jag, och andra, kommer att råka ut för liknande problematik i framtiden. Matematikern inom mig ville försöka hitta en ekvation som ger mig exakt rätt värde utifrån uppmätt resistans, den bekvämare delen av mig är apnöjd med en hyfsad lösning som inte är så krånglig.)

4kTRB: Vilken kurva tittar du på? ;-) Den övre med råa värden känns inte helt snäll, men den undre verkar klart användbar.

Jag testade snabbt, utan att försöka kalibrera, att läsa av med en AVR enligt mitt första inlägg. Rumstemperatur (behöver inte vara korrekt i mitt fall), under tungan (OK, jag är läkare), och i frysen. Det verkar som att jag får vettiga värden, i synnerhet i det svalare området. Nu är lödkolven framme, förhoppningsvis är projektet klart idag.

Hur brukar man göra, ni som är "proffs" på området? En "lookup table"? Flera mindre nästan linjära områden? Avancerade logaritmer i en stackars µC? Vad är "rätt"? (Sodjan, jag menar just detta med icke-linjära sensorer i detta fall, nästa gång jag köper temperatursensorer blir det något som ger värdet rakt av, kosta vad det kosta vill. 8) )
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: Läsa av temperatur genom ADC på AVR

Inlägg av thepirateboy »

Det beror ju helt på kraven du har på noggrannhet, vad det får kosta och tillgängligt minne och CPU-kraft.

Jag har använt både look-up tables, stycka upp grafen i linjära områden samt använt float i uC:n i olika projekt. Olika sätt var rätt i just den specifika applikationen.

Börja med att speca upp noggrannheten och temperaturområdet.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Läsa av temperatur genom ADC på AVR

Inlägg av sodjan »

Som sagt, det finns flera olika lösningar.
En snabb och rellativt enkel är en lookup med några punkter
på skalan och sedan en konstant som utgör en faktor för linjär
interpoleringen mellan punkterna. D.v.s att kurvan betraktas
som sammansatt av flera linjära delar. Eller helt enkelt en lookup
med 1024 positioner så har du täckt in hela mätområdet för ADCn och
du kan ha vilken "kurvform" du vill. Det var väl någon annan som sa det också.
Att försöka få till en ekvation som körs lokalt i processorn är sannolikt over-kill,
det görs lämpligen i förväg och tabellen läggs bara in i koden. I många fall kan
man enkelt generera tabellen i Excel. Man måste naturligstvis ha några rellevanta
mätpunkter att utgå från.
Användarvisningsbild
4kTRB
Inlägg: 20670
Blev medlem: 16 augusti 2009, 19:04:48

Re: Läsa av temperatur genom ADC på AVR

Inlägg av 4kTRB »

Om du bygger en andra koppling som i bilden men byter plats
på de 2 motstånden och placerar det hela i bryggkoppling så
borde du få en ganska linjär differentiell signal ut.
Du hade vad jag förstått fler än en tempresistor.
Tänker jag helt galet nu?
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Re: Läsa av temperatur genom ADC på AVR

Inlägg av björn »

Det finns rätt mycket beskrivet om linjärisering av KTY81, kolla tex på denna. Det finns fler dokument som beskriver det men jag hittade inte det med en snabb googling så jag överlåter det till dig själv.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Läsa av temperatur genom ADC på AVR

Inlägg av jadler »

Lösningen jag använde tuffar och går och ger mig egentligen tillräcklig precision för ändamålet, men jag tänkte ändå skriva om en sak jag hittade igår.

När jag egentligen letade efter annat (om att kommunicera med serieport under Linux, gärna med Perl) snubblade jag över en artikel från Linux Journal, Remote Temperature Monitoring with Linux, som bland annat handlar om att läsa av en multimeter med serieutgång, men där målet är att läsa av temperatur med hjälp av en termistor. Artikeln tar upp Steinhart-Hart ekvationen som sägs kunna ge mycket bra approximation av just termistorers korrelation mellan resistans och temperatur. Jag läste mer på Wikipedia, artikeln om termistorer, och hittade även ett trevligt projekt på SourceForge som hjälper till att räkna ut Steinhart-Hart koefficienterna utifrån en tabell över temperaturer och motsvarande resistans.

Projektets utmärkta dokumentation och projekthemsida saknar länk till den del av SF som innehåller nedladdningslänkarna.

Med programmet från SF kunde jag ta fram koefficienterna för just min termistor, och jag tog fram ekvationer för att räkna ut aktuell resistans utifrån ADC-värdet:
Bild

Med ett kalkylblad kontrollerade jag resultatet och fick fram en noggrannhet på 0,068343 grader för området -23 - 35 grader C, 0,484765 (-25 – 95 gr C). Mitt valda pd-motstånd gör att noggrannheten minskar drastiskt vid högre temperaturer.

Jag är fullt medveten om att dessa avancerade beräkningar knappast är något man vill låta en µC utföra, men om inte annat kan man med denna teknik ta fram en mer detaljerad lookup-tabell för det område man är intresserad av, och man kan anpassa den till faktiska ADC-värden. Kanske någon kan ha nytta av detta, eller åtminstone lite nöje.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Läsa av temperatur genom ADC på AVR

Inlägg av Icecap »

Bara lite nyfiken men har tu testat att använda en konstantströmsgenerator istället för ett motstånd?
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Läsa av temperatur genom ADC på AVR

Inlägg av jadler »

Nej, det har jag inte. Vad blir skillnaden? Någon särskild konstantströmsgenerator?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Läsa av temperatur genom ADC på AVR

Inlägg av Icecap »

En konstantströmsgenerator är en konstantströmsgenerator! Jag funderade mest på om du hade kollat hur linjariteten skulle se ut med en sådan istället för ett motstånd, inte sällan kan det lösa många problem.

Sedan kan man kolla vilket område den ska fungera i och då hitta rätt lösning.
Skriv svar