单片机开发中,电机的控制与定时器有着密不可分的关系,无论是直流电机,步进电机还是舵机,都会用到定时器,比如最常用的有刷直流电机,会使用定时器产生PWM波来调节转速,通过定时器的正交编码器接口来测量转速等。
本篇先介绍定时器的基础知识,然后对照这些知识介绍一下定时器输出PWM的基本原理,以及编程实现与代码分析。
首先来看一下定时器的基础介绍。
以STM32F4为例,一共有14个定时器:
gaoji定时器(TIM1、TIM8)
通用定时器(TIM2~TIM5,TIM9~TIM14)
TIM2~TIM5(通用定时器里功能较多的)
TIM9/TIM12
TIM10/TIM11和TIM13/TIM14
基本定时器 (TIM6、TIM7)
1.2 各种定时器的特性1.2.1 gaoji定时器与通用定时器这里列举gaoji定时器的特性,在此基础上,对比添加其与通用定时器的不同之处:
16 位递增、递减、递增/递减自动重载计数器(TIM2 和 TIM5为32位)
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 到 65536 之间。
多达 4 个独立通道(TIM9/TIM12有2个,TIM10/TIM11,TIM13/TIM14只有1个),可用于:
输入捕获
输出比较
PWM 生成(边沿和中心对齐模式)(gaoji定时器和TIM2~TIM5特有,其它是只有边沿对齐模式)
单脉冲模式输出
带可编程死区的互补输出(gaoji定时器特有)。
使用外部信号控制定时器且可实现多个定时器互连的同步电路(TIM10/TIM11,TIM13/TIM14没有)。
重复计数器,用于仅在给定数目的计数器周期后更新定时器寄存器(gaoji定时器特有)。
用于将定时器的输出信号置于复位状态或已知状态的断路输入(gaoji定时器特有)。
发生如下事件时生成中断/DMA 请求:
更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)(TIM10/TIM11和TIM13/TIM14没有此功能)
输入捕获
输出比较
断路输入(gaoji定时器特有)
支持定位用增量(正交)编码器和霍尔传感器电路(gaoji定时器和TIM2~TIM5特有)。
外部时钟触发输入或逐周期电流管理(gaoji定时器和TIM2~TIM5特有)。
1.2.2 基本定时器基本定时器 (TIM6、TIM7)的功能比较单一,所具有的功能如下:
16 位自动重载递增计数器
只能定时,没有外部 IO
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间
用于触发 DAC 的同步电路
发生如下更新事件时会生成中断/DMA 请求:计数器上溢
1.3 定时器使用配置使用定时器,一般需要配置如下:
时基:也就是计数器的计数时钟
自动重装载值:每次计数的最大值
输出通道:当需要使用定时器输出某种波形时(如PWM)
输入通道:当需要使用定时器接收某种波形时(如电机编码器信号)
先来看一下定时器的原理框图,对定时器的内部原理有一个整体直观的感受: