Läsa av temperatur genom ADC på AVR
Postat: 18 oktober 2009, 15:49:41
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:

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:

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!

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:
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:

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:

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!

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;