本帖最后由 qintian0303 于 2024-7-3 08:54 编辑
定时器的PWM(脉冲宽度调制,Pulse Width Modulation)输出功能是微控制器中一个非常重要的特性,广泛应用于电机控制、LED亮度调节、音频信号处理等领域,本章节的功能展示主要就是通过LED实现呼吸灯进行的。PWM是一种对模拟信号电平进行数字编码的方法。它通过改变脉冲信号的占空比(即高电平持续时间与周期时间的比值)来模拟不同的电压或电流水平。PWM信号具有固定的频率和可变的占空比,其等效的平均电压与占空比成正比。
定时器的PWM的关键参数:周期(Period)和占空比(Duty Cycle)
一般的配置方法包括使能定时器和相关IO口时钟,初始化GPIO端口,初始化定时器(设置定时器的预分频器(PSC)和自动重装载寄存器(ARR),以确定PWM信号的频率,配置定时器的工作模式为PWM模式,设置PWM输出通道的比较寄存器(CCR)的初始值,以确定PWM信号的初始占空比),使能PWM输出,调整占空比。
4个LED所使用的引脚分别为PB11、PB10、PC7、PC6:
可以通过定时器2和定时器3进行对应PWM通道控制,注意GPIO复用功能对应的AF是不同的,PB11、PB10需要选择AF1,PC7、PC6需要选择AF2。
以定时器2为例,进行初始化:
void MM_TIM2PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
uint32_t TimerPrescaler = 0, Channel3Pulse1 = 0, Channel4Pulse1 = 0;
/* Compute the value to be set in ARR regiter to generate signal frequency at 10 Khz */
TimerPrescaler = TIM_GetTIMxClock(TIM2) /1000 /10000 - 1 ;
printf("\r\n TIM2:%d, 10kHz", TimerPrescaler);
/* TIM2 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);
TIM_TimeBaseStruct.TIM_Prescaler = TimerPrescaler;
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_Period = 999;
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_Div1;
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);
TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 0;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStruct.TIM_Pulse = Channel3Pulse1;
TIM_OC2Init(TIM2, &TIM_OCInitStruct);
TIM_OCInitStruct.TIM_Pulse = Channel4Pulse1;
TIM_OC3Init(TIM2, &TIM_OCInitStruct);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_1); /* TIM2_CH3 */
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_1); /* TIM2_CH4 */
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
// TIM_Cmd(TIM2, ENABLE);
// TIM_CtrlPWMOutputs(TIM2, ENABLE);
}
呼吸灯的实现主要还是通过定时器定时改变TIM_OCInitStruct.TIM_Pulse的值,通过连续的变化实现呼吸的效果,暂定呼吸频率为2s,也就是在定时器中连续变化,结合LED与按键的控制,初步拟定一个多种LED控制的展示操作:
按键1,实现4个LED的同频闪烁;
按键2,实现4个LED的循环点亮;
按键3,实现4个LED的同频呼吸;
按键4,实现4个LED的循环呼吸;
效果如下:
|
呼吸效果不明显