说明:本作者亲测代码在板子上可用。
1、PWM定义
Pulse Width Modulation:脉冲宽度调制(PWM)
脉冲:频率 ,方波
脉冲宽度:占空比,高电平的宽度 :在同一个时间内,高电平所占比例
频率与周期:f = 1/T f:频率(主频) T:周期
2、用途
控制输出的电压和电流
灯光亮度的控制
直流电机速度的控制
3、分析PWM产生与重点
(1)分析PWM产生(看图示PWM)
(2)区别PWM1与PWM2模式(STM32F4xx中文参考手册 433页)
(3)高低电平极性区别(STM32F4xx中文参考手册 457页)
4、PWM库函数开发流程
(1)使能定时器14和相关IO口时钟。
使能定时器14时钟:RCC_APB1PeriphClockCmd();
使能GPIOF时钟:RCC_AHB1PeriphClockCmd ();
(2)初始化IO口为复用功能输出。
函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
(3)GPIOF9复用映射到定时器14
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
(4)初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
(5)初始化输出比较参数:TIM_OC1Init();
(6)使能预装载寄存器: TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
(7)使能自动重装载的预装载寄存器允许位 TIM_ARRPreloadConfig(TIM14,ENABLE);
(8)使能定时器。
(9)不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();
5、具体相关配置代码+超详细注释解释 如下:
void PWM_TIM14_INIT()
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO结构体设置
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; //定时器14结构体设置
TIM_OCInitTypeDef TIM_OCInitStruct; //定时器PWM结构体设置
//使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //LED9 在PF9引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //初始化的复用功能(因为本引脚还要用到PWM输出功能)
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
//复用映射到定时器14
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
//定时器14的配置
TIM_TimeBaseInitStruct.TIM_Prescaler = 84 - 1; //预分频为84分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 500-1; //设置周期为500
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStruct);
//PWM初始化配置
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //模式选择
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; //选择低电平有效
TIM_OC1Init(TIM14,&TIM_OCInitStruct);
//使能预装载寄存器
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
//使能自动重装载寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);
TIM_Cmd(TIM14,ENABLE);
}
int main()
{
PWM_TIM14_INIT();
while(1)
{
//这个函数是控制改变有效电平占总周期的比例(上面写的周期是500),即此时的占空比为100/500 =20%
//意思就是说,可以通过这个数100(不一定是100,可以改变),就可以控制LED的亮度
//呼吸灯就是循环递增或者递减来改变这个值,就有了渐亮到渐灭,再由渐灭到渐亮的效果了。
TIM_SetCompare1(TIM14,100);
}
}