STM32F407ZET6 关于用PWM(做出呼吸灯)详解

来源:互联网 发布:数组是一种对象 编辑:程序博客网 时间:2024/04/28 16:46

说明:本作者亲测代码在板子上可用。

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);    }}