Мне нравятся микроконтроллеры Microchips.
Правда она уже слилась несколько лет с ATMEL, но все равно, я не буду никогда
ардуинщиком. В качестве протеста против идиотского маркетинга в любительском секторе.
Но сегодня речь о простой вещи - программирование измерения температуры
простейшими MF52 термисторами в простеших микроконтроллерах.
Идея измерений в основном цикле программе, который вертится постоянно.
Скажем в 8-битных АЦП. 2-байтный сумматор накапливает 256 измерений
и старшее слово - усредненное резултат по больнице преобразовывается в температуру.
Таблица генерируется с помощью экселя по известным формулам для термисторов с экспонентами.
Правда она уже слилась несколько лет с ATMEL, но все равно, я не буду никогда
ардуинщиком. В качестве протеста против идиотского маркетинга в любительском секторе.
Но сегодня речь о простой вещи - программирование измерения температуры
простейшими MF52 термисторами в простеших микроконтроллерах.
Идея измерений в основном цикле программе, который вертится постоянно.
Скажем в 8-битных АЦП. 2-байтный сумматор накапливает 256 измерений
и старшее слово - усредненное резултат по больнице преобразовывается в температуру.
Таблица генерируется с помощью экселя по известным формулам для термисторов с экспонентами.
// ------------------- Thermistor -----------------------------------------
// NTC MF52 100K B3950
// R+ = 149.6
// T=25C, Rt=100K
// Expected ADC values temp table:
const byte TT[] =
{
177, // T=0
162, // T=5
147, // T=10
132, // T=15
117, // T=20
103, // T=25
89, // T=30
78, // T=35
67, // T=40
58, // T=45
50, // T=50
43, // T=55
36, // T=60
31, // T=65
27 // T=70
};
byte Temp;
uint SumADC;
byte nSum;
void ReadTemp()
{
byte t = 4u;
while(--t)
{
ADC_SET(ADC_TEMP)
ADC_WAIT
}
SumADC += ADRES;
ADC_SET(ADC_OFF)
if(++nSum != 0)
return;
byte adc = SumADC >> 8;
SumADC = 0;
const byte n = sizeof(TT)/sizeof(TT[0]);
for(t=0; t < n; ++t)
if(adc > TT[t])
break;
if(t >= n || t == 0)
{
Temp = 255u; // Error
return;
}
byte t1 = t - 1u;
// Linear interpolation:
Temp = TT[t1] - adc;
Temp *= 5u;
Temp /= TT[t1] - TT[t];
Temp += t1 * 5u;
// Temp = 9u; // Test
}//void read_temp()