Попался мне в руки термостат STC-3008 там стоит N76E003AT20 который не особо то и распространен. на панели стоят 4 кнопки которые сидят на земле и прямиком идут в мк без подтяжки к питанию. посмотрев даташит я не нашел режим входа с pull up как у STM32, как тогда считывается состояние кнопки?
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
пытаюсь подключить NTC термистор к МК. т.к он не линейный воспользовался сайтомhttps://aterlux.ru/article/ntcresistor для расчета градуированной таблицы. получил кодСпойлер
#define TEMPERATURE_UNDER 1250// Значение температуры, возвращаемое если сумма результатов АЦП больше первого значения таблицы
#define TEMPERATURE_OVER 0// Значение температуры, возвращаемое если сумма результатов АЦП меньше последнего значения таблицы
#define TEMPERATURE_TABLE_START 1250// Значение температуры соответствующее первому значению таблицы
#define TEMPERATURE_TABLE_STEP -50// Шаг таблицы
typedef uint16_t temperature_table_entry_type; // Тип каждого элемента в таблице, если сумма выходит в пределах 16 бит - uint16_t, иначе - uint32_t
typedef uint8_t temperature_table_index_type;// Тип индекса таблицы. Если в таблице больше 256 элементов, то uint16_t, иначе - uint8_t
#define TEMPERATURE_TABLE_READ(i) termo_table[i]// Метод доступа к элементу таблицы, должна соответствовать temperature_table_entry_type
/* Таблица суммарного значения АЦП в зависимости от температуры. От большего значения к меньшему Для построения таблицы использованы следующие парамертры: R1(T1): 22кОм(25°С) R2(T2): 1.211034кОм(100°С) Схема включения: C Ra: 10кОм Напряжения U0/Uref: 5В/5В */ const temperature_table_entry_type termo_table[]= { 3869, 3837, 3801, 3759, 3710, 3654, 3588, 3512, 3424, 3323, 3207, 3076, 2927, 2761, 2579, 2381, 2169, 1948, 1723, 1498, 1280, 1074, 885, 716, 568, 443 };
// Функция вычисляет значение температуры в десятых долях градусов Цельсия // в зависимости от суммарного значения АЦП. signed short calc_temperature(temperature_table_entry_type adcsum) { temperature_table_index_type l = 0; temperature_table_index_type r = (sizeof(termo_table) / sizeof(termo_table[0])) - 1; temperature_table_entry_type thigh = TEMPERATURE_TABLE_READ(r);
if (adcsum <= thigh) // Проверка выхода за пределы и граничных значений { #ifdef TEMPERATURE_UNDER if (adcsum < thigh) return TEMPERATURE_UNDER; #endif return TEMPERATURE_TABLE_STEP * r + TEMPERATURE_TABLE_START; } temperature_table_entry_type tlow = TEMPERATURE_TABLE_READ(0); if (adcsum >= tlow) { #ifdef TEMPERATURE_OVER if (adcsum > tlow) return TEMPERATURE_OVER; #endif return TEMPERATURE_TABLE_START; }
while ((r - l) > 1) // Двоичный поиск по таблице { temperature_table_index_type m = (l + r) >> 1; temperature_table_entry_type mid = TEMPERATURE_TABLE_READ(m); if (adcsum > mid) { r = m; } else { l = m; } } temperature_table_entry_type vl = TEMPERATURE_TABLE_READ(l); if (adcsum >= vl) { return l * TEMPERATURE_TABLE_STEP + TEMPERATURE_TABLE_START; } temperature_table_entry_type vr = TEMPERATURE_TABLE_READ(r); temperature_table_entry_type vd = vl - vr; int16_t res = TEMPERATURE_TABLE_START + r * TEMPERATURE_TABLE_STEP; if (vd) // Линейная интерполяция {
совет переходите на платиновые термометры сопротивления напр ПТС100 они линейны и могцт от -100до+1400 ну или копечные термопары тамс правда не R а ЭДС+возня с компенсацией холодног спая но линейность на 2 порядка лучше обычныхNTC
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Я просто делал кусочно-линейную интерполяцию после калибровки по платиновому терморезистору. Очень даже сносно получалось (в ЖЖ все расписал).
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Сейчас этот форум просматривают: Сталкер84 и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения