STM32 PWM之实现呼吸灯
一、简述
记--使用定时器4输出PWM来实现呼吸灯效果。
在人眼辨识能力范围内,调节LED亮的时间,达到LED灯的亮度不同。例:给低电平LED就亮,如果一个脉冲中全是低电平那么LED最亮,如果一个脉冲一半是高电平,一半是低电平,那么LED就显得有点暗,这样调整脉冲中的高低电平的比例就可以达到LED的亮度调节。
例子:链接: https://pan.baidu.com/s/1UEoZCFGvJSwpzSynFv73gA 提取码: 3ipx
二、效果
LED1逐渐由暗变亮,接着由亮变暗。
三、工程结构
四、源文件
main.c文件
#include "stm32f4xx.h"
#include "led.h"
#include "pwm.h"
//粗延时
void delay_ms(int ms)
{
int i,j;
for(i=0; i<ms; i++)
for(j=0; j<10000;j++);
}
//主函数
int main(void)
{
int i;
//中断优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();//初始化LED
Pwm_Init();//设置定时器4输出PWM
while(1)//呼吸灯
{
//从暗到亮
for(i=1; i<499; i++)//定时器4重装载值为499
{
TIM_SetCompare1(TIM14,i);//根据i的值设置比较值,调整占空比
delay_ms(20);//根据实际情况进行调整,方便观察效果
}
//从亮到暗
for(i=499; i>0; i--)
{
TIM_SetCompare1(TIM14,i);
delay_ms(20);
}
}
return 0;
}
pwm.h文件
#ifndef __PWM_H_
#define __PWM_H_
#include "stm32f4xx.h"
void Pwm_Init(void);
#endif
pwm.c文件
#include "pwm.h"
void Pwm_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
//1、使能定时器14时钟:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
//初始化GPIOF组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//2、初始化PF10引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //引脚10 LED1
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //复用
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStruct);
//3、引脚功能映射
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
//4、初始化定时器,配置ARR,PSC。
TIM_TimeBaseInitStruct.TIM_Prescaler = 84-1; //分频系统 84MHZ/84 = 1MHZ 每秒数1000 000数 1us数一个数
TIM_TimeBaseInitStruct.TIM_Period = 500-1; //重装值 500数,用时500us
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStruct);
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式
TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;//输出使能
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; //极性低
TIM_OC1Init(TIM14,&TIM_OCInitStruct);
//5、使能预装载寄存器:
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
//6、使能自动重装载的预装载寄存器允许位
TIM_ARRPreloadConfig(TIM14,ENABLE);
//7、使能定时器。
TIM_Cmd(TIM14,ENABLE);
}
五、总结
5.1 LED亮度调节实现
5.2 相关概念
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
频率 :时钟速度 1GHZ = 1000MHZ = 1000 000 KHZ =1 000 000 000 HZ (如12MHz:1秒12 000 000个脉冲)
占空比:占空比是指在一个脉冲循环内,通电时间(有效电平)相对于一个脉冲总时间所占的比例。(可以简单理解为该高、低电平的占脉冲总时间的比例)
5.3 设置定时器4输出PWM
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //输出使能
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; //极性低,设置低电平为有效状态
TIM_TimeBaseInitStruct.TIM_Period = 500-1; //重装值 500,用时500us
TIM_SetCompare1(TIM14,i);//根据i的值设置比较值,调整占空比