电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
电机控制基础——定时器基础知识与PWM输出原理
分 享
扫描二维码分享
电机控制基础——定时器基础知识与PWM输出原理
单片机
定时器
PWM
码农爱学习
关注
发布时间: 2021-02-20
丨
阅读: 1228
单片机开发中,电机的控制与定时器有着密不可分的关系,无论是直流电机,步进电机还是舵机,都会用到定时器,比如最常用的有刷直流电机,会使用定时器产生PWM波来调节转速,通过定时器的正交编码器接口来测量转速等。 本篇先介绍**定时器的基础知识**,然后对照这些知识介绍一下**定时器输出PWM的基本原理**,以及**编程实现与代码分析**。 首先来看一下定时器的基础介绍。 # 1 定时器基础知识 ## 1.1 定时器种类 以STM32F4为例,一共有14个定时器: - 高级定时器(TIM1、TIM8) - 通用定时器(TIM2~TIM5,TIM9~TIM14) - TIM2~TIM5(通用定时器里功能较多的) - TIM9/TIM12 - TIM10/TIM11和TIM13/TIM14 - 基本定时器 (TIM6、TIM7) ![](https://cf05.ickimg.com/bbsimages/202102/a3e32010d8e450ef35d13cb242d959e9.png) ## 1.2 各种定时器的特性 ### 1.2.1 高级定时器与通用定时器 这里列举高级定时器的特性,在此基础上,对比添加其与通用定时器的不同之处: - 16 位递增、递减、递增/递减自动重载计数器(**TIM2 和 TIM5为32位**) - 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 到 65536 之间。 - 多达 4 个独立通道(**TIM9/TIM12有2个,TIM10/TIM11,TIM13/TIM14只有1个**),可用于: - 输入捕获 - 输出比较 - PWM 生成(边沿和中心对齐模式)(**高级定时器和TIM2~TIM5特有,其它是只有边沿对齐模式**) - 单脉冲模式输出 - 带可编程死区的互补输出(**高级定时器特有**)。 - 使用外部信号控制定时器且可实现多个定时器互连的同步电路(**TIM10/TIM11,TIM13/TIM14没有**)。 - 重复计数器,用于仅在给定数目的计数器周期后更新定时器寄存器(**高级定时器特有**)。 - 用于将定时器的输出信号置于复位状态或已知状态的断路输入(**高级定时器特有**)。 - 发生如下事件时生成中断/DMA 请求: - 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发) - 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)(**TIM10/TIM11和TIM13/TIM14没有此功能**) - 输入捕获 - 输出比较 - 断路输入(**高级定时器特有**) - 支持定位用增量(正交)编码器和霍尔传感器电路(**高级定时器和TIM2~TIM5特有**)。 - 外部时钟触发输入或逐周期电流管理(**高级定时器和TIM2~TIM5特有**)。 ### 1.2.2 基本定时器 基本定时器 (TIM6、TIM7)的功能比较单一,所具有的功能如下: - 16 位自动重载递**增计**数器 - **只能定时,没有外部 IO** - 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于 1 和 65536 之间 - 用于**触发 DAC 的同步电路** - 发生如下更新事件时会生成中断/DMA 请求:计数器上溢 ## 1.3 定时器使用配置 使用定时器,一般需要配置如下: - 时基:也就是计数器的计数时钟 - 自动重装载值:每次计数的最大值 - 输出通道:当需要使用定时器输出某种波形时(如PWM) - 输入通道:当需要使用定时器接收某种波形时(如电机编码器信号) 先来看一下**定时器的原理框图**,对定时器的内部原理有一个整体直观的感受: ![](https://cf05.ickimg.com/bbsimages/202102/42c7d920d3d0ae0d4f282b98158d00de.png) ### 1.3.1 时钟源 从上图可以看出,计数器的时钟源可以为: - 由RCC的内部时钟分频得到 - 由定时器的`TIMx_ETR`引脚得到 - 由其他定时器通过TRGO输出得到 一般使用RCC的内部时钟`CK_INT`,也即定时器时钟`TIMxCLK`,经APB1或APB2预分频器后分频提供。 关于定时器时钟源的具体细节,可以来看一下**STM32F4的时钟树**: ![](https://cf05.ickimg.com/bbsimages/202102/0acaa12ab7e3acb33cd080a2de3b97bc.png) 从STM32F4的内部时钟树可知: - 高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是**APB2总线(84MHZ)** - 通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是**APB1总线(42MHZ)** 另外: - 当APB1和APB2**分频数为1**的时候,各定时器的时钟就是对应的APB1或APB2的时钟; - 如果APB1和APB2**分频数不为1**,那么各定时器的时钟就是对应的APB1或APB2的时钟的**2倍**; 由于库函数中 APB1 预分频的系数默认是 2,所以,所以TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即**168MHz**,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即**84MHz**。 ### 1.3.2 计数器时钟 由于定时器时钟的提供的可以频率较高,计数器不需要这么高的频率来计数,所以会进行降频,使用一个合适的低频时钟来计数。 定时器时钟经过**PSC 预分频器**之后,即 `CK_CNT`,用来驱动计数器计数。PSC 是一个16 位的预分频器,可以对定时器时钟`TIMxCLK` 进行 1~65536 之间的任何一个数进行分频。 具体计算方式为:`CK_CNT=TIMxCLK/(PSC+1)`。 比如,使用STM32F4的通用定时器2(TIM2CLK为APB1的时钟的两倍即**84MHz**),PSC设置为83,则计数时钟为`84MHz/(83+1)=1MHz`,即1ms计一个数。 ### 1.3.3 计数器 计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到**自动重装载寄存器**的时候产生更新事件,并清零从头开始计数。 ### 1.3.4 自动重装载寄存器 自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的,定时器就产生溢出中断。 # 2 定时器输出PWM原理 如下图是PWM输出的原理示意图: 假设定时器工作模式设置为向上计数 PWM模式,且当 CNT
=CCRx 时输出 0,则: - 当 CNT 值小于 CCRx 的时候, IO 输出高电平 (1) - 当 CNT 值大于等于 CCRx 的时候,IO 输出低电平 (0) - 当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。 > 因此,改变 CCRx 的值,就可以改变 PWM 输出的**占空比**,改变 ARR 的值,就可以改变 PWM 输出的**周期(频率)**,这就是利用定时器输出PWM 的基本原理。 ![](https://cf05.ickimg.com/bbsimages/202102/6948701c8794a82ee87509195f2fbf80.png) # 3 定时器常用的寄存器 使用定时器来输出PWM时,需要对其寄存器进行相应的设置。定时器的寄存器有好多个,这里先介绍几个与输出PWM相关的几个寄存器,其它是寄存器以后用到时再介绍。 ## 3.1 控制寄存器CR1 控制寄存器,就是来设置定时的工作模式: ![](https://cf05.ickimg.com/bbsimages/202102/e8c392f4b0a86bfcd0b0bc640572dcf3.png) - 位 15:10 保留,必须保持复位值。 - 位 9:8 **CKD**:时钟分频 (Clock division) 此位域指示定时器时钟 (CK_INT) 频率与数字滤波器所使用的采样时钟(ETR、TIx)之间的分频比, - 位 7 **ARPE**:自动重载预装载使能 (Auto-reload preload enable) - 0:TIMx_ARR 寄存器不进行缓冲 - 1:TIMx_ARR 寄存器进行缓冲 - 位 6:5 **CMS**:中心对齐模式选择 (Center-aligned mode selection),包括1种边沿对齐模式与3种中心对齐模式 - 位 4 **DIR**:计数器方向 (Direction),0为**递增计数**,1为**递减计数**。 注: 当定时器配置为**中心对齐**模式或**编码器**模式时,该位为只读状态。 - 位 3 **OPM**:单脉冲模式 (One-pulse mode) - 位 2 URS:更新请求源 (Up
date request source) 此位由软件置 1 和清零,用以选择 UEV 事件源。 - 位 1 UDIS:更新禁止 (Compare1(TIM3,led0pwmval); /@@*CCR 修改比较值(占空比)*/ } ``` # 5 测试效果 将程序下载到板子,我用的一块STM32F407的板,A6引脚上接了一个LED灯,实际效果的LED逐渐变亮,再逐渐变暗,依次循环。 再通过逻辑分析仪来查看实际的输出波形,如下图,测得的pwm周期0.5ms(频率2kHz),与软件中设定的一致。 在某一时刻,脉宽55us。 ![](https://cf05.ickimg.com/bbsimages/202102/3d8b712f86cedc9cf3033cd041cc833a.png) 在另一时刻,脉宽0.365ms,即实现了PWM脉宽的动态调整。 ![](https://cf05.ickimg.com/bbsimages/202102/fe462fa404513fdfa0f75bb994b817ba.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
码农爱学习
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交