BAM – Binary Angle Modulation

28 Октября 2011 К комментариям

Сегодня встал вопрос как регулировать яркость светодиода. Вспомнил, что читал о ВАМ, нашел в сети статью:

BAM: Альтернатива ШИМу

Набросал простой пример.

Регулируем яркость двух светодиодов на плате дисковери.

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

Изменения которые необходимо сделать в коде:

//-----------------------------------------------------------------------------
int main(void)
{
    PIN_CONFIGURATION(LED_GREEN);
    PIN_CONFIGURATION(LED_BLUE);
    PIN_CONFIGURATION(BUTTON);

    mcu_tim17_init();

    interrupt_init();

    while (1)
    {
        delay_ms(10);
        led_green_brightness++;
        led_green_brightness--;
    }
    return 0;
}
static volatile uint8_t arr_value = 128;
volatile uint8_t led_green_brightness = 0;
volatile uint8_t led_blue_brightness = 0;
//-----------------------------------------------------------------------------
void handler_tim1_trigger_and_communication_and_tim17(void)
{
    if (TIM17->SR & TIM_SR_UIF)
    {
        TIM17->SR &= ~TIM_SR_UIF;
        // установка периода
        // от 8 до 1024
        arr_value /= 2;
        if (arr_value == 0)
            arr_value = 128;
        TIM17->ARR = (uint16_t) arr_value * 8;
        // яркость зеленый
        if ((arr_value & led_green_brightness) != 0)
        {
            PIN_ON(LED_GREEN);
        }
        else
        {
            PIN_OFF(LED_GREEN);
        }
        // яркость синий
        if ((arr_value & led_blue_brightness) != 0)
        {
            PIN_ON(LED_BLUE);
        }
        else
        {
            PIN_OFF(LED_BLUE);
        }
    }
}
//-----------------------------------------------------------------------------
void mcu_tim17_init(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_TIM17EN;
    TIM17->PSC = 8 - 1;
    TIM17->ARR = 1024;
    TIM17->DIER |= TIM_DIER_UIE;
    TIM17->CR1 = TIM_CR1_CEN | TIM_CR1_ARPE;
}

Categories: Полезняшки Tags: BAM

comments powered by Disqus