#1 2018-01-17 10:58:55

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

PWM как победить ?

Добрый день !
Прошу помощи в такой проблеме.

Есть некий прибор с индикаторным светодиодом (ИСД). Нужно отследить интервалы включения этого светодиода.
Два типа сигнала, длительное включение от 1 секунды и до нескольких минут, короткие вспышки по 0,5 секунды.

Подключился к ИСД параллельно оптопарой, но оказалось, что ИСД питается ШИМ сигналом и поэтому получаю массу ложных срабатываний.

Ищу способ программного решения этого вопроса (измерить частоту ШИМ пока нет возможности).

Неактивний

#2 2018-01-17 11:16:20

cncserge
Учасник
З Полтава
Зареєстрований: 2018-01-03
Повідомлень: 37

Re: PWM как победить ?

Измеряйте скважность шим.

Неактивний

#3 2018-01-17 13:00:36

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: PWM как победить ?

cncserge пише:

Измеряйте скважность шим.

А как это решит проблему ?
Нужно определять длительность включения ИСД, а не просто его включение ...

Неактивний

#4 2018-01-17 13:02:51

cncserge
Учасник
З Полтава
Зареєстрований: 2018-01-03
Повідомлень: 37

Re: PWM как победить ?

Измеряете скважность, а по ней измеряете длительность, например скважность была 80% в течении одной секунды - значит то-то, в течении 0.5 сек - значит то-то

Неактивний

#5 2018-01-17 13:27:34

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: PWM как победить ?

cncserge пише:

Измеряете скважность, а по ней измеряете длительность, например скважность была 80% в течении одной секунды - значит то-то, в течении 0.5 сек - значит то-то

Была такая мысль, только измерять не скважность, а просто наличие импульсов на коротком интервале времени, а потом складывать эти интервалы...

Есть у вас пример измерения скважности? (чтобы заново не изобретать велосипед...)

Остання редакція renoshnik (2018-01-17 13:27:58)

Неактивний

#6 2018-01-17 13:31:41

cncserge
Учасник
З Полтава
Зареєстрований: 2018-01-03
Повідомлень: 37

Re: PWM как победить ?

Вот статья
http://www.gaw.ru/html.cgi/txt/doc/micros/arm/cortex_arh/5_1_4_1_3.htm
Там описано как измерить заполнение и период шима

Неактивний

#7 2018-01-17 13:43:07

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: PWM как победить ?

cncserge пише:

Вот статья
http://www.gaw.ru/html.cgi/txt/doc/micros/arm/cortex_arh/5_1_4_1_3.htm
Там описано как измерить заполнение и период шима

Что-то не открывается ничего ....  :-(

Неактивний

#8 2018-01-17 13:44:54

cncserge
Учасник
З Полтава
Зареєстрований: 2018-01-03
Повідомлень: 37

Re: PWM как победить ?

Bezymjannyjj.png

Неактивний

#9 2018-01-17 13:59:18

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: PWM как победить ?

cncserge пише:

https://forum.arduino.ua/img/members/1803/Bezymjannyjj.png

Спасибо но это для ARM, а у меня AVR ... хотя идея понятна...

Неактивний

#10 2018-01-17 14:09:52

cncserge
Учасник
З Полтава
Зареєстрований: 2018-01-03
Повідомлень: 37

Re: PWM как победить ?

Главное суть...

Неактивний

#11 2018-01-17 18:04:35

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: PWM как победить ?

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;   
 }

Неактивний

#12 2018-01-17 18:24:00

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: PWM как победить ?

NoName пише:
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 ногу, поэтому с прерываниями немного сложнее будет...

Неактивний

#13 2018-01-17 19:10:01

cncserge
Учасник
З Полтава
Зареєстрований: 2018-01-03
Повідомлень: 37

Re: PWM как победить ?

NoName пише:
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? " к чему?
Конечно вы всех умнее я уверен!!!

Неактивний

#14 2018-01-17 22:25:37

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: PWM как победить ?

правильно  заметили - нужно было написать capture )

http://www.electronicwings.com/avr-atme … pture-mode


насчет умнее, ет врядли  ) есть более подходящие кандидаты

add 
поумничаем )
я сделал бы счетчик уменьшения не в рабочем цикле  loop,  а в прерывании timer compare )   
сколько там таймеров у атмела младшей модели как обычно? )

add 2 для  для таких интервалов почему бы и не задавить  частоту ) здравая идея cncserge )

Остання редакція NoName (2018-01-17 22:41:57)

Неактивний

#15 2018-01-17 23:33:50

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: PWM как победить ?

cncserge пише:

RC фильтр тоже вариант. И ещё кучу можно придумать.

Программный RC фильтр - моновибратор (в хорошем смысле)). Проще всего.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму