Ви не увійшли.
Сторінки 1
Добрый день !
Прошу помощи в такой проблеме.
Есть некий прибор с индикаторным светодиодом (ИСД). Нужно отследить интервалы включения этого светодиода.
Два типа сигнала, длительное включение от 1 секунды и до нескольких минут, короткие вспышки по 0,5 секунды.
Подключился к ИСД параллельно оптопарой, но оказалось, что ИСД питается ШИМ сигналом и поэтому получаю массу ложных срабатываний.
Ищу способ программного решения этого вопроса (измерить частоту ШИМ пока нет возможности).
Неактивний
Измеряете скважность, а по ней измеряете длительность, например скважность была 80% в течении одной секунды - значит то-то, в течении 0.5 сек - значит то-то
Была такая мысль, только измерять не скважность, а просто наличие импульсов на коротком интервале времени, а потом складывать эти интервалы...
Есть у вас пример измерения скважности? (чтобы заново не изобретать велосипед...)
Остання редакція renoshnik (2018-01-17 13:27:58)
Неактивний
Два типа сигнала, длительное включение от 1 секунды и до нескольких минут, короткие вспышки по 0,5 секунды.
какие timer compare?
с такими временами вручную контролировать свою лампочку .
что то типа = millis(); и не заморачиватся
например
ели лампа влючена - то в некую переменную записать 10 мс когда страбатывает прерывание от ноги mcu
состояние лампа выключена - вы до нуля доведете свой счетчик и создадите свое событие на смену состояния
андестенд? )
например
так делать нельзя . но мне удобно свичи использовать.
typedef enum {
TIMER_EXE = 0,
TIMER_DISABLED = 1,
TIMER_RUN = 2,
}TE_TIMER;
TE_TIMER programm_count_down_uint16 ( unsigned short *timer , unsigned char shift )
{
if (*timer > 0 )
{
if (*timer > shift )
{
*timer -= shift;
return TIMER_RUN;
}
else
{
*timer = 0;
return TIMER_EXE;
}
}
return TIMER_DISABLED;
}
interrupt port pin rissing led control
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
led_down_time = 10; // ms
loop
hw_current_system_timer = millis();
delta_task_timer = hw_current_system_timer - hw_old_system_timer;
hw_old_system_timer = hw_current_system_timer;
status = programm_count_down_uint16 ( &led_down_time, delta_task_timer );
switch ( status )
{
case TIMER_EXE:
// exe event
break; // led disable
case TIMER_DISABLED:
break;
case TIMER_RUN:
break;
}
Неактивний
renoshnik пише:Два типа сигнала, длительное включение от 1 секунды и до нескольких минут, короткие вспышки по 0,5 секунды.
какие timer compare?
с такими временами вручную контролировать свою лампочку .
что то типа = millis(); и не заморачиватсянапример
ели лампа влючена - то в некую переменную записать 10 мс когда страбатывает прерывание от ноги mcuсостояние лампа выключена - вы до нуля доведете свой счетчик и создадите свое событие на смену состояния
андестенд? )например
так делать нельзя . но мне удобно свичи использовать.
typedef enum { TIMER_EXE = 0, TIMER_DISABLED = 1, TIMER_RUN = 2, }TE_TIMER; TE_TIMER programm_count_down_uint16 ( unsigned short *timer , unsigned char shift ) { if (*timer > 0 ) { if (*timer > shift ) { *timer -= shift; return TIMER_RUN; } else { *timer = 0; return TIMER_EXE; } } return TIMER_DISABLED; } interrupt port pin rissing led control https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ led_down_time = 10; // ms loop hw_current_system_timer = millis(); delta_task_timer = hw_current_system_timer - hw_old_system_timer; hw_old_system_timer = hw_current_system_timer; status = programm_count_down_uint16 ( &led_down_time, delta_task_timer ); switch ( status ) { case TIMER_EXE: // exe event break; // led disable case TIMER_DISABLED: break; case TIMER_RUN: break; }
Спасибо, так примерно и думал но вход на 4 ногу, поэтому с прерываниями немного сложнее будет...
Неактивний
renoshnik пише:Два типа сигнала, длительное включение от 1 секунды и до нескольких минут, короткие вспышки по 0,5 секунды.
какие timer compare?
с такими временами вручную контролировать свою лампочку .
что то типа = millis(); и не заморачиватсянапример
ели лампа влючена - то в некую переменную записать 10 мс когда страбатывает прерывание от ноги mcuсостояние лампа выключена - вы до нуля доведете свой счетчик и создадите свое событие на смену состояния
андестенд? )например
так делать нельзя . но мне удобно свичи использовать.
typedef enum { TIMER_EXE = 0, TIMER_DISABLED = 1, TIMER_RUN = 2, }TE_TIMER; TE_TIMER programm_count_down_uint16 ( unsigned short *timer , unsigned char shift ) { if (*timer > 0 ) { if (*timer > shift ) { *timer -= shift; return TIMER_RUN; } else { *timer = 0; return TIMER_EXE; } } return TIMER_DISABLED; } interrupt port pin rissing led control https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ led_down_time = 10; // ms loop hw_current_system_timer = millis(); delta_task_timer = hw_current_system_timer - hw_old_system_timer; hw_old_system_timer = hw_current_system_timer; status = programm_count_down_uint16 ( &led_down_time, delta_task_timer ); switch ( status ) { case TIMER_EXE: // exe event break; // led disable case TIMER_DISABLED: break; case TIMER_RUN: break; }
И началось мерянье пиписьками...
RC фильтр тоже вариант. И ещё кучу можно придумать.
А вот это " какие timer compare? " к чему?
Конечно вы всех умнее я уверен!!!
Неактивний
правильно заметили - нужно было написать capture )
http://www.electronicwings.com/avr-atme … pture-mode
насчет умнее, ет врядли ) есть более подходящие кандидаты
add
поумничаем )
я сделал бы счетчик уменьшения не в рабочем цикле loop, а в прерывании timer compare )
сколько там таймеров у атмела младшей модели как обычно? )
add 2 для для таких интервалов почему бы и не задавить частоту ) здравая идея cncserge )
Остання редакція NoName (2018-01-17 22:41:57)
Неактивний
Сторінки 1