STM32 PWM简介及呼吸灯实验

来源:互联网 发布:单片机芯片型号 编辑:程序博客网 时间:2024/04/28 11:47

1.PWM简介

脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说,就是对脉冲宽度的控制,原理图如下:


当CNT<CCRx时,输出0,反之,则输出1。因此可以输出如上的PWM示意图。当CNT达到CCRx时,重新归零,然后再向上计数,依次循环。通过改变CCRx的值,就可以改变PWM的输出占空比,改变ARR的值,就可以改变PWM输出的频率,这就是PWM输出的原理。

这里我们使用STM32F4的TIM14的CH1产生一路PWM输出。

值得一提的是控制PWM的三个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2),捕获/比较使能寄存器(TIMx_CCER),捕获/比较寄存器(TIMx_CCR1~4)。这三个寄存器针对不同的定时器不同的输出模式设置各不相同,具体可参见STM32中文参考手册16节

使用PWM与使用定时器的功能实际上使类似的。

1)开启TIM14和GPIO时钟,配置PF9选择复用功能AF9(TIM14)输出。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器 14
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 


2)初始化TIM14,设置TIM14的ARR和PSC等参数。

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx

3)设置TIM14_CH1的PWM模式,使能TIM14的CH1输出。

在库函数中,PWM通道的设置是通过函数TIM_OC1Init()~TIM_OC4Init()来设置的,不同的通道设置不一样,这里我们使用的是通道1,所以使用的函数是TIM_OC1Init()。

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //
选择模式PWM
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //
比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性低
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设 TIM1 4OC1

4)使能TIM14.

TIM_Cmd(TIM14, ENABLE); //使能TIM14

5)修改TIM14_CCR1来控制占空比。

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare2)

2.呼吸灯设计


通过程序我们可以看到,我们通过修改led0pwmval的值来改变占空比,来实现呼吸灯。当占空比高的时候,LED灯点亮的时间长,显得就亮,反之则暗,
利用依次递增递减就可以实现呼吸的效果。

0 0
原创粉丝点击