MODEL_ADC_EX/APP/main.c

187 lines
7.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include "ADC_Temp.h"
// Функция для сохранения таблицы в файл
void save_table_to_file(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, "%-8s %-12s %-15s\n", "ADC", "Temp (°C)", "Resistance (Ω)");
fprintf(file, "----------------------------------------\n");
for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) {
fprintf(file, "%-8u %-12.1f %-15.2f\n",
table[i].adc_value,
table[i].temp_c / 10.0f,
table[i].resistance_ohm);
}
fclose(file);
printf("Таблица '%s' сохранена в файл: %s\n", table_name, filename);
}
// Функция для сохранения таблицы в CSV формате
void save_table_to_csv(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, "ADC,Temperature_C,Resistance_Ohm\n");
for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) {
fprintf(file, "%u,%.1f,%.2f\n",
table[i].adc_value,
table[i].temp_c / 10.0f,
table[i].resistance_ohm);
}
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();
// Сохраняем в текстовом формате
save_table_to_file("duct_table.txt", tables->duct, "DUCT");
save_table_to_file("incar_table.txt", tables->incar, "INCAR");
save_table_to_file("ambient_table.txt", tables->ambient, "AMBIENT");
// Сохраняем в CSV формате (удобно для Excel)
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)
20000.0f, // R1 для INCAR
20000.0f, // R1 для AMBIENT (NTC 10k)
ALG_STEINHART);
uint16_t adc_value = 2000;
printf("\n=== Работа с тремя датчиками одновременно ===\n");
// Получаем температуру для 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);
// Получаем температуру для 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);
// Получаем температуру для 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);
// Сохраняем таблицы в файлы
printf("\n=== Сохранение таблиц в файлы ===\n");
save_all_tables();
// Пример обратного преобразования (температура -> сопротивление)
printf("\n=== Обратное преобразование ===\n");
int16_t temp_test = 250; // 25.0 °C
float resistance_duct = get_resistance_log_fast_for_table(temp_test, TABLE_DUCT);
float resistance_incar = get_resistance_log_fast_for_table(temp_test, TABLE_INCAR);
float resistance_ambient = get_resistance_log_fast_for_table(temp_test, TABLE_AMBIENT);
printf("При %.1f °C:\n", temp_test / 10.0f);
printf(" DUCT сопротивление: %.2f Ω\n", resistance_duct);
printf(" INCAR сопротивление: %.2f Ω\n", resistance_incar);
printf(" AMBIENT сопротивление: %.2f Ω\n", resistance_ambient);
return 0;
}