STM32 PWM简介及呼吸灯实验
2017-01-07 16:21
239 查看
1.PWM简介
脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说,就是对脉冲宽度的控制,原理图如下:
![](https://img-blog.csdn.net/20170107162511857?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmFuemh1YW4xMzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当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灯点亮的时间长,显得就亮,反之则暗,
利用依次递增递减就可以实现呼吸的效果。
脉冲宽度调制(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学习-PWM实验
- STM32定时器产生PWM--呼吸灯
- STM32单片机学习(6) PWM输出实验
- 【iCore4 双核心板_ARM】例程八:定时器PWM实验——呼吸灯
- 博客处女篇:stm32之pwm输出实验
- STM32之呼吸灯实验
- cortex_m3_stm32嵌入式学习笔记(九):PWM 输出实验(定时器的PWM输出)
- STM32正点原子MINI板——学习1实验平台简介
- STM32PWM输出实验
- 【iCore3 双核心板】例程八:定时器PWM实验——呼吸灯
- STM32之呼吸灯实验
- STM32互补PWM输出使能控制
- 【连载】STM32开发指南--第四十二章 外部SRAM实验
- STM32简介
- PWM(脉宽调制)——LED特效呼吸灯设计
- STM32 wifi(ESP8266)模块实验
- 基于stm32的遥控小船(三)PWM调速
- S3C2410 实验八—— 脉宽调制(PWM)实验
- STM32开发指南-按键输入实验
- STM32实现任意角度移相全桥PWM