STM32-PWM(Pulse Width Modulation脉冲宽度调制)之呼吸灯的实现

  • Post author:
  • Post category:其他


一、PWM概述:

脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。

其实是通过改变占空比(一个周期高电平占比)来实现对模拟电路的实现。

二、实现呼吸灯

步骤:

(1)使能TIM计时器与对应的GPIO引脚时钟;

(2)初始化定时器及TIM输出通道(配置PWM极性);

(3)使能计时器,装载寄存器,自动重装载寄存器;

(4)通过改变比较寄存器实现呼吸灯效果;

三、部分关键代码:

此处例子使用STM32F407 LED0灯

void Breath_LED_Init(void)

{


GPIO_InitTypeDef GPIO_InitStruct;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

TIM_OCInitTypeDef TIM_OCInitStruct;

//初始化时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);  //TIM14
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //GPIOF 口

//初始化GPIO口
GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_AF; //复用功能
GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;//推挽
GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_9;
GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_100MHz ;
GPIO_Init(GPIOF,&GPIO_InitStruct); 

 //复用 将 PF9 引脚复用为 TIM14 的特殊引脚
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9, GPIO_AF_TIM14);

//初始化计时器
TIM_TimeBaseInitStruct.TIM_ClockDivision  = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode    = TIM_CounterMode_Up ;//向上计数
TIM_TimeBaseInitStruct.TIM_Period         = 500-1;               //计数周期(计数次数)
TIM_TimeBaseInitStruct.TIM_Prescaler      = 84-1;                 //定时器分频
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct);

//初始化TIM输出通道
TIM_OCInitStruct.TIM_OCMode        = TIM_OCMode_PWM1;   //模式选择
//110: PWM 模式 1——只要 TIMx_CNT < TIMx_CCR1,通道 1 便为有效状态(高电平),否则为无效状态(低电平)。
//111: PWM 模式 2——只要 TIMx_CNT < TIMx_CCR1,通道 1 便为无效状态(低电平),否则为有效状态(高电平)。
TIM_OCInitStruct.TIM_OutputState   = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity    = TIM_OCPolarity_High;//TIM_OCPolarity_Low;  //输出极性
TIM_OC1Init(TIM14, &TIM_OCInitStruct);

//使能与装载寄存器
TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);
//使能自动重新装在寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);
//使能计时器
TIM_Cmd(TIM14,ENABLE);

}

通过使用 TIM_SetCompare1(TIMx,TIM_Period); //设置比较寄存器的值来实现呼吸灯的效果



版权声明:本文为weixin_42443025原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。