133 lines
5.7 KiB
C
133 lines
5.7 KiB
C
#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;
|
||
} |