2014-02-07 2 views
1

Im пытается выяснить, как сгладить светодиод с течением времени (время определяется пользователем, позволяет называть его rampUp). Im использованием Arduino с Adafruit прорыве ШИМ-сервопривод (http://www.adafruit.com/products/815) с библиотекой: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-LibraryDim LED со временем в равномерном потоке с использованием Arduino

этот прорыв имеет 4095 шагов (0-4095), так что теперь моя проблема:

Я хочу, чтобы быть в состоянии принять переменную (int minutes) и отправить ее методу, который уменьшит светодиод от 0 до 4095 при равном увеличении интенсивности света за период минут. Я хочу, чтобы увеличение увеличивалось на 1 каждый раз, когда оно увеличивается.

Как я могу написать метод без использования задержки()?

void dimLights(int rampUp){ 
    // some code to regulate the increase of the third value in setPWM one step at a time over a period of rampUp(int in minutes) 
    led.setPWM(0,0,4095); 
} 

Причина, по которой не требуется использовать delay(), заключается в том, что она остановит/остановит остальную часть программы.

ответ

0

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

void loop() { 
    /* ... */ 
    if (rampUp != 0) 
     led.setPWM(0,0,rampUp); 
} 

void led_update() { 
    // here you can prescale even more by using something like 
    // if (++global_led_idx == limit) { 
    // global_led_idx = 0; 
    ++rampUp; 
} 

void start() { 
    TCCR1B |= _BV(WGM12); 
    // set up timer with prescaler = FCPU/1024 = 16MHz/1024 ⇒ 60ms 
    TCCR1B |= _BV(CS12) | _BV(CS10); 
    TCCR1B &= ~_BV(CS11); 

    // initialize counter 
    OCR1A = 0x0000; 

    // enable global interrupts 
    sei(); 
    // enable overflow interrupt 
    TIMSK1 |= _BV(OCIE1A); 
} 

void TAGByKO_LED::stop() { 
    TIMSK1 &= ~_BV(OCIE1A); 
    rampUp = 0; 
} 

ISR(TIMER1_COMPA_vect, ISR_NOBLOCK) { 
    led_update();  
} 

, то вы можете вызвать start() для запуска таймера, или stop(), чтобы остановить его. Вы можете прочитать дополнительную документацию о регистрах, которые я использовал здесь, и инструкции ISR. Остерегайтесь, что это одна из самых сложных вещей в AVR: действительно, понимает, и даже тогда вам всегда придется иметь чит-лист или таблицу данных.

Вы также можете использовать @ решение SR-Richie с таймерами, но делать только параметры настройки в функции dimLights() и вызвать led.setPWM() только в loop().