Вс мар 07, 2021 07:14:20
Вс мар 07, 2021 08:06:24
Вс мар 07, 2021 11:11:14
Нужно один раз для каждого значения регистра вывода(хранения) из i=[0, 255] построить функцию U(i), например i=[0, .., 255] => U(i)=[1.55, .., 4.55] записать в память МК и по ней распознавать: U => i => bin(i). Но для точной работы АЦП потребуется ИОН, можно и без него если используется батарея, но тогда функция U(i) должна учитывать разрядку батареи: U(i, Uбат), где Uбат - напряжение батареи. Некоторые МК имеют встроенный ИОН, можно задействовать его, тогда усложнять функцию не придётся, выбрать напряжения внутреннего ИОН меньше напряжения питания, чтобы не зависеть от его снижения.у меня есть DIP-выключатель на восемь позиций и я хочу, пользуясь единственным аналоговым входом микроконтроллера, распознавать, в каком положении находятся эти выключатели.
Вс мар 07, 2021 16:07:31
Вс мар 07, 2021 16:45:59
Вс мар 07, 2021 17:10:43
Вс мар 07, 2021 17:18:19
Вс мар 07, 2021 18:34:22
Вс мар 07, 2021 21:24:56
Вс мар 07, 2021 22:20:41
Вс мар 07, 2021 23:24:35
Пн мар 08, 2021 01:03:14
Необязательно. Вот пример. При указанных номиналах и питании 5В напряжение на выходе изменяется от 0.5В до 4.5В. ОУ должен быть Rail-To-Rail по выходу и работать от 0.5В синфазного сигнала по входу. Можно взять и обычный, если учесть минимальное и максимальное выходные напряжения и входной диапазон синфазного сигнала.diplodok писал(а):... здесь требуется двуполярное напр.
Пн мар 08, 2021 02:47:13
static int8_t read_time_zone_delta(void)
{
const uint16_t v_range = 1u << ADC_BITS;
static const uint16_t r_sw_10[] PROGMEM = { 13710, 6510, 3200, 1480, 815 };
const uint16_t r_bot_10 = 810;
uint16_t v = analogRead(TIME_ZONE_PIN);
uint8_t best_combination = 0;
uint16_t min_delta = UINT16_MAX;
for (uint8_t combination = 0; combination < (1u << ARRAY_N(r_sw_10)); ++combination)
{
uint16_t v_expected = 0;
if (combination > 0)
{
uint32_t conductivity_total_sw = 0;
for (unsigned sw = 0; sw < ARRAY_N(r_sw_10); ++sw)
if ((combination & (1u << sw)) != 0)
conductivity_total_sw += UINT32_MAX / pgm_read_word(&r_sw_10[sw]);
uint16_t r_total_sw_10 = (uint16_t) (UINT32_MAX / conductivity_total_sw);
v_expected = (uint32_t) v_range * r_bot_10 / (r_total_sw_10 + r_bot_10);
}
unsigned delta = v_expected > v ? v_expected - v : v - v_expected;
if (delta < min_delta)
{
best_combination = combination;
min_delta = delta;
}
}
int8_t abs_delta = best_combination & 0x0F;
if ((best_combination & 0x10) == 0)
abs_delta = -abs_delta;
abs_delta = MAX(abs_delta, TIME_ZONE_DELTA_MIN);
abs_delta = MIN(abs_delta, TIME_ZONE_DELTA_MAX);
return abs_delta;
}
Пн мар 08, 2021 04:37:03
Пн мар 08, 2021 05:09:21
Пн мар 08, 2021 05:13:26
Пн мар 08, 2021 06:52:02
Пн мар 08, 2021 06:53:26
Пн мар 08, 2021 06:56:45
Пн мар 08, 2021 07:07:20