MODEL_ADC_EX/APP/main.c

179 lines
8.1 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);
}
// Функция для сохранения обеих таблиц
void save_both_tables(void) {
const fast_lookup_tables_t* tables = get_fast_tables();
// Сохраняем в текстовом формате
save_table_to_file("kst45_table.txt", tables->kst45, "KST45");
save_table_to_file("incar_table.txt", tables->incar, "INCAR");
// Сохраняем в CSV формате (удобно для Excel)
save_table_to_csv("kst45_table.csv", tables->kst45, "KST45");
save_table_to_csv("incar_table.csv", tables->incar, "INCAR");
}
// Функция для сохранения только рабочего диапазона (без зон насыщения)
void save_working_range_to_file(const char* filename, const adc_temp_lookup* table,
const char* table_name, uint16_t min_adc, uint16_t max_adc) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
printf("Ошибка: не удалось создать файл %s\n", filename);
return;
}
fprintf(file, "=== Рабочий диапазон таблицы: %s ===\n", table_name);
fprintf(file, "Диапазон ADC: %u - %u\n", min_adc, max_adc);
fprintf(file, "%-8s %-12s %-15s\n", "ADC", "Temp (°C)", "Resistance (Ω)");
fprintf(file, "----------------------------------------\n");
int count = 0;
for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) {
if (table[i].adc_value >= min_adc && table[i].adc_value <= max_adc) {
fprintf(file, "%-8u %-12.1f %-15.2f\n",
table[i].adc_value,
table[i].temp_c / 10.0f,
table[i].resistance_ohm);
count++;
}
}
fprintf(file, "\nВсего записей в рабочем диапазоне: %d\n", count);
fclose(file);
printf("Рабочий диапазон таблицы '%s' сохранен в файл: %s\n", table_name, filename);
}
int main() {
// Инициализируем обе таблицы одновременно с разными значениями R1
init_both_tables(40000.0f, // R1 для KST45
40000.0f, // R1 для INCAR
ALG_STEINHART);
uint16_t adc_value = 3200;//1980;
printf("\n=== Работа с обеими таблицами одновременно ===\n");
// Получаем температуру для KST45
int16_t temp_kst45 = get_temperature_log_fast_for_table(adc_value, TABLE_KST45);
printf("KST45: ADC=%u, Temp=%.2f °C\n", adc_value, temp_kst45 / 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);
// Можно переключать активную конфигурацию
printf("\n=== Переключение активной конфигурации ===\n");
set_active_config(TABLE_KST45, 3300.0f);
int16_t temp_active1 = get_temperature_log_fast(adc_value);
float temp_kst45_alg = get_temperature_from_adc(adc_value, ALG_STEINHART);
printf("Активная (KST45): Temp=%.2f °C Temp (alg) = %.2f °C\n", temp_active1 / 10.0f, temp_kst45_alg);
set_active_config(TABLE_INCAR, 3300.0f);
int16_t temp_active2 = get_temperature_log_fast(adc_value);
float temp_incar_alg = get_temperature_from_adc(adc_value, ALG_STEINHART);
printf("Активная (INCAR): Temp=%.2f °C Temp (alg) = %.2f °C\n", temp_active2 / 10.0f, temp_incar_alg);
// Получаем доступ к таблицам для отладки
const fast_lookup_tables_t* tables = get_fast_tables();
/*
printf("\n=== Пример данных из таблиц быстрого поиска ===\n");
printf("KST45 таблица (первые 15 записи):\n");
for(int i = 0; i < 15; i++) {
printf(" ADC: %u, Temp: %.1f °C, R: %.2f Ω\n",
tables->kst45[i].adc_value,
tables->kst45[i].temp_c / 10.0f,
tables->kst45[i].resistance_ohm);
}
printf("\nINCAR таблица (первые 15 записи):\n");
for(int i = 0; i < 15; i++) {
printf(" ADC: %u, Temp: %.1f °C, R: %.2f Ω\n",
tables->incar[i].adc_value,
tables->incar[i].temp_c / 10.0f,
tables->incar[i].resistance_ohm);
}
printf("\nKST45 таблица (последние 15 записи):\n");
for(int i = TABLE_SIZE_LOOKUP - 1; i > TABLE_SIZE_LOOKUP - 16; i--) {
printf(" ADC: %u, Temp: %.1f °C, R: %.2f Ω\n",
tables->kst45[i].adc_value,
tables->kst45[i].temp_c / 10.0f,
tables->kst45[i].resistance_ohm);
}
printf("\nINCAR таблица (последние 15 записи):\n");
for(int i = TABLE_SIZE_LOOKUP - 1; i > TABLE_SIZE_LOOKUP - 16; i--) {
printf(" ADC: %u, Temp: %.1f °C, R: %.2f Ω\n",
tables->incar[i].adc_value,
tables->incar[i].temp_c / 10.0f,
tables->incar[i].resistance_ohm);
}
*/
// Сохраняем таблицы в файлы
printf("\n=== Сохранение таблиц в файлы ===\n");
save_both_tables();
// Сохраняем только рабочие диапазоны (без зон насыщения)
// Для KST45 рабочий диапазон примерно от 58 до 3418
save_working_range_to_file("kst45_working_range.txt", tables->kst45, "KST45", 58, 3418);
save_working_range_to_file("incar_working_range.txt", tables->incar, "INCAR", 58, 3418);
// Пример обратного преобразования (температура -> сопротивление)
printf("\n=== Обратное преобразование ===\n");
int16_t temp_test = 250; // 25.0 °C
float resistance_kst45 = get_resistance_log_fast_for_table(temp_test, TABLE_KST45);
float resistance_incar = get_resistance_log_fast_for_table(temp_test, TABLE_INCAR);
printf("При %.1f °C:\n", temp_test / 10.0f);
printf(" KST45 сопротивление: %.2f Ω\n", resistance_kst45);
printf(" INCAR сопротивление: %.2f Ω\n", resistance_incar);
return 0;
}