MODEL_ADC_EX/APP/main.c

133 lines
5.7 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 print_table_comparison(void) {
printf("\n=== Сравнение таблиц термисторов ===\n\n");
printf("Тестирование %s:\n", get_ntc_name());
printf("Сопротивление делителя R1: %.1f Ом\n", get_r1_value());
printf("Размер таблицы: %d точек\n\n", get_table_size());
printf("ADC\tСопротивление(Ом)\tLinear\tSteinhart\tFull\tFast\n");
printf("---------------------------------------------------------------\n");
// Тестируем разные значения АЦП
uint16_t test_adc[] = {500, 1000, 1500, 2000, 2500, 3000, 3500, 4000};
for (int i = 0; i < 8; i++) {
uint16_t adc = test_adc[i];
float resistance = get_r1_value() * adc / (4095.0f - adc);
float linear = get_temperature_from_adc(adc, ALG_LINEAR);
float steinhart = get_temperature_from_adc(adc, ALG_STEINHART);
float full = get_temperature_from_adc(adc, ALG_STEINHART_FULL);
float fast = get_temperature_fast(adc) / 10.0f;
printf("%d\t%.1f\t\t%.2f\t%.2f\t%.2f\t%.2f\n",
adc, resistance, linear, steinhart, full, fast);
}
}
void test_temperature_range(void) {
printf("\n=== Тестирование температурного диапазона ===\n\n");
printf("Примечание: Для точного тестирования необходимы\n");
printf("функции доступа к таблице термистора\n\n");
// Просто показываем несколько значений
uint16_t test_adc[] = {500, 1000, 1500, 2000, 2500, 3000, 3500, 4000};
printf("ADC\tРасчетная температура\n");
printf("------------------------\n");
for (int i = 0; i < 8; i++) {
uint16_t adc = test_adc[i];
float temp = get_temperature_from_adc(adc, ALG_STEINHART);
printf("%d\t%.2f°C\n", adc, temp);
}
}
void compare_both_ntc_types(void) {
printf("\n=== Сравнение двух типов термисторов ===\n\n");
printf("ADC\tNTC Type 1\tNTC Type 2\tРазница\n");
printf("----------------------------------------\n");
uint16_t test_adc[] = {500, 1000, 1500, 2000, 2500, 3000, 3500, 4000};
for (int i = 0; i < 8; i++) {
uint16_t adc = test_adc[i];
// Тестируем первый тип
init_ntc(NTC_TYPE_1);
init_fast_lookup_table(ALG_STEINHART);
float temp1 = get_temperature_from_adc(adc, ALG_STEINHART);
// Тестируем второй тип
init_ntc(NTC_TYPE_2);
init_fast_lookup_table(ALG_STEINHART);
float temp2 = get_temperature_from_adc(adc, ALG_STEINHART);
printf("%d\t%.2f°C\t\t%.2f°C\t\t%.2f°C\n",
adc, temp1, temp2, (temp2 - temp1));
}
}
int main() {
printf("=== Программа для работы с NTC термисторами ===\n");
printf("Автор: cfif\n");
printf("Дата: 04.12.2025\n\n");
// Выбираем первый тип термистора для тестирования
printf("Инициализация термистора Type 1...\n");
init_ntc(NTC_TYPE_1);
init_fast_lookup_table(ALG_STEINHART);
// Выводим информацию
printf("Текущий термистор: %s\n", get_ntc_name());
printf("Сопротивление делителя R1: %.1f Ом\n", get_r1_value());
printf("Количество точек в таблице: %d\n\n", get_table_size());
// Тестируем различные значения АЦП
print_table_comparison();
// Тестируем температурный диапазон
test_temperature_range();
// Сравниваем оба типа термисторов
compare_both_ntc_types();
// Пример работы с конкретным значением АЦП
printf("\n=== Пример работы с конкретным значением АЦП ===\n");
uint16_t test_value = 1980;
init_ntc(NTC_TYPE_2);
init_fast_lookup_table(ALG_STEINHART);
float T_ALG_LINEAR = get_temperature_from_adc(test_value, ALG_LINEAR);
float T_ALG_STEINHART = get_temperature_from_adc(test_value, ALG_STEINHART);
float T_ALG_STEINHART_FULL = get_temperature_from_adc(test_value, ALG_STEINHART_FULL);
float T_FAST = get_temperature_fast(test_value) / 10.0f;
printf("Для ADC = %d:\n", test_value);
printf(" Линейная интерполяция: %.2f°C\n", T_ALG_LINEAR);
printf(" Steinhart-Hart: %.2f°C\n", T_ALG_STEINHART);
printf(" Steinhart-Hart полная: %.2f°C\n", T_ALG_STEINHART_FULL);
printf(" Быстрый метод: %.2f°C\n", T_FAST);
// Пример изменения сопротивления делителя
printf("\n=== Пример изменения сопротивления делителя ===\n");
printf("Текущий R1: %.1f Ом\n", get_r1_value());
set_r1(4700.0f); // Изменяем на 4.7 кОм
init_fast_lookup_table(ALG_STEINHART);
float new_temp = get_temperature_from_adc(test_value, ALG_STEINHART);
printf("После изменения R1 на %.1f Ом, температура: %.2f°C\n",
get_r1_value(), new_temp);
set_r1(3300.0f); // Возвращаем обратно
init_fast_lookup_table(ALG_STEINHART);
float original_temp = get_temperature_from_adc(test_value, ALG_STEINHART);
printf("После возврата R1 на %.1f Ом, температура: %.2f°C\n",
get_r1_value(), original_temp);
printf("\n=== Программа завершена ===\n");
return 0;
}