PDA

Просмотр полной версии : Поборол мерцание аналоговых помех на экране



Yegor
25.02.2015, 13:57
Многие, наверное, сталкивались: когда на экране отображаешь числовые показания, добытые по шумящим интерфейсам, то возникает мельтешение числового текста (например, между 19,9 и 20,0), причём в любых разрядах вплоть до самого старшего.

http://i.imgur.com/x8XKTza.gif

Я нашёл ну прямо обкакаться простой способ от этого избавиться без задержек, которые свойственны НЧ-фильтрам:


FUNCTION_BLOCK DEFLICKER
VAR_INPUT
IN, DEC: REAL;
END_VAR
VAR_OUTPUT
OUT: REAL;
END_VAR
VAR
inpTrunc, inpRound, inpTruncPrev, inpRoundPrev: DINT;
END_VAR

inpRound := REAL_TO_DINT(IN * DEC);
inpTrunc := TRUNC(IN * DEC);

IF inpRound <> inpRoundPrev THEN
OUT := inpTrunc / DEC;
ELSIF inpTrunc <> inpTruncPrev THEN
OUT := inpRound / DEC;
END_IF

inpRoundPrev := inpRound;
inpTruncPrev := inpTrunc;Скажем, если надо округлить до десятых для отображения, то делаем deflicker1(IN := вход_с_помехами, DEC := 10, OUT => на_экран). DEC берём до нешумящего разряда (10 — десятые доли, 100 — сотые и т.д.). Работает очень просто: если меняется округленное, то взять отрезанное (транкейт); если меняется транкейт, то взять округленное. И т.к. одновременно транкейт и округленное почти не шумят, то число мёртво стоит на экране.

Можно, конечно, упрекнуть в неточности, но не забывайте, что это делается только для грубого отображения. Сам удивился, насколько просто решилась проблема — вот и решил поделиться.

Вольд
25.02.2015, 18:20
А человеку и не надо чтобы числовые показания на экране очень часто менялись. Так что НЧ-фильтрация вполне пойдет.

rovki
25.02.2015, 18:25
В свое время использовал метод скользящего окна для этих целей .