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

      定时器的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的循环呼吸;
       效果如下:


---------------------
作者:qintian0303
链接:https://bbs.21ic.com/icview-3387530-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值