Фильтр - да. Нужен в любом случае.
Этот - конкретизированный. Работает на 2 уровня, задаваемые заранее.
Уровень сигнала него - выдает единичку.
Уровень сигнала ниже него - выдает 0.
Это есть фильтр на 4 импульса (4 измерения АЦП).
Если все 4 подряд значения АЦП равносильны состоянию 1, то состояние переходит в 1.
Если 4 подряд состояния - ноль, то состояние переходит в ноль.
Все, что промежуточное - не изменяет состояния.
Переделывайте, как хотите.
Фильтр писал прямо сейчас, и не проверял - поэтому могут быть небольшие ошибки.
Суть фильтра уже выложил. И Цифра вообще может эффективно заменять аналоговые фильтры.
- Код: Выделить всё • Развернуть
int levels=0;
// 4 значения АЦП идут на фильтр
#define mask 0x0f
//уровень перехода в состояние 1 из нуля
#define level_1 50
//уровень перехода в состояние 0 их 1
#define level_0 45
//они спецально выбраны так, чтобы не было "дерганья" туда и обратно. можно сделать совпадающими
char result_opto;
int filter(){
//смещаем на 1 бит влево для того, чтобы записать новое значение в крайний бит. эта переменная - место где храним значения для обработки.
levels <<= 1;
if (result_opto)
{
//пишем по умолчанию текущее значение оптопары, ибо она
//может попасть в некалиброванный диапазон и
//тогда должна остаться такого же значения.
levels |= 1;
};
if (result_opto)
{
if (level()<=level_0) levels &= ~0x01;
};
if (!result_opto)
{
if (level()>level_1) levels |= 0x01;
};
if (levels&mask==mask)
{
result_opto=1;
};
if (levels&mask==0)
{
result_opto=0;
};
return result_opto;
};