MODEL_ADC_EX/APP/main.c

117 lines
5.4 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 %-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 %-10u\n",
table[i].adc_value,
table[i].temp_c / 10.0f,
table[i].resistance_ohm,
table[i].voltage_mv);
}
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,Voltage_mV\n");
for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) {
fprintf(file, "%u,%.1f,%.2f,%u\n",
table[i].adc_value,
table[i].temp_c / 10.0f,
table[i].resistance_ohm,
table[i].voltage_mv);
}
fclose(file);
printf("Таблица '%s' сохранена в CSV файл: %s\n", table_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");
}
int main() {
// Инициализируем все три таблицы с разными значениями R1
init_all_tables(3000.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);
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
int16_t temp_incar = get_temperature_log_fast_for_table(adc_value, TABLE_INCAR);
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)
int16_t temp_ambient = get_temperature_log_fast_for_table(adc_value, TABLE_AMBIENT);
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");
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;
}