Страниц: [1]
  Печать  
Автор Тема: Подскажите алгоритм обработки мигания (лампочки)  (Прочитано 10969 раз)
Fregl
Sr. Member
****
Offline Offline

Сообщений: 396


Просмотр профиля
« : Апреля 27, 2010, 08:39:22 pm »

Добрый день. Стоит такая задача:
есть сигналы, которые могут быть либо в нуле, либо в единице, либо постоянно мигать (с единицы в ноль и обратно с определенной частотой, к примеру 750 мс).
Необходимо корректно обрабатывать начало мигания, окончание мигания, постоянный сигнал (0 или 1).
Мне предложили реализацию, но слишком много придется тянуть с чужого проекта, хочется написать попроще и по эффективнее.
Завтра выложу пример своей реализации ...
А пока буду рад выслушать советы.
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 633


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #1 : Апреля 27, 2010, 09:14:44 pm »

Навесить обработчик на -1 и периодически устанавливать/сбрасывать сигнал. В чём тут может быть проблема? ;-} Давайте свой код, вместе посмеёмся.
Записан
Fregl
Sr. Member
****
Offline Offline

Сообщений: 396


Просмотр профиля
« Ответ #2 : Апреля 27, 2010, 11:31:06 pm »

уточняю, на входе у меня дискретный сигнал, может быть постоянно включен, выключен или меняться периодически с определенной частотой.
каждые 100 мс я сканирую этот сигнал. если сигнал меняется, но не слишком часто (больше чем за 750 мс, к примеру между двумя последующими фронтовыми сигналами 2 сек), принимаем что нет мигания, сигнал горит (либо нет). если меньше - то мигание.
т.е. каждые 100 мс на выходе у меня должно быть либо 0-нет сигнала, 1-горит постоянно, -1 - мигание.
Записан
Fregl
Sr. Member
****
Offline Offline

Сообщений: 396


Просмотр профиля
« Ответ #3 : Апреля 27, 2010, 11:32:57 pm »

таких сигналов порядка сотни, получаю с контроллеров ввода по эзеренету. мне необходимо отловить любое изменение сигнала и передать его дальше (это изменение).
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #4 : Апреля 28, 2010, 01:00:20 am »

А вы смелее определитесь с критериями мигания, а то все к примеру, или фронтовые сигналы какие-то (уж не война ли?)...
Потому как у вас будет неопределенность - если входной сигнал поменял свое состояние вы какое-то время не можете сказать, он флипнулся или начал мигать. Если я правильно понял ваш термин фронтовых сигналов, то вы всегда будете выдавать дальше состояние с запаздыванием на эти две секунды (пока вы не определите, что сигнал таки уверенно перевернулся, а не начал мигать).
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #5 : Апреля 28, 2010, 01:05:55 am »

Т.е. если вас задержка в две секунды устраивает (а другого быть не может, если у вас есть понятие "мигающий" сигнал), то я не понимаю какие тут сложности с математикой? Тут простейшая арифметика со счетчиком до 20.
Записан
Fregl
Sr. Member
****
Offline Offline

Сообщений: 396


Просмотр профиля
« Ответ #6 : Апреля 29, 2010, 05:21:35 pm »

вот пример моей реализации:
Код:
void check_state(struct timespec * recv_time, uint8_t * current_state, inout_t * inout, int * result)
{
uint64_t delta;
switch(*current_state)
{
case 0:
if(*current_state!=inout->prev_state) //тыловой сигнал пошёл
{
// printf("1->0 : front->drop =%lli ",delta);
inout->drop_time = *recv_time;
}
delta = timespec2nsec(recv_time)-timespec2nsec(&inout->drop_time);
inout->drop_flash = (delta<1000000000LL); //если меньше 1 сек, считаем что мигает
// printf("drop delta %lli : drop_flash %i ",delta,inout->drop_flash);

break;

case 1:
if(*current_state!=inout->prev_state) //фронтовой сигнал пошёл
{
// printf("0->1 : drop->front =%lli ",delta);
inout->front_time = *recv_time;
}
delta = timespec2nsec(recv_time)-timespec2nsec(&inout->front_time);
inout->front_flash = (delta<1000000000LL);//если меньше 1 сек, считаем что мигает
// printf("front delta %lli : front_flash %i ",delta,inout->front_flash);
break;
}

if((inout->drop_flash==true) && (inout->front_flash==true)) //было мигание и по фронту и по тылу, задаем -1 (мигание)
*result=-1;
else
*result= *current_state;

inout->prev_state = *current_state;
printf("result=%i\n",*result);
}
Записан
Fregl
Sr. Member
****
Offline Offline

Сообщений: 396


Просмотр профиля
« Ответ #7 : Апреля 30, 2010, 12:39:15 pm »

у этого подхода есть недостатки, самый главный что при первом мигании передается 1, 0, а уж потом -1(признак мигания)...
Записан
A_O
Full Member
***
Offline Offline

Сообщений: 213


Просмотр профиля
« Ответ #8 : Апреля 30, 2010, 01:57:28 pm »

у этого подхода есть недостатки, самый главный что при первом мигании передается 1, 0, а уж потом -1(признак мигания)...
Это ровно то самое, о чем вам уже говорил ed1k. Ваша задача в принципе похожа на задачу подавления дребезга при обработке дискретных сигналов, и решается примерно таким же способом. Надо не давать ответ сразу, а накапливать информацию о поведении сигнала за время, гарантированно большее периода мигания (скажем, 1.5 периода - конкретная величина зависит еще и от частоты вашего цикла опроса), и менять выходное значение только тогда, когда уже твердо выяснилось, чтО это - мигание или устойчивое изменение. Естественно, вы получите задержку на эти 1,5 цикла, но иначе не выйдет.
« Последнее редактирование: Апреля 30, 2010, 02:00:53 pm от A_O » Записан
Laplans
Гость
« Ответ #9 : Сентября 06, 2010, 05:59:38 am »

Весомые доводы.Я понял буду пытаться придумать нормальный алгоритм.. как же мне надоела эта задача..
Записан
ksv
Участник
*
Offline Offline

Сообщений: 10


Просмотр профиля
« Ответ #10 : Сентября 06, 2010, 01:25:47 pm »

Я понял буду пытаться придумать нормальный алгоритм.. как же мне надоела эта задача..

Учитывайте еще то, что сигнал может быть переменного тока, т.е. нули и единицы будут чередоваться необязательно из-за мигания сигнала
Записан
Страниц: [1]
  Печать  
 
Перейти в: