目录
1.通用定时器输出PWM
2.PWM的工作原理
3.PWM的内部运作机制
4.PWM的模式
41.边沿对齐模式
5.自动加载的预加载寄存器
6.定时器输出PWM结构体讲解
7.定时器输出PWM库函数讲解
8.定时器输出PWM----实战驱动SG90舵机
1.通用定时器输出PWM
以TIM3为例,STM32的通用定时器fefe分为TIM2、TIM3、TIM4、TIM5,每个定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出单脉冲模式输出等。
STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM波输出,高级定时器TIM1、TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32可以最多输出30路PWM输出!
2.PWM的工作原理
以向上计数为例,讲述PWM原理:
- 在PWM输出模式下除了CNT(计数器当前值),ARR(自动重装载值),CCRx(捕获/比较寄存器值)。
- 当CNT小于CCRx时,TIM_CHx通道输出低电平。
- 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平
所谓脉宽调制信号(PWM波),就是一个TIMx_ARR自动重装载值寄存器确定频率(由它决定PWM周期),TIM_CCRx寄存器确定占空比信号。
3.PWM的内部运作机制
CCR1:设置捕获比较寄存器,设置比较值。CCMR1寄存区:设置PWM模式1或者PWM模式2。CCER:P位:输出捕获:设置极性:0高电平有效,1低电平有效 E位:输出捕获:使能端口
4.PWM的模式
41.边沿对齐模式
- 向上计数时:当TIMx_CNT(计数器当前值) < TIMx_CCRx(捕获/比较寄存器值)时通道1为有效电平,否则为无效电平;
- 向下计数时:当TIMx_CNT(计数器当前值) > TIMx_CCRx(捕获/比较寄存器值)时通道1为无效电平,否则为有效电平;
5.自动加载的预加载寄存器
简单来说:
APER = 1,ARR立即生效;
APER = 0,ARR下个周期生效;
6.定时器输出PWM结构体讲解
typedef struct
{
uint16_t TIM_OCMode; //配置PWM1/PWM2
uint16_t TIM_OutputState; //配置输出使能 / OR失能
uint16_t TIM_OutputNState;
uint16_t TIM_Pulse; //配置比较值
uint16_t TIM_OCPolarity; //比较输出极性
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;
7.定时器输出PWM库函数讲解
//结构体初始化
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
//设置比较值函数
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
//使能输入比较预载值
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
//使能自动重装载的预装载寄存器允许位
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
//配置修改极性
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
8.定时器输出PWM----实战驱动SG90舵机
- GPIO结构体
- 配置通用定时器结构体
- 配置定时去输出PWM结构体
- 打开时钟 ---->GPIO时钟,TIM定时器时钟,部分重映射时钟
- 配置PWM比较值