Страница 1 из 1

Nuvoton N76E003AT20 в термостате

Добавлено: Вс сен 20, 2020 16:15:51
Кинг
Попался мне в руки термостат STC-3008 там стоит N76E003AT20 который не особо то и распространен. на панели стоят 4 кнопки которые сидят на земле и прямиком идут в мк без подтяжки к питанию. посмотрев даташит я не нашел режим входа с pull up как у STM32, как тогда считывается состояние кнопки?

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Вс сен 20, 2020 18:19:46
tonyk
А куда они делись? Страница 87 даташита.

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Вс сен 20, 2020 19:17:23
Кинг
Если открыть верхний полевик и подать на ногу минус он должен бахнуть

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Вс сен 20, 2020 19:26:08
Flasher
А если подумать и внимательно прочитать?

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Вс сен 20, 2020 19:41:16
Кинг
Я подумал это какие то быстро действующие транзисторы, а то что у них высокое сопротивление даже в голову не пришло. Резумирую мне нужен режим quasi

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Вс сен 27, 2020 22:12:54
Кинг
пытаюсь подключить NTC термистор к МК. т.к он не линейный воспользовался сайтомhttps://aterlux.ru/article/ntcresistor для расчета градуированной таблицы. получил код
Спойлер

Код: Выделить всё

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"

#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)  // Линейная интерполяция
  {
   
    res -= ((TEMPERATURE_TABLE_STEP * (int32_t)(adcsum - vr) + (vd >> 1)) / vd);
  }
  return res;
}

если значение ацп(например 1498) совпадает с данными из таблицы выдает температуру правильно 300, но если например 1522 уже температура 14.

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Пн сен 28, 2020 17:07:28
Zhuk72
Вместо такой таблицы лучше бы по формуле рассчитали.

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Пн сен 28, 2020 19:16:55
Кинг
по формуле погрешность приличная.

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Пн сен 28, 2020 22:28:20
musor
совет переходите на платиновые термометры сопротивления напр ПТС100 они линейны и могцт от -100до+1400
ну или копечные термопары тамс правда не R а ЭДС+возня с компенсацией холодног спая но линейность на 2 порядка лучше обычныхNTC

Re: Nuvoton N76E003AT20 в термостате

Добавлено: Вт сен 29, 2020 13:08:53
Eddy_Em
Я просто делал кусочно-линейную интерполяцию после калибровки по платиновому терморезистору. Очень даже сносно получалось (в ЖЖ все расписал).