Cortex-M3通用定时器输出PWM控制舵机

这篇博客详细介绍了如何使用STM32 Cortex-M3的通用定时器TIM3输出PWM,以驱动舵机SG90为例,阐述了PWM的工作原理、内部运作机制、模式选择以及配置步骤。内容包括设置捕获比较寄存器、选择PWM模式、配置GPIO和定时器时钟,最后提供了代码示例。
摘要由CSDN通过智能技术生成
  1. 通用定时器输出PWM

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

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

  1. PWM的工作原理

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

①在PWM输出模式下除了CNT(计数器当前值),ARR(自动重装载值),CCRx(捕获/比较寄存器值)。

②当CNT小于CCRx时,TIMx_CHx通道输出低电平

③当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平

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

  1. PWM的内部运作机制

CCR1:设置捕获比较寄存器,设置比较值。

CCMR1寄存区:设置PWM模式1 或者PWM模式2。

CCER: P位:输出/捕获 :设置极性: 0 高电平有效,1 低电平有效

E位:输出/捕获 : 使能端口

  1. PWM的模式

模式一 边沿对齐模式

向上计数时: 当TIMx_CNT<TIMx_CCRx时通道1为有效电平,否则为无效电平;

向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为无效电平,否则为有效电平。

模式二 中央对齐模式

向上计数时: 当TIMx_CNT<TIMx_CCRx时通道1为无效电平,否则为无效电平;

向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为有效电平,否则为无效电平。

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

简单的说:

APER =1 ,ARR立即生效

APER =0,ARR下个周期生效

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

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

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;

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

void TIM_OCxInit                      //结构体初始化
(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_SetCompare1            //设置比较值函数
(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_OC1PreloadConfig     //使能输入比较预装载
(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_Cmd                            //开启定时器
 (TIM_TypeDef* TIMx, FunctionalState NewState)
void TIM_ARRPreloadConfig     //使能自动重装载的预装载寄存器允许位
(TIM_TypeDef* TIMx, FunctionalState NewState);
void TIM_OC1PolarityConfig      //配置修改极性
(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

  1. TIM3 PWM输出 驱动SG90电机 配置过程

TIM3 PWM输出 驱动SG90电机 配置过程:

1.GPIO结构体

2.配置通用定时器结构体

3.配置定时去输出PWM结构体

4.打开时钟 ---> GPIO时钟,TIM定时器时钟,部分重映射时钟

5.配置PWM比较值

  1. SG9O电机硬件接线

红线 : 3.3v/ 5v

黑线 : GND

黄线 : 信号线

  1. GPIO相关结构体及其库函数

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
功能:管脚重映射的配置
参数:
GPIO_Remap:选择要去重映射的管脚
    #define GPIO_Remap_SPI1             ((uint32_t)0x00000001)  /*!< SPI1 Alternate Function mapping */
    #define GPIO_Remap_I2C1             ((uint32_t)0x00000002)  /*!< I2C1 Alternate Function mapping */
    #define GPIO_Remap_USART1           ((uint32_t)0x00000004)  /*!< USART1 Alternate Function mapping */
    #define GPIO_Remap_USART2           ((uint32_t)0x00000008)  /*!< USART2 Alternate Function mapping */
    #define GPIO_PartialRemap_USART3    ((uint32_t)0x00140010)  /*!< USART3 Partial Alternate Function mapping */
    #define GPIO_FullRemap_USART3       ((uint32_t)0x00140030)  /*!< USART3 Full Alternate Function mapping */
    #define GPIO_PartialRemap_TIM1      ((uint32_t)0x00160040)  /*!< TIM1 Partial Alternate Function map
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐的记事本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值