Init
This commit is contained in:
parent
c8864328fe
commit
cbd0e62ca2
|
|
@ -24,6 +24,7 @@ typedef enum {
|
|||
|
||||
// Константы
|
||||
#define ADC_MAX 4095.0f // 12-битный АЦП
|
||||
#define VREF_MV 5000.0f // Опорное напряжение в милливольтах (5.0V)
|
||||
|
||||
// Параметры Steinhart-Hart для термистора (общие для всех таблиц)
|
||||
#define koef_A 0.001741624168166423
|
||||
|
|
@ -41,6 +42,7 @@ typedef struct {
|
|||
uint16_t adc_value; // Значение АЦП
|
||||
int16_t temp_c; // Температура в °C * 10 (для фиксированной точки)
|
||||
float resistance_ohm; // Сопротивление в Ом, соответствующее значению АЦП
|
||||
uint16_t voltage_mv; // Напряжение в милливольтах (ADC * VREF / ADC_MAX)
|
||||
eNtcTable table_type; // Тип таблицы, для которой вычислены данные
|
||||
} adc_temp_lookup;
|
||||
|
||||
|
|
@ -79,6 +81,11 @@ void set_active_config(eNtcTable table_type, float r1);
|
|||
const ntc_config_t* get_active_config(void);
|
||||
const fast_lookup_tables_t* get_fast_tables(void);
|
||||
|
||||
// Вспомогательная функция для преобразования ADC в напряжение
|
||||
static inline uint16_t adc_to_voltage_mv(uint16_t adc_value) {
|
||||
return (uint16_t)(((uint32_t)adc_value * VREF_MV) / (uint32_t)ADC_MAX);
|
||||
}
|
||||
|
||||
// Основные функции получения температуры
|
||||
float get_temperature_from_adc(uint16_t adc_value, eAlg alg);
|
||||
float get_temperature_from_adc_with_table(uint16_t adc_value, eAlg alg, eNtcTable table_type, float r1);
|
||||
|
|
@ -93,4 +100,8 @@ float get_resistance_log_fast(int16_t temperature_c10);
|
|||
float get_resistance_log_fast_for_table(int16_t temperature_c10, eNtcTable table_type);
|
||||
float get_resistance_fast_simple(int16_t temperature_c10);
|
||||
|
||||
// Новые функции для получения напряжения
|
||||
uint16_t get_voltage_from_adc(uint16_t adc_value);
|
||||
uint16_t get_voltage_fast_for_table(uint16_t adc_value, eNtcTable table_type);
|
||||
|
||||
#endif //MDF_ADC_TEMP_KST45_14_2_H
|
||||
120
APP/main.c
120
APP/main.c
|
|
@ -11,14 +11,15 @@ void save_table_to_file(const char* filename, const adc_temp_lookup* table, cons
|
|||
|
||||
fprintf(file, "=== Таблица быстрого поиска: %s ===\n", table_name);
|
||||
fprintf(file, "Всего записей: %d\n", TABLE_SIZE_LOOKUP);
|
||||
fprintf(file, "%-8s %-12s %-15s\n", "ADC", "Temp (°C)", "Resistance (Ω)");
|
||||
fprintf(file, "----------------------------------------\n");
|
||||
fprintf(file, "%-8s %-12s %-15s %-10s\n", "ADC", "Temp (°C)", "Resistance (Ω)", "Voltage (mV)");
|
||||
fprintf(file, "--------------------------------------------------------\n");
|
||||
|
||||
for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) {
|
||||
fprintf(file, "%-8u %-12.1f %-15.2f\n",
|
||||
fprintf(file, "%-8u %-12.1f %-15.2f %-10u\n",
|
||||
table[i].adc_value,
|
||||
table[i].temp_c / 10.0f,
|
||||
table[i].resistance_ohm);
|
||||
table[i].resistance_ohm,
|
||||
table[i].voltage_mv);
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
|
|
@ -34,90 +35,20 @@ void save_table_to_csv(const char* filename, const adc_temp_lookup* table, const
|
|||
}
|
||||
|
||||
fprintf(file, "# Таблица быстрого поиска: %s\n", table_name);
|
||||
fprintf(file, "ADC,Temperature_C,Resistance_Ohm\n");
|
||||
fprintf(file, "ADC,Temperature_C,Resistance_Ohm,Voltage_mV\n");
|
||||
|
||||
for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) {
|
||||
fprintf(file, "%u,%.1f,%.2f\n",
|
||||
fprintf(file, "%u,%.1f,%.2f,%u\n",
|
||||
table[i].adc_value,
|
||||
table[i].temp_c / 10.0f,
|
||||
table[i].resistance_ohm);
|
||||
table[i].resistance_ohm,
|
||||
table[i].voltage_mv);
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
printf("Таблица '%s' сохранена в CSV файл: %s\n", table_name, filename);
|
||||
}
|
||||
|
||||
// Функция для сохранения таблицы в виде C-массива
|
||||
void save_table_to_c_array(const char* filename, const adc_temp_lookup* table, const char* table_name) {
|
||||
FILE* file = fopen(filename, "w");
|
||||
if (file == NULL) {
|
||||
printf("Ошибка: не удалось создать файл %s\n", filename);
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(file, "// Таблица быстрого поиска: %s\n", table_name);
|
||||
fprintf(file, "// Всего записей: %d\n", TABLE_SIZE_LOOKUP);
|
||||
fprintf(file, "// Формат: {ADC, Temp_TenthsC, Resistance_Ohm}\n\n");
|
||||
fprintf(file, "const adc_temp_lookup %s_lookup_table[%d] = {\n",
|
||||
table_name, TABLE_SIZE_LOOKUP);
|
||||
|
||||
for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) {
|
||||
if (i == TABLE_SIZE_LOOKUP - 1) {
|
||||
fprintf(file, " {%u, %d, %.2f}\n",
|
||||
table[i].adc_value,
|
||||
table[i].temp_c,
|
||||
table[i].resistance_ohm);
|
||||
} else {
|
||||
fprintf(file, " {%u, %d, %.2f},\n",
|
||||
table[i].adc_value,
|
||||
table[i].temp_c,
|
||||
table[i].resistance_ohm);
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(file, "};\n");
|
||||
fclose(file);
|
||||
printf("Таблица '%s' сохранена в C-массив: %s\n", table_name, filename);
|
||||
}
|
||||
|
||||
// Функция для сохранения таблицы в виде компактного C-массива (как в примере)
|
||||
void save_table_to_c_array_compact(const char* filename, const adc_temp_lookup* table, const char* array_name) {
|
||||
FILE* file = fopen(filename, "w");
|
||||
if (file == NULL) {
|
||||
printf("Ошибка: не удалось создать файл %s\n", filename);
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(file, "// Таблица быстрого поиска\n");
|
||||
fprintf(file, "const adc_temp_lookup %s[] = {\n", array_name);
|
||||
|
||||
for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) {
|
||||
if (i % 4 == 0 && i > 0) {
|
||||
fprintf(file, "\n");
|
||||
}
|
||||
|
||||
if (i == TABLE_SIZE_LOOKUP - 1) {
|
||||
fprintf(file, " {%u, %d, %.2f}",
|
||||
table[i].adc_value,
|
||||
table[i].temp_c,
|
||||
table[i].resistance_ohm);
|
||||
} else {
|
||||
fprintf(file, " {%u, %d, %.2f},",
|
||||
table[i].adc_value,
|
||||
table[i].temp_c,
|
||||
table[i].resistance_ohm);
|
||||
}
|
||||
|
||||
if ((i + 1) % 4 != 0 && i != TABLE_SIZE_LOOKUP - 1) {
|
||||
fprintf(file, " ");
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(file, "\n};\n");
|
||||
fclose(file);
|
||||
printf("Таблица '%s' сохранена в компактный C-массив: %s\n", array_name, filename);
|
||||
}
|
||||
|
||||
// Функция для сохранения всех таблиц
|
||||
void save_all_tables(void) {
|
||||
const fast_lookup_tables_t* tables = get_fast_tables();
|
||||
|
|
@ -131,21 +62,11 @@ void save_all_tables(void) {
|
|||
save_table_to_csv("duct_table.csv", tables->duct, "DUCT");
|
||||
save_table_to_csv("incar_table.csv", tables->incar, "INCAR");
|
||||
save_table_to_csv("ambient_table.csv", tables->ambient, "AMBIENT");
|
||||
|
||||
// Сохраняем в виде C-массивов
|
||||
save_table_to_c_array("duct_table_array.c", tables->duct, "DUCT");
|
||||
save_table_to_c_array("incar_table_array.c", tables->incar, "INCAR");
|
||||
save_table_to_c_array("ambient_table_array.c", tables->ambient, "AMBIENT");
|
||||
|
||||
// Сохраняем в виде компактных C-массивов
|
||||
save_table_to_c_array_compact("duct_table_compact.c", tables->duct, "duct_lookup");
|
||||
save_table_to_c_array_compact("incar_table_compact.c", tables->incar, "incar_lookup");
|
||||
save_table_to_c_array_compact("ambient_table_compact.c", tables->ambient, "ambient_lookup");
|
||||
}
|
||||
|
||||
int main() {
|
||||
// Инициализируем все три таблицы с разными значениями R1
|
||||
init_all_tables(20000.0f, // R1 для DUCT (KST45)
|
||||
init_all_tables(3000.0f, // R1 для DUCT (KST45)
|
||||
20000.0f, // R1 для INCAR
|
||||
20000.0f, // R1 для AMBIENT (NTC 10k)
|
||||
ALG_STEINHART);
|
||||
|
|
@ -154,18 +75,27 @@ int main() {
|
|||
|
||||
printf("\n=== Работа с тремя датчиками одновременно ===\n");
|
||||
|
||||
// Получаем температуру для DUCT (KST45)
|
||||
// Получаем температуру и напряжение для DUCT (KST45)
|
||||
int16_t temp_duct = get_temperature_log_fast_for_table(adc_value, TABLE_DUCT);
|
||||
printf("DUCT (KST45): ADC=%u, Temp=%.2f °C\n", adc_value, temp_duct / 10.0f);
|
||||
uint16_t volt_duct = get_voltage_fast_for_table(adc_value, TABLE_DUCT);
|
||||
printf("DUCT (KST45): ADC=%u, Temp=%.2f °C, Voltage=%u mV\n",
|
||||
adc_value, temp_duct / 10.0f, volt_duct);
|
||||
|
||||
// Получаем температуру для INCAR
|
||||
// Получаем температуру и напряжение для INCAR
|
||||
int16_t temp_incar = get_temperature_log_fast_for_table(adc_value, TABLE_INCAR);
|
||||
printf("INCAR: ADC=%u, Temp=%.2f °C\n", adc_value, temp_incar / 10.0f);
|
||||
uint16_t volt_incar = get_voltage_fast_for_table(adc_value, TABLE_INCAR);
|
||||
printf("INCAR: ADC=%u, Temp=%.2f °C, Voltage=%u mV\n",
|
||||
adc_value, temp_incar / 10.0f, volt_incar);
|
||||
|
||||
// Получаем температуру для AMBIENT (NTC 10k)
|
||||
// Получаем температуру и напряжение для AMBIENT (NTC 10k)
|
||||
int16_t temp_ambient = get_temperature_log_fast_for_table(adc_value, TABLE_AMBIENT);
|
||||
printf("AMBIENT (NTC 10k): ADC=%u, Temp=%.2f °C\n", adc_value, temp_ambient / 10.0f);
|
||||
uint16_t volt_ambient = get_voltage_fast_for_table(adc_value, TABLE_AMBIENT);
|
||||
printf("AMBIENT (NTC 10k): ADC=%u, Temp=%.2f °C, Voltage=%u mV\n",
|
||||
adc_value, temp_ambient / 10.0f, volt_ambient);
|
||||
|
||||
// Пример прямого вычисления напряжения
|
||||
uint16_t direct_voltage = get_voltage_from_adc(adc_value);
|
||||
printf("\nПрямое вычисление напряжения: ADC=%u -> %u mV\n", adc_value, direct_voltage);
|
||||
|
||||
// Сохраняем таблицы в файлы
|
||||
printf("\n=== Сохранение таблиц в файлы ===\n");
|
||||
|
|
|
|||
|
|
@ -356,6 +356,49 @@ float get_resistance_from_adc(uint16_t adc_value) {
|
|||
return calculate_resistance(adc_value, active_config.r1);
|
||||
}
|
||||
|
||||
// Функция для получения напряжения из АЦП
|
||||
uint16_t get_voltage_from_adc(uint16_t adc_value) {
|
||||
return adc_to_voltage_mv(adc_value);
|
||||
}
|
||||
|
||||
// Функция для получения напряжения из таблицы быстрого доступа
|
||||
uint16_t get_voltage_fast_for_table(uint16_t adc_value, eNtcTable table_type) {
|
||||
if (!is_table_initialized(table_type)) {
|
||||
// Если таблица не инициализирована, вычисляем напрямую
|
||||
return adc_to_voltage_mv(adc_value);
|
||||
}
|
||||
|
||||
adc_temp_lookup* fast_table = get_fast_table_by_type(table_type);
|
||||
|
||||
// Поиск ближайшего значения в таблице
|
||||
for (uint16_t i = 0; i < TABLE_SIZE_LOOKUP; i++) {
|
||||
if (fast_table[i].adc_value == adc_value) {
|
||||
return fast_table[i].voltage_mv;
|
||||
}
|
||||
|
||||
if (i < TABLE_SIZE_LOOKUP - 1 &&
|
||||
adc_value > fast_table[i].adc_value &&
|
||||
adc_value < fast_table[i + 1].adc_value) {
|
||||
// Линейная интерполяция напряжения
|
||||
uint16_t adc1 = fast_table[i].adc_value;
|
||||
uint16_t adc2 = fast_table[i + 1].adc_value;
|
||||
uint16_t v1 = fast_table[i].voltage_mv;
|
||||
uint16_t v2 = fast_table[i + 1].voltage_mv;
|
||||
|
||||
if (adc2 == adc1) return v1;
|
||||
|
||||
return v1 + (uint16_t)(((uint32_t)(v2 - v1) * (adc_value - adc1)) / (adc2 - adc1));
|
||||
}
|
||||
}
|
||||
|
||||
// Если не нашли, возвращаем ближайшее значение
|
||||
if (adc_value <= fast_table[0].adc_value) {
|
||||
return fast_table[0].voltage_mv;
|
||||
} else {
|
||||
return fast_table[TABLE_SIZE_LOOKUP - 1].voltage_mv;
|
||||
}
|
||||
}
|
||||
|
||||
// Инициализация таблицы быстрого поиска для конкретной таблицы
|
||||
void init_fast_lookup_table(eNtcTable table_type, float r1, eAlg use_alg) {
|
||||
uint16_t table_size;
|
||||
|
|
@ -458,6 +501,7 @@ void init_fast_lookup_table(eNtcTable table_type, float r1, eAlg use_alg) {
|
|||
fast_table[i].adc_value = adc;
|
||||
fast_table[i].temp_c = (int16_t)(temp * 10.0f);
|
||||
fast_table[i].resistance_ohm = resistance;
|
||||
fast_table[i].voltage_mv = adc_to_voltage_mv(adc); // Добавляем напряжение
|
||||
fast_table[i].table_type = table_type;
|
||||
|
||||
prev_adc = adc;
|
||||
|
|
|
|||
Loading…
Reference in New Issue