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

STM32定时器产生PWM--呼吸灯

发布时间:2020-05-30 发布时间:
|

说明:本工程代码在STM32F407ZET6上测试通过。


1、PWM定义


Pulse Width Modulation:脉冲宽度调制(PWM)


2、用途


(1)控制输出的电压和电流 

(2)灯光的亮度 

(3)电机控制


3、分析PWM产生与重点


(1)分析PWM产生(看图示PWM) 

(2)区别PWM1与PWM2模式(STM32F4xx中文参考手册 433页) 

(2)高低电平极性区别(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:(PE9引脚复用为TIM14,同时与一个LED灯连接)


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、函数说明


从库函数当中可以截取出相关函数的说明


  * @brief  Initializes the TIMx Channel1 according to the specified parameters in

  *         the TIM_OCInitStruct.

  * @param  TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral.

  * @param  TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure that contains

  *         the configuration information for the specified TIM peripheral.

  * @retval None

  */

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);


//本实验只是用到PWM,所以只需配置该结构体中的三个成员

typedef struct

{

  uint16_t TIM_OCMode;        //PWM1模式或PWM2模式

  uint16_t TIM_OutputState;   //输出是否使能

  uint16_t TIM_OCPolarity;    //输出极性                           

} TIM_OCInitTypeDef;


//改变CCR值

/**

  * @brief  Sets the TIMx Capture Compare1 Register value

  * @param  TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral.

  * @param  Compare1: specifies the Capture Compare1 register new value.

  * @retval None

  */

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1);


6、具体代码


#include "pwm.h"

#include "systick.h"


//TIM14配置

void Pwm_Time14_Init(void)

{

    TIM_OCInitTypeDef       TIM_OCInitStruct;

    GPIO_InitTypeDef        GPIO_InitStruct;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;


    //通用定时器的时钟是APB1(42)*2 = 84MHz

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);


    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_9;

    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_AF;

    GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;

    GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_100MHz;

    GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_UP;

    GPIO_Init(GPIOF, &GPIO_InitStruct);


    //GPIOF9复用映射到TIM14

    GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);


    TIM_TimeBaseInitStruct.TIM_Prescaler     = 84-1;   

    TIM_TimeBaseInitStruct.TIM_Period        = 500-1;  

    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;

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

    //使能TIM14定时器

    TIM_Cmd(TIM14, ENABLE);

}


//呼吸灯

void Led_Breath(void)

{

    uint32_t cnt;

    for(cnt=0; cnt<=500; cnt++)

    {

        TIM_SetCompare1(TIM14,cnt);

        delay_ms(5);

    }

    for(; cnt>0; cnt--)

    {

        TIM_SetCompare1(TIM14,cnt);

        delay_ms(5);

    }

}




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

热门文章 更多
浅谈AVR中定时器几种工作模式