您的位置:首页 > 其它

STM32 PWM简介及呼吸灯实验

2017-01-07 16:21 239 查看
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.呼吸灯设计

int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组 2
delay_init(168); //初始化延时函数
uart_init(115200);//初始化串口波特率为 115200
TIM14_PWM_Init(500-1,84-1); //定时器时钟为 84M,分频系数为 84,所以计数频率
//为 84M/84=1Mhz,重装载值 500,所以 PWM 频率为 1M/500=2Khz.
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;//dir==1 led0pwmval 递增
else led0pwmval--; //dir==0 led0pwmval 递减
if(led0pwmval>300)dir=0;//led0pwmval 到达 300 后,方向为递减
if(led0pwmval==0)dir=1; //led0pwmval 递减到 0 后,方向改为递增
TIM_SetCompare1(TIM14,led0pwmval); //修改比较值,修改占空比
}
}


通过程序我们可以看到,我们通过修改led0pwmval的值来改变占空比,来实现呼吸灯。当占空比高的时候,LED灯点亮的时间长,显得就亮,反之则暗,
利用依次递增递减就可以实现呼吸的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STM32 PWN 呼吸灯