Спрошу в продолжении темы. Вообщем реализовал я вышеописанный алгоритм измерения. Вот только недавно у меня в руках оказалась реальная термопара и вот я пытаюсь добиться адекватных показаний от нее. Пока ничего толкового не выходит. Наблюдения следующие:
- Термоэдс измеряется точно, я подавал эталонное напряжение и оно совпадало с тем, что выдавал мой микроконтроллер (проверил несколькими приборами)
- Температура холодного спая тоже определяется точно (проверял датчиком PT100)
- Термопара тип K
куплена вот тут - Сама термопара и плата находятся в одном помещении при одной и той же температуре, но показания получаются следующие:
---- Температура в помещении и соотвественно холодного спая 28.5 С
---- Измеренное термоэдс
-0.182997 мВ ---- Вычисленное значение температуры термопары
23.89Код вычисления температуры и термоэдс (
ВОТ ТУТ С ПОДСВЕТКОЙ СИНТАКСИСА):
CODE
/**
* @brief Градуировочные значения для термопары типа K от -270 до 1370 с шагом 10.
* Всего 153 точки
*/
static const float calibrationTable[] =
{
-6.458, -6.441, -6.404, -6.344, -6.262, -6.158, -6.035, -5.891, -5.73, -5.55, -5.354,
-5.141, -4.913, -4.669, -4.411, -4.138, -3.852, -3.554, -3.243, -2.92, -2.587, -2.243,
-1.889, -1.527, -1.156, -0.778, -0.392, 0.0, 0.397, 0.798, 1.203, 1.612, 2.023, 2.436,
2.851, 3.267, 3.682, 4.096, 4.509, 4.92, 5.328, 5.735, 6.138, 6.54, 6.941, 7.34, 7.739,
8.138, 8.539, 8.94, 9.343, 9.747, 10.153, 10.561, 10.971, 11.382, 11.795, 12.209, 12.624,
13.04, 13.457, 13.874, 14.293, 14.713, 15.133, 15.554, 15.975, 16.397, 16.82, 17.243,
17.667, 18.091, 18.516, 18.941, 19.366, 19.792, 20.218, 20.644, 21.071, 21.497, 21.924,
22.35, 22.776, 23.203, 23.629, 24.055, 24.48, 24.905, 25.33, 25.755, 26.179, 26.602,
27.025, 27.447, 27.869, 28.289, 28.71, 29.129, 29.548, 29.965, 30.382, 30.798, 31.213,
31.628, 32.041, 32.453, 32.865, 33.275, 33.685, 34.093, 34.501, 34.908, 35.313, 35.718,
36.121, 36.524, 36.925, 37.326, 37.725, 38.124, 38.522, 38.918, 39.314, 39.708, 40.101,
40.494, 40.885, 41.276, 41.665, 42.053, 42.44, 42.826, 43.211, 43.595, 43.978, 44.359,
44.74, 45.119, 45.497, 45.873, 46.249, 46.623, 46.995, 47.367, 47.737, 48.105, 48.473,
48.838, 49.202, 49.565, 49.926, 50.286, 50.644, 51.0, 51.355, 51.708, 52.06, 52.41,
52.759, 53.106, 53.451, 53.795, 54.138, 54.479, 54.819
};
float TermocoupleKProcessor::calcTemperature (float eds)
{
int t = MIN_T, i, dt = DT;
if (eds > calibrationTable[i = 0])
while (MAX_T >= t)
{
if (eds < calibrationTable[++i])
return t + (eds - calibrationTable[i-1]) * dt
/ (calibrationTable[i] - calibrationTable[i-1]);
t += dt;
};
return t;
}
float TermocoupleKProcessor::calcEds (float t)
{
float eds = calibrationTable[CALIBRATION_TABLE_LEN - 1];
float dEds, t0 = MIN_T;
int i = 0;
if ( t > t0 )
{
while ( calibrationTable[CALIBRATION_TABLE_LEN-1] >= eds )
{
i++;
if ( t < (t0 + DT) )
{
dEds = calibrationTable[i] - calibrationTable[i-1];
eds = calibrationTable[i-1] + ((t - t0) * dEds / DT);
return eds;
}
t0 += DT;
}
eds = calibrationTable[CALIBRATION_TABLE_LEN-1];
}
return eds;
}
Место, где это используется (
C подсветкой синтаксиса):
CODE
/* Измеряю температуру холодного спая */
...
//Измерения температуры холодного спая обычным термодатчиком опускаю
...
data->coldJuncT = calcColdJuncTemperature(rtd);
/* Вычисляю ЭДС холодного спая в МИЛЛИВОЛЬТАХ! */
data->cjEds = calcEds (data->coldJuncT);
/* Измеряю ЭДС термопары */
...
//Опускаю измерения термоэдс
...
data->tEds = data->tEds * 1000; //перевожу в милливольты!
/* Вычисляю значение температры */
data->temperature = calcTemperature(data->tEds + data->cjEds);
conversationIsReady = 1; /**< @brief Считывание завершено */
Почему может быть такая большая погрешность? Что я упустил, подскажите пожалуйста?