Термистор и ардуино

dorogoy

✩✩✩✩✩✩✩
7 Июн 2020
28
3
Возник такой вопрос. Существует 2 вида получение температуры с термистора.
1
// термистор
#define B 3950 // B-коэффициент
#define SERIAL_R 4700 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)

float NTC3950(const byte tempPin)
{
int t = analogRead( tempPin );
float tr = 1023.0 / t - 1;
tr = SERIAL_R / tr;
// Serial.print(", t=");

float steinhart;
steinhart = tr / THERMISTOR_R; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= B; // 1/B * ln(R/Ro)
steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15;
// Serial.println(steinhart);
return steinhart;
//delay(1000);
}


2 Делать выборку из таблиц соответствия значения температуры и значения ацп с резестивного делителя .

Насколько я знаю такой подход используется в прошивках 3d принтеров. Так как при вычислительном методе считаются десятые и сотые градусов а точность термистора +-3 градуса в 2х соседних измерениях приходится все это округлять, усреднять 5 -7 выборками. От таких вычислений ардуина тормозить начинает. Насколько больше или меньше флеша занимает скомпилированная программа при использовании таблиц ну скажем на 250 значений. Скорость сопоставления из таблицы скорее всего на порядок должна быть выше. У кого есть опыт, мысли, поделитесь.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,290
946
58
Марий-Эл
На днях делал. Не тормозит.
На частоте 72МГц.
А точность многих термисторов +-1%
Насколько больше или меньше флеша занимает скомпилированная программа при использовании таблиц ну скажем на 250 значений
на 250 байт. Если использовать только целые. До 250 градусов.
Если с дробью, умножаешь на количество байт, которые занимает одно число.
 
Изменено:

dorogoy

✩✩✩✩✩✩✩
7 Июн 2020
28
3
1% от 300 градусов это и есть +-3 градуса вот оно и скачет приходится усреднять.
как оказалось есть 3 вида получения температуры с термистора

1 Через логорифм Скетч использует 4180 байт минусы тормозной при усреднении 5-7 значений тормозит безбожно.

#define B 3950 // B-коэффициент
#define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)

const byte tempPin = A0;

void setup() {
Serial.begin( 9600 );
pinMode( tempPin, INPUT );
}

void loop() {
int t = analogRead( tempPin );
float tr = 1023.0 / t - 1;
tr = SERIAL_R / tr;
Serial.print("R=");
Serial.print(tr);
Serial.print(", t=");

float steinhart;
steinhart = tr / THERMISTOR_R; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= B; // 1/B * ln(R/Ro)
steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15;
Serial.println(steinhart);

delay(100);
}

2 Из 3d принтера берутся промежуточные точки и между ними считаем . Скетч использует 4256 байт . Должно быть быстрее не проверял но занимает больше памяти есть ли смысл ?
void setup(){
pinMode(A0, INPUT);
Serial.begin(9600);
Serial.println("Start");
}
void loop(){
int v = analogRead(A0);
Serial.print(v);
Serial.print("t");
Serial.print(analog2tempBed(v));
Serial.println();
delay(100);
}
const short temptable_11[][2] PROGMEM = {

{1, 841},
{54, 255},
{107, 209},
{160, 184},
{213, 166},
{266, 153},
{319, 142},
{372, 132},
{425, 124},
{478, 116},
{531, 108},
{584, 101},
{637, 93},
{690, 86},
{743, 78},
{796, 70},
{849, 61},
{902, 50},
{955, 34},
{1008, 3}
};
# define BEDTEMPTABLE_LEN (sizeof(temptable_11)/sizeof(*temptable_11))
#define PGM_RD_W(x) (short)pgm_read_word(&x)
static float analog2tempBed(int raw) {
float celsius = 0;
byte i;

for (i = 1; i < BEDTEMPTABLE_LEN; i++)
{
if (PGM_RD_W(temptable_11[0]) > raw)
{
celsius = PGM_RD_W(temptable_11[i - 1][1]) +
(raw - PGM_RD_W(temptable_11[i - 1][0])) *
(float)(PGM_RD_W(temptable_11[1]) - PGM_RD_W(temptable_11[i - 1][1])) /
(float)(PGM_RD_W(temptable_11[0]) - PGM_RD_W(temptable_11[i - 1][0]));
break;
}
}

// Overflow: Set to last value in the table
if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(temptable_11[i - 1][1]);

return celsius;
}

3 Примера не нашел просто берем таблицу на 300 значений и тупо перебираем. Должно быть быстрее всего и скорее всего меньше памяти будет занимать. Но как сгенерировать значения. Вот этот калькулятор https://aterlux.ru/article/ntcresistor не ясно чего ему скармливать в начальных значениях что за Множитель результата АЦП ? Какой термистор выбирать на 100к? что китайца ставят в 3 d принтеры нигде названия их на али нету .

Охото попробовать третий. Думаю его даже в атини 13 испольовать можно будет. Таблица 250-300 байт и один цикл.
 
Изменено:

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,290
946
58
Марий-Эл
По ссылке всё разжёвано.
А термистор нужно покупать такой, что бы у него в названии был полный код. По нему определяется что за термистор и в даташите берутся все необходимые коэффициенты.