目录

1.通用定时器输出PWM

2.PWM的工作原理

3.PWM的内部运作机制

4.PWM的模式

41.边沿对齐模式

5.自动加载的预加载寄存器

6.定时器输出PWM结构体讲解

7.定时器输出PWM库函数讲解

8.定时器输出PWM----实战驱动SG90舵机


ESP32UART打印输出的实验总结 esp32pwm输出_ESP32UART打印输出的实验总结

1.通用定时器输出PWM

ESP32UART打印输出的实验总结 esp32pwm输出_单片机_02

以TIM3为例,STM32的通用定时器fefe分为TIM2、TIM3、TIM4、TIM5,每个定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出单脉冲模式输出等。

STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM波输出,高级定时器TIM1、TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32可以最多输出30路PWM输出!

2.PWM的工作原理

ESP32UART打印输出的实验总结 esp32pwm输出_stm32_03

以向上计数为例,讲述PWM原理:

  1. 在PWM输出模式下除了CNT(计数器当前值),ARR(自动重装载值),CCRx(捕获/比较寄存器值)。
  2. 当CNT小于CCRx时,TIM_CHx通道输出低电平。
  3. 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平

所谓脉宽调制信号(PWM波),就是一个TIMx_ARR自动重装载值寄存器确定频率(由它决定PWM周期),TIM_CCRx寄存器确定占空比信号。

3.PWM的内部运作机制

ESP32UART打印输出的实验总结 esp32pwm输出_嵌入式硬件_04

CCR1:设置捕获比较寄存器,设置比较值。CCMR1寄存区:设置PWM模式1或者PWM模式2。CCER:P位:输出捕获:设置极性:0高电平有效,1低电平有效                                                                 E位:输出捕获:使能端口

4.PWM的模式

41.边沿对齐模式

ESP32UART打印输出的实验总结 esp32pwm输出_嵌入式硬件_05

  1. 向上计数时:当TIMx_CNT(计数器当前值) < TIMx_CCRx(捕获/比较寄存器值)时通道1为有效电平,否则为无效电平;
  2. 向下计数时:当TIMx_CNT(计数器当前值) > TIMx_CCRx(捕获/比较寄存器值)时通道1为无效电平,否则为有效电平;

ESP32UART打印输出的实验总结 esp32pwm输出_嵌入式硬件_06

ESP32UART打印输出的实验总结 esp32pwm输出_寄存器_07

5.自动加载的预加载寄存器

ESP32UART打印输出的实验总结 esp32pwm输出_stm32_08

简单来说:

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舵机

  1. GPIO结构体
  2. 配置通用定时器结构体
  3. 配置定时去输出PWM结构体
  4. 打开时钟 ---->GPIO时钟,TIM定时器时钟,部分重映射时钟
  5. 配置PWM比较值