STM32——PWM实战例子+精炼讲解

例子:
使用定时器14的PWM功能,输出占空比可变的PWM波,用来驱动LED灯,从而达到LED【PF9]亮度由暗变亮,又从亮变暗,如此循环。

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. 使能定时器,TIM_Cmd()。

  9. 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();

PWM最核心的两个步骤为 初始化定时器和初始化输出比较参数。下面我将具体的讲解这连个步骤中重要参数的含义。

(预备知识)PWM工作过程
STM32——PWM实战例子+精炼讲解_第1张图片
初始化定时器

我们初始化定时器中重要的两个参数是arr,psc。而这两个参数已经被用到TIMX_PWM_Init(u32 arr,u32 psc)上啦。

arr:自动重装载值
简单来讲就是在完成一个周期后,我们将CNT的数值设定为多少?而这个值就是arr。

psc:分频系数
简单来讲就是将我们的时钟频率缩小(psc+1)倍。

频率计算公式:
f = 对应的时钟频率/((arr+1)(psc+1))

注:对应的时钟频率是要看你的定时器所对应的时钟啦

以下为F407的定时器时钟确定规则:
STM32——PWM实战例子+精炼讲解_第2张图片
(特别提醒:例如写着是定时器14的且APB1,但是它的时钟是等于APB2的时钟de)

初始化输出比较参数

typedef struct
{
uint16_t TIM_OCMode; //PWM模式1或者模式2
uint16_t TIM_OutputState; //输出使能 OR失能

uint16_t TIM_OutputNState;
uint16_t TIM_Pulse; //比较值,写CCRx
uint16_t TIM_OCPolarity; //比较输出极性

uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;

一般PWM配置,只用到结构体中的四个参数。

TIM_OCMode:
模式一:当CNT小于CCRx时,才为有效电平。
模式二:当CNT小于CCRx时,才为有效电平。

TIM_OutputState
设置输出使能

TIM_Pulse:
设置CCRx的值

TIM_OCPolarity:
输出比较极性高:把有效电平输出出来变成了高电平
输出比较极性低:把有效电平输出出来变成了低电平

你可能感兴趣的:(STM32)