Проблема с PWM при управлении по таймеру

stan31
Offline
Зарегистрирован: 24.09.2016

Здравствуйте!

В процессе работы над стробоскопом со специфическими функциями возникла проблема.

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

https://softsolder.com/2013/01/03/arduino-snippets-led-stroboscopic-tachometer/

То есть работа с таймером таким образом:

    analogWrite(PIN_STROBE,1);          // let Arduino set up default Timer1 PWM
    TCCR1B = 0;                         // turn off Timer1 for strobe setup
    TCCR1A = 0x82;                      // clear OCR1A on match, Fast PWM, lower WGM1x = 14
    ICR1 = FlashPdCt;
    OCR1A = FlashLengthCt;
    TCNT1 = FlashLengthCt - 1;
    TCCR1B = 0x18 | TCCRxB_CS;          // upper WGM1x = 14, Prescale 1:64, start Timer1
 

для изменения частоты строба - вот этот код:

noInterrupts();
TCCR1B &= 0xf8;             // stop Timer1
ICR1 = FlashPdCt;           // set new period
TCNT1 = FlashPdCt - 1;      // force immediate update
TCCR1B |= TCCRxB_CS;        // start Timer1
interrupts();

Проблема возникает когда мне необходимо выключить стробоскоп полностью, либо включить его для постоянного освещения. analogWrite не действует в данном случае, ШИМ модуляция на управляющем стробоскопом пине не прекращается. Выключить я вроде бы сумел TCCR1B = 0; включить обратно тоже - типа TCCR1B = 0x18 | TCCRxB_CS;

Это работает не знаю насколько это правильно. А вот включить диод на постоянное свечение, отключив PWM - не получилось. Подскажите какие есть пути решения этой проблемы?

 

a5021
Offline
Зарегистрирован: 07.07.2013
TCCR1A  &=  ~(1<<COM1A1);   // отключить пин от таймера
   // теперь можно дергать за ногу
digitalWrite(pin, LOW);     // пин опустить
digitalWrite(pin, HIGH);     // пин поднять
TCCR1A  |=  (1<<COM1A1);   // подключить пин к таймеру обратно

 

stan31
Offline
Зарегистрирован: 24.09.2016

О, спасибо большое!

Сейчас попробую!