STM32使用TIM閃爍LED——PWM方式


這次實驗實現一個呼吸燈的效果,LED在第一秒內漸亮,在第二秒內漸暗,如此反復

控制LED的PWM波形階梯數為100,即2秒內PWM的占空比從0%到100%范圍內先遞增后遞減且遞增/遞減的幅度為1%

在設計STM32時,將定時器時鍾7200分頻后得到的10K時鍾作為計數器時鍾,並且設置周期為100,這樣在一秒的時間可以產生100次中斷,然后在中斷中改變輸出比較寄存器的值

#define USER_TIM_PSC            7200-1
#define USER_TIM_PERIOD            100-1

中斷中還需使用到一個方向變量,控制輸出比較寄存器在變化到最大和最小時改變增減方向

void USER_TIM_IRQ_HANDLER(void)
{
    if(TIM_GetITStatus(USER_TIM, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(USER_TIM, TIM_IT_Update);
        
        if(pulse_width == 0)
            direction = 0;
        else if(pulse_width == 100)
            direction = 1;
        
        if(direction == 0)
            pulse_width++;
        else
            pulse_width--;
        TIM_SetCompare1(USER_TIM, pulse_width);
    }
}

定時器配置時,選擇輸出比較模式為PWM1,向上計數,該模式下,當計數值小於比較寄存器值時輸出有效電平,而如果是向下計數,則是計數值小於等於比較寄存器時為有效電平,有效電平可由寄存器配置

void mini_tim_config(void)
{
    TIM_TimeBaseInitTypeDef tim_timebase_struct;
    TIM_OCInitTypeDef tim_oc_struct;
    GPIO_InitTypeDef gpio_struct;
    NVIC_InitTypeDef nvic_struct;
    
    GPIO_RCC_CMD(USER_TIM_GPIO_RCC, ENABLE);
    USER_TIM_RCC_CMD(USER_TIM_RCC, ENABLE);
    
    gpio_struct.GPIO_Mode = GPIO_Mode_AF_PP;
    gpio_struct.GPIO_Speed = GPIO_Speed_2MHz;
    gpio_struct.GPIO_Pin = USER_TIM_PIN;
    GPIO_Init(USER_TIM_GPIO, &gpio_struct);
    
    nvic_struct.NVIC_IRQChannel = USER_TIM_IRQ;
    nvic_struct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvic_struct);
    
    TIM_TimeBaseStructInit(&tim_timebase_struct);
    tim_timebase_struct.TIM_CounterMode = TIM_CounterMode_Up;
    tim_timebase_struct.TIM_Prescaler = USER_TIM_PSC;
    tim_timebase_struct.TIM_Period = USER_TIM_PERIOD;
    tim_timebase_struct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInit(USER_TIM, &tim_timebase_struct);
    
    TIM_OCStructInit(&tim_oc_struct);
    tim_oc_struct.TIM_OCMode = TIM_OCMode_PWM1;
    tim_oc_struct.TIM_OCPolarity = TIM_OCPolarity_High;
    tim_oc_struct.TIM_OutputState = TIM_OutputState_Enable;
    tim_oc_struct.TIM_Pulse = pulse_width;
    TIM_OC1Init(USER_TIM, &tim_oc_struct);
    
    TIM_OC1PreloadConfig(USER_TIM, TIM_OCPreload_Disable);
    TIM_ARRPreloadConfig(USER_TIM, ENABLE);
    
    TIM_Cmd(USER_TIM, ENABLE);
    
    TIM_ITConfig(USER_TIM, TIM_IT_Update, ENABLE);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM