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

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

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);
    }
}
  • 14
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值