×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-01 发布时间:
|

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


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

    }

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项