febb: (Default)
[personal profile] febb
Мне нравятся микроконтроллеры Microchips.
Правда она уже слилась несколько лет с 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()



Profile

febb: (Default)
febb

March 2022

S M T W T F S
  1 2 345
6 7 89 101112
13141516171819
20212223242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 10th, 2026 05:56 am
Powered by Dreamwidth Studios