Nu har jag kommit en liten bit till på vägen.
Har ju byggt en liten temperatur-reglerande manick som ska sköta reflowkurvan. Eftersom luckan måste öppnas (manuellt i nuläget) när kretskorten ska kylas ner måste den även förses med en larmsignal.
Efter att ha pillat ett tag med årets sämsta kretskort (har lagat massor av avbrott mm... ) så fick jag äntligen både den analoga och den digitala sidan att fungera på AD-omvandlaren AD7705. Fick hem resistorer med 0.1% noggrannhet igår som jag använder i winsteinbrygga. (eller vad heter det?)
Urklipp01.jpg
Jag valde att använda lite matematik för att beräkna resistansen - och temperaturen - genom den uppmätta spänningen i spänningsdelaren. Formeln för en pt100 är R = 100*(1 + At + Bt^2) och spänningen V = Vref * Rt / (Rt + 100). Jag räknade baklänges och skapade en lista på 65 värden (0-63 + en extra) som jag använder för att interpolera från.
ADC:n ger ett värde mellan 0 och 65535 där 65536 motsvarar (Vref+ - Vref-) - totalspänningen över bryggan.
Eftersom jag inte tänker mäta negativ temperatur (R < 100 ohm) så kör jag unipolär ADC med en gain på 4 och intern buffer påslagen.
En snabb beräkning av temperaturen görs med följande algoritm:
Kod: Markera allt
// automatiskt genererad lista för temperaturer, visar
// temperatur*10 per 1024 steg på utgången med gain 4.
uint16_t EEMEM tmp[65] = {0,40,81,123,165,209,253,297,343,389,436,485,534,583,634,
686,739,793,848,904,961,1020,1079,1140,1202,1266,1331,1397,1465,1534,1605,1677,
1751,1827,1905,1984,2065,2149,2234,2322,2412,2504,2599,2696,2796,2899,3004,3112,
3224,3339,3457,3579,3704,3833,3967,4104,4247,4393,4545,4702,4865,5033,5208,5389,5577};
#define OFFSET 100 // offset i grader C. motsvarar 3.5 ohm resistans i ledningarna
uint16_t berakna_temp(uint16_t indata) {
// beräknar temperatur utifrån indata enligt
// aDC = bidirectional @ gain 4
// använder datalista i EEPROM : tmp[0-63]
// returvärde är temperatur i grader C * 10
uint16_t temperatur = 0;
uint8_t i = (indata >> 10); // dela med 1024
indata &= 1023; // maska bort
uint16_t A = eeprom_read_word(&tmp[i]);
uint16_t B = eeprom_read_word(&tmp[i+1]);
uint16_t C = B-A; // intervall
temperatur = A + (C*(uint32_t)indata+512)/1024 - (int)(OFFSET*10);
return temperatur;
}
temperaturen är här ett heltal som motsvarar tiondels grader. det är bara att skriva ut som heltal med en decimalpunkt före sista siffran. Jag mätte upp resistansen i ledningarna till ca 3.5 ohm vilket motsvarar ca 9-10.3 grader fel. Detta justeras av offsetkonstanten. Denna är ju inte helt linjär, så felet blir upp till 1.3 grader C mellan 0 och 250 grader. Det går ju att kompensera det också, men jag brydde mig inte. Resultatet verkar vara mycket exakt i övrigt.
Så nu är det dags att börja göra kurvor att följa...