打印
[MM32硬件]

【灵动微电子MM32F5330测评】5、PWM实现呼吸灯以及多样的LED控制

[复制链接]
62|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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的循环呼吸;
       效果如下:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:硬件工程师
简介:有着多年硬件开发经验的专业人员,专注于医疗电子领域,热衷于对新鲜事物的探索,喜欢DIY!

122

主题

1007

帖子

4

粉丝