Init
This commit is contained in:
parent
26f1bf2f1e
commit
4bffa087ea
|
|
@ -0,0 +1,40 @@
|
||||||
|
//
|
||||||
|
// Created by cfif on 04.12.2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MDF_ADC_TEMP_KST45_14_2_H
|
||||||
|
#define MDF_ADC_TEMP_KST45_14_2_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// Константы
|
||||||
|
#define ADC_MAX 4095.0f // 12-битный АЦП
|
||||||
|
#define R1 3300.0f // Сопротивление делителя напряжения
|
||||||
|
#define TABLE_START_TEMP (-40)
|
||||||
|
#define TABLE_END_TEMP 85
|
||||||
|
#define TABLE_SIZE 38
|
||||||
|
|
||||||
|
// Параметры Steinhart-Hart для термистора
|
||||||
|
#define koef_A 0.001741624168166423
|
||||||
|
#define koef_B 0.00017003940268680147
|
||||||
|
#define koef_C 0.0000004890545443703666
|
||||||
|
|
||||||
|
#define TABLE_SIZE_LOOKUP 512
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ALG_STEINHART = 0,
|
||||||
|
ALG_STEINHART_FULL = 1,
|
||||||
|
ALG_LINEAR = 2
|
||||||
|
} eAlg;
|
||||||
|
|
||||||
|
// Предварительно вычисленная таблица для быстрого доступа
|
||||||
|
typedef struct {
|
||||||
|
uint16_t adc_value; // Значение АЦП
|
||||||
|
int16_t temp_c; // Температура в °C * 10 (для фиксированной точки)
|
||||||
|
} adc_temp_lookup;
|
||||||
|
|
||||||
|
void init_fast_lookup_table(eAlg use_alg);
|
||||||
|
float get_temperature_from_adc(uint16_t adc_value, eAlg alg);
|
||||||
|
int16_t get_temperature_fast(uint16_t adc_value);
|
||||||
|
|
||||||
|
#endif //MDF_ADC_TEMP_KST45_14_2_H
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
//
|
|
||||||
// Created by cfif on 04.12.2025.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MDF_ADC_TEMP_KST45_14_2_H
|
|
||||||
#define MDF_ADC_TEMP_KST45_14_2_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
ALG_STEINHART = 0,
|
|
||||||
ALG_STEINHART_FULL = 1,
|
|
||||||
ALG_LINEAR = 2
|
|
||||||
} eAlg;
|
|
||||||
|
|
||||||
void init_fast_lookup_table(eAlg use_alg);
|
|
||||||
float get_temperature_from_adc_KST45(uint16_t adc_value, eAlg alg);
|
|
||||||
int16_t get_temperature_fast_KST45(uint16_t adc_value);
|
|
||||||
|
|
||||||
#endif //MDF_ADC_TEMP_KST45_14_2_H
|
|
||||||
24
APP/main.c
24
APP/main.c
|
|
@ -3,21 +3,31 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "ADC_Temp_KST45-14-2.h"
|
#include "ADC_Temp.h"
|
||||||
#include "aterlux.h"
|
#include "aterlux.h"
|
||||||
|
|
||||||
// value 0..4095 - Это диапазон АЦП, Нужно проверить крайние значения и смоделировать таблицы
|
// value 0..4095 - Это диапазон АЦП, Нужно проверить крайние значения и смоделировать таблицы
|
||||||
|
|
||||||
|
|
||||||
|
extern adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP];
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
init_fast_lookup_table(ALG_STEINHART);
|
init_fast_lookup_table(ALG_STEINHART);
|
||||||
//uint16_t value = 4095 / 2; // Должно быть 25 градусов. Это середина диапазона АЦП
|
|
||||||
uint16_t value = 3200;
|
|
||||||
|
|
||||||
float T_ALG_LINEAR = get_temperature_from_adc_KST45(value, ALG_LINEAR);
|
for (int i = 0; i < TABLE_SIZE_LOOKUP; ++i) {
|
||||||
float T_ALG_STEINHART = get_temperature_from_adc_KST45(value, ALG_STEINHART);
|
printf("{%u,%d}, \n", fast_lookup[i].adc_value, fast_lookup[i].temp_c);
|
||||||
float T_ALG_STEINHART_FULL = get_temperature_from_adc_KST45(value, ALG_STEINHART_FULL);
|
}
|
||||||
float T_FAST = get_temperature_fast_KST45(value);
|
|
||||||
|
|
||||||
|
|
||||||
|
//uint16_t value = 4095 / 2; // Должно быть 25 градусов. Это середина диапазона АЦП
|
||||||
|
uint16_t value = 1980;
|
||||||
|
|
||||||
|
float T_ALG_LINEAR = get_temperature_from_adc(value, ALG_LINEAR);
|
||||||
|
float T_ALG_STEINHART = get_temperature_from_adc(value, ALG_STEINHART);
|
||||||
|
float T_ALG_STEINHART_FULL = get_temperature_from_adc(value, ALG_STEINHART_FULL);
|
||||||
|
float T_FAST = get_temperature_fast(value);
|
||||||
float T_ATERLUX = calc_temperature(value);
|
float T_ATERLUX = calc_temperature(value);
|
||||||
|
|
||||||
printf("T_ALG_LINEAR = %f \n", T_ALG_LINEAR);
|
printf("T_ALG_LINEAR = %f \n", T_ALG_LINEAR);
|
||||||
|
|
|
||||||
|
|
@ -2,30 +2,17 @@
|
||||||
// Created by cfif on 02.12.2025.
|
// Created by cfif on 02.12.2025.
|
||||||
//
|
//
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
#include "ADC_Temp_KST45-14-2.h"
|
#include "ADC_Temp.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
// Константы
|
|
||||||
#define ADC_MAX 4095.0f // 12-битный АЦП
|
|
||||||
#define R1 3000.0f // Сопротивление делителя напряжения
|
|
||||||
#define TABLE_START_TEMP (-40)
|
|
||||||
#define TABLE_END_TEMP 85
|
|
||||||
#define TABLE_SIZE 26
|
|
||||||
|
|
||||||
// Параметры Steinhart-Hart для термистора
|
|
||||||
#define koef_A 0.001741624168166423
|
|
||||||
#define koef_B 0.00017003940268680147
|
|
||||||
#define koef_C 0.0000004890545443703666
|
|
||||||
|
|
||||||
#define TABLE_SIZE_LOOKUP 32
|
|
||||||
|
|
||||||
// Структура для хранения табличных данных
|
// Структура для хранения табличных данных
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int temp_c; // Температура (°C)
|
int temp_c; // Температура (°C)
|
||||||
float r_nom; // Номинальное сопротивление (Ω)
|
float r_nom; // Номинальное сопротивление (Ω)
|
||||||
} ntc_table_entry;
|
} ntc_table_entry;
|
||||||
|
|
||||||
// Таблица из документа
|
/*
|
||||||
|
// Таблица из документа KST45
|
||||||
static const ntc_table_entry ntc_table[] = {
|
static const ntc_table_entry ntc_table[] = {
|
||||||
{-40, 100950.0f},
|
{-40, 100950.0f},
|
||||||
{-35, 72777.0f},
|
{-35, 72777.0f},
|
||||||
|
|
@ -54,6 +41,49 @@ static const ntc_table_entry ntc_table[] = {
|
||||||
{80, 377.4f},
|
{80, 377.4f},
|
||||||
{85, 321.7f}
|
{85, 321.7f}
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Таблица из документа Incar
|
||||||
|
ntc_table_entry ntc_table[] = {
|
||||||
|
{-40, 101000.0f},
|
||||||
|
{-35, 72600.0f},
|
||||||
|
{-30, 52720.0f},
|
||||||
|
{-25, 38660.0f},
|
||||||
|
{-20, 28620.0f},
|
||||||
|
{-15, 21390.0f},
|
||||||
|
{-10, 16120.0f},
|
||||||
|
{-5, 12260.0f},
|
||||||
|
{-4, 11620.0f},
|
||||||
|
{-3, 11010.0f},
|
||||||
|
{-2, 10440.0f},
|
||||||
|
{-1, 9907.0f},
|
||||||
|
{0, 9399.0f},
|
||||||
|
{1, 8924.0f},
|
||||||
|
{2, 8473.0f},
|
||||||
|
{3, 8048.0f},
|
||||||
|
{4, 7646.0f},
|
||||||
|
{5, 7267.0f},
|
||||||
|
{6, 6909.0f},
|
||||||
|
{7, 6570.0f},
|
||||||
|
{8, 6250.0f},
|
||||||
|
{9, 5947.0f},
|
||||||
|
{10, 5661.0f},
|
||||||
|
{15, 4441.0f},
|
||||||
|
{20, 3512.0f},
|
||||||
|
{25, 2795.0f},
|
||||||
|
{30, 2239.0f},
|
||||||
|
{35, 1806.0f},
|
||||||
|
{40, 1464.0f},
|
||||||
|
{45, 1195.0f},
|
||||||
|
{50, 980.0f},
|
||||||
|
{55, 809.0f},
|
||||||
|
{60, 670.0f},
|
||||||
|
{65, 559.0f},
|
||||||
|
{70, 468.0f},
|
||||||
|
{75, 394.0f},
|
||||||
|
{80, 333.0f},
|
||||||
|
{85, 283.0f}
|
||||||
|
};
|
||||||
|
|
||||||
// Функция расчёта сопротивления NTC из значения АЦП
|
// Функция расчёта сопротивления NTC из значения АЦП
|
||||||
static float calculate_resistance(uint16_t adc_value) {
|
static float calculate_resistance(uint16_t adc_value) {
|
||||||
|
|
@ -164,7 +194,7 @@ static float interpolate_steinhart_full(float resistance, int index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Основная функция для получения температуры
|
// Основная функция для получения температуры
|
||||||
float get_temperature_from_adc_KST45(uint16_t adc_value, eAlg use_alg) {
|
float get_temperature_from_adc(uint16_t adc_value, eAlg use_alg) {
|
||||||
float resistance = calculate_resistance(adc_value);
|
float resistance = calculate_resistance(adc_value);
|
||||||
|
|
||||||
if (resistance <= 0.0f) {
|
if (resistance <= 0.0f) {
|
||||||
|
|
@ -190,28 +220,19 @@ float get_temperature_from_adc_KST45(uint16_t adc_value, eAlg use_alg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; // Таблица на TABLE_SIZE_LOOKUP значений
|
||||||
|
|
||||||
|
|
||||||
// Предварительно вычисленная таблица для быстрого доступа
|
|
||||||
typedef struct {
|
|
||||||
uint16_t adc_value; // Значение АЦП
|
|
||||||
int16_t temp_c; // Температура в °C * 10 (для фиксированной точки)
|
|
||||||
} adc_temp_lookup;
|
|
||||||
|
|
||||||
static adc_temp_lookup fast_lookup[TABLE_SIZE_LOOKUP]; // Таблица на TABLE_SIZE_LOOKUP значений
|
|
||||||
|
|
||||||
void init_fast_lookup_table(eAlg use_alg) {
|
void init_fast_lookup_table(eAlg use_alg) {
|
||||||
// Создаем таблицу для быстрого преобразования АЦП->температура
|
// Создаем таблицу для быстрого преобразования АЦП->температура
|
||||||
for (uint16_t i = 0; i < TABLE_SIZE_LOOKUP; i++) {
|
for (uint16_t i = 0; i < TABLE_SIZE_LOOKUP; i++) {
|
||||||
uint16_t adc = i * (uint8_t)roundf(ADC_MAX / (TABLE_SIZE_LOOKUP - 1)); // Для 12-битного АЦП (0-4095)
|
uint16_t adc = i * (uint8_t)roundf(ADC_MAX / (TABLE_SIZE_LOOKUP - 1)); // Для 12-битного АЦП (0-4095)
|
||||||
float temp = get_temperature_from_adc_KST45(adc, use_alg);
|
float temp = get_temperature_from_adc(adc, use_alg);
|
||||||
fast_lookup[i].adc_value = adc;
|
fast_lookup[i].adc_value = adc;
|
||||||
fast_lookup[i].temp_c = (int16_t) (temp * 10.0f); // Храним с точностью 0.1°C
|
fast_lookup[i].temp_c = (int16_t) (temp * 10.0f); // Храним с точностью 0.1°C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t get_temperature_fast_KST45(uint16_t adc_value) {
|
int16_t get_temperature_fast(uint16_t adc_value) {
|
||||||
// Простой поиск в таблице с линейной интерполяцией
|
// Простой поиск в таблице с линейной интерполяцией
|
||||||
uint16_t index = adc_value / (uint8_t)roundf(ADC_MAX / (TABLE_SIZE_LOOKUP - 1)); // Делим на 16 для TABLE_SIZE_LOOKUP = 256
|
uint16_t index = adc_value / (uint8_t)roundf(ADC_MAX / (TABLE_SIZE_LOOKUP - 1)); // Делим на 16 для TABLE_SIZE_LOOKUP = 256
|
||||||
if (index >= (TABLE_SIZE_LOOKUP - 1)) return fast_lookup[TABLE_SIZE_LOOKUP - 1].temp_c;
|
if (index >= (TABLE_SIZE_LOOKUP - 1)) return fast_lookup[TABLE_SIZE_LOOKUP - 1].temp_c;
|
||||||
Loading…
Reference in New Issue