Автор: Олег Хохлов
Дата: 21.05.08 10:46
Здравствуйте, Виктор.
Вы писали 21 мая 2008 г., 07:30:53:
> Здравствуйте!
> такая же. Написал обработку дребезга контакта (сигнал считается
> достоверным, если 3 раза подряд пришли одинаковые данные). Все равно 1 раз
> за 2-3 дня происходит ложная сработка. Если увеличить число повторных
> запросов для обработки дребезга контактов, то увеличивается время опроса.
> Специально пришлось устанавливать модуль I-7050 - все заработало
> нормально.
> В связи с этим вопрос - можно ли поставить на входа DI контроллера
> дополнительные элементы (резисторы подвесить к + или к минусу или
> установить конденсаторы) для исключения ложных срабатываний? Не охота для
> двух сигналов специально использовать модуль.
Электрически уменьшить число уровень конечно можно (и вероятно нужно),
но вообще-то обработка дребезга и ложных срабатываний - стандартный
алгоритм, просто чтобы не "увеличивалось время опроса", его нужно
всего лишь иначе реализовывать...
Я так понял у Вас сделана функция, которая выполняет 3 опроса с
некоторой небольшой задержкой между ними, и пока функция не закончит
работу, программа дальше не идет, и это не позволяет сделать параметры
опроса (значение задержки и число циклов) требуемыми. В то же время
легко сделать автомат с несколькими ячейками памяти, который на каждом
периодическом вызове будет опрашивать вход только один раз...
Вот для примера реализация на С++ моего простенького блочка подавления
дребезга в одной из систем:
// Блок подавления дребезга дискретного сигнала;
// Выход принимает значение входа только тогда, когда вход не меняется
// в течение указанного числа тактов (контрольный интервал)
class DI_ANTI_TREMBLER {
public:
BYTE State; // текущее (подавленное) состояние сигнала
BYTE PrevSignal; // предыдущее входное состояние сигнала
BYTE Interval; // контрольный интервал
BYTE Count; // счетчик контрольного интервала
pascal DI_ANTI_TREMBLER(BYTE interval=1) { Interval=interval; } // Конструктор
BYTE pascal AntiTrebler(BYTE signal);
};
BYTE pascal DI_ANTI_TREMBLER::AntiTrebler(BYTE signal)
{
if (signal>1) signal=1;
if (signal!=PrevSignal) { PrevSignal=signal;
if (signal==State) Count=0;
else if (Count>=Interval) { State=signal; Count=0; }
else Count++;
}
return State;
}
Метод AntiTrembler() вызывается на каждом цикле с текущим считанным
значением входа в качестве параметра, а возвращает отфильтрованное
состояние.
--
С уважением,
Олег Хохлов, Институт Транспорта Газа, г.Харьков
mailto:olegh@xxxxxxxxx.xxx
mailto:olegh@xxx.xxx
ICQ:107308679
|
|