一.呼吸燈原理
????呼吸燈指燈光的亮度隨著時間由暗到亮逐漸增強,再由亮到暗逐漸衰減,很有節奏感地一起一伏,就像是在呼吸一樣,被廣泛應用于手機、電腦、電視等電子設備的指示燈中。
????通過調節PWM占空比實現呼吸燈效果。通過調節定時器的比較寄存器的值,來調節PWM占空比。PWM占空比 = CCR/(ARR+1);ARR:自動裝載寄存器的值 ;CCR: 比較寄存器。
二.實驗過程
????上圖是 RGB 彩燈,里面由紅藍綠三個小燈構成,通過調節PB0引腳的PWM占空比實現綠燈的呼吸燈效果。
三.源代碼
1.bsp_generalpwm.c
#include "bsp_generalpwm.h"
//使用TIM3的 輸出比較通道3 對應的GPIO-PB0初始化
void INIT_GENERAL_GPIO_CONFIG()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PB0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//推免輸出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}/* ---------------- PWM信號 周期和占空比的計算--------------- */
// ARR :自動重裝載寄存器的值
// CLK_cnt:計數器的時鐘,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信號的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)
void INIT_GENERAL_PWM_CONFIG()
{//初始化 TIM_TimeBaseInitTypeDef//開啟定時器時鐘,即內部時鐘CK_INT=72MRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1;//分頻因子TIM_TimeBaseInitStructure.TIM_Period = 100-1;//重載寄存器的值TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計數TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化 TIM_OCInitTypeDefTIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//使用PWM1模式TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//輸出通道電平極性 低電平有效 (即CNT<CCR(比較寄存器)輸出電平)TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//輸出使能TIM_OCInitStructure.TIM_Pulse = 0;//占空比:TIM_Pulse/(Period +1)TIM_OC3Init(TIM3,&TIM_OCInitStructure);//使能計數器TIM_Cmd(TIM3,ENABLE);
}void DELAY_MS(uint32_t value)
{uint32_t i;for(i=value;i>0;i--){}
}
2.main.c
#include "bsp_generalpwm.h"
int main(void)
{ uint8_t i = 0;INIT_GENERAL_GPIO_CONFIG();INIT_GENERAL_PWM_CONFIG();while(1){for(i=0;i<100;i++){TIM_SetCompare3(TIM3,i);//設置輸出比較寄存器(CCR)的值DELAY_MS(0x5FFFF);}for(i=100;i>0;i--){TIM_SetCompare3(TIM3,i);DELAY_MS(0x5FFFF);}}
}
四.實現效果
呼吸燈效果演示
stm32呼吸燈