历史上的今天
返回首页

历史上的今天

今天是:2025年02月07日(星期五)

正在发生

2020年02月07日 | 基于STM32单片机高级控制定时器TIM1和TIM8的功能解析

2020-02-07 来源:elecfans

高级控制定时器(TIM1 和TIM8)

TIM1和TIM8定时器的功能包括:

● 16位向上、向下、向上/ 下自动装载计数器

● 16位可编程( 可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535 之间的任意数值

● 多达4个独立通道:

─ 输入捕获

─ 输出比较

─ PWM生成(边缘或中间对齐模式)

─ 单脉冲模式输出

● 死区时间可编程的互补输出

●使用外部信号控制定时器和定时器互联的同步电路

● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器

● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态

● 如下事件发生时产生中断/DMA :

─ 更新:计数器向上溢出/ 向下溢出,计数器初始化(通过软件或者内部/ 外部触发)

─ 触发事件(计数器启动、停止、初始化或者由内部/ 外部触发计数)

─ 输入捕获

─ 输出比较

─ 刹车信号输入

● 支持针对定位的增量(正交)编码器和霍尔传感器电路

● 触发输入作为外部时钟或者按周期的电流管理

通用定时器(TIMx)

通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:

● 16位向上、向下、向上/ 向下自动装载计数器

● 16位可编程( 可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536 之间的任意数值

● 4个独立通道:

─ 输入捕获

─ 输出比较

─ PWM生成(边缘或中间对齐模式)

─ 单脉冲模式输出

● 使用外部信号控制定时器和定时器互连的同步电路

● 如下事件发生时产生中断/DMA :

─ 更新:计数器向上溢出/ 向下溢出,计数器初始化(通过软件或者内部/ 外部触发)

─ 触发事件(计数器启动、停止、初始化或者由内部/ 外部触发计数)

─ 输入捕获

─ 输出比较

● 支持针对定位的增量(正交)编码器和霍尔传感器电路

● 触发输入作为外部时钟或者按周期的电流管理

基本定时器(TIM6 和TIM7)

TIM6和TIM7定时器的主要功能包括:

● 16位自动重装载累加计数器

● 16位可编程( 可实时修改)预分频器,用于对输入的时钟按系数为1~65536 之间的任意数值

分频

● 触发DAC的同步电路

● 在更新事件(计数器溢出)时产生中断/DMA 请求

STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16 位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。

基于STM32单片机高级控制定时器TIM1和TIM8的功能解析

注意单元模块时钟总线

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。STM32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出!


要使STM32的通用定时器TIMx产生PWM输出,除了定时器介绍的寄存器外,我们还会用到3 个寄存器,来控制PWM 的。这三个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。


TIM3_CH2默认是接在PA7面的,而我们的DS0接在PB5上面,如果普通MCU,可能就只能用飞线把PA7飞到PB5上来实现了,不过,我们用的是STM32,它比较高级,可以通过重映射功能,把TIM3_CH2映射到PB5上。 STM32的重映射控制是由复用重映射和调试IO 配置寄存器(AFIO_MAPR)控制的。

基于STM32单片机高级控制定时器TIM1和TIM8的功能解析

1)开启TIM3时钟以及复用功能时钟,配置PB5为复用输出。

要使用TIM3,我们必须先开启TIM3的时钟,还要配置PB5为复用输出,这是因为TIM3_CH2通道将重映射到PB5上,此时,PB5属于复用功能输出。

库函数使能TIM3时钟的方法是:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟

库函数设置AFIO时钟的方法是:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用时钟使能

设置PB5为复用功能输出的方法:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

2)设置TIM3_CH2重映射到PB5上。

因为TIM3_CH2默认是接在PA7上的,所以我们需要设置TIM3_REMAP为部分重映射(通过AFIO_MAPR配置),让TIM3_CH2重映射到PB5上面。在库函数函数里面设置重映射的函数是:

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalStateNewState);

STM32重映射只能重映射到特定的端口。第一个入口参数可以理解为设置重映射的类型,比如TIM3部分重映射入口参数为 GPIO_PartialRemap_TIM3,这点可以顾名思义了。所以TIM3部分重映射的库函数实现方法是: GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

3)初始化TIM3,设置TIM3的ARR和PSC。

在开启了TIM3的时钟之后,我们要设置ARR和PSC两个寄存器的值来控制输出PWM的周期。当PWM周期太慢(低于50Hz)的时候,我们就会明显感觉到闪烁了。因此,PWM周期在这里不宜设置的太小。这在库函数是通过TIM_TimeBaseInit函数实现的,在上一节定时器中断章节我们已经有讲解,这里就不详细讲解,调用的格式为:

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的

4)设置TIM3_CH2的PWM模式,使能TIM3的CH2输出。

接下来,我们要设置TIM3_CH2为PWM模式(默认是冻结的),因为我们的DS0是低电平亮,而我们希望当CCR2的值小的时候,DS0就暗,CCR2值大的时候,DS0就亮,所以我们要通过配置TIM3_CCMR1的相关位来控制TIM3_CH2的模式。在库函数中,PWM通道设置是通过函数TIM_OC1Init()~TIM_OC4Init()来设置的,不同的通道的设置函数不一样,这里我们使用的是通道2,所以使用的函数是TIM_OC2Init()。

void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

5)使能TIM3。

在完成以上设置了之后,我们需要使能TIM3。使能TIM3的方法前面已经讲解过:  TIM_Cmd(TIM3, ENABLE); //使能TIM3

6)修改TIM3_CCR2来控制占空比。

最后,在经过以上设置之后,PWM其实已经开始输出了,只是其占空比和频率都是固定的,而我们通过修改TIM3_CCR2则可以控制CH2的输出占空比。继而控制DS0的亮度。 在库函数中,修改TIM3_CCR2占空比的函数是:

void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); 理所当然,对于其他通道,分别有一个函数名字,函数格式为TIM_SetComparex(x=1,2,3,4)。

通过以上6个步骤,我们就可以控制TIM3的CH2输出PWM波了。

推荐阅读

史海拾趣

Gilway Technical Lamp公司的发展小趣事
检查压缩机与电气控制电路之间的连接是否牢固可靠,有无松动或脱落现象。
安森德(Ascend)公司的发展小趣事

安森德公司自创立之初,便以技术创新为核心竞争力。在半导体工艺领域,公司研发团队不断攻坚克难,成功研发出具有自主知识产权的超结MOSFET技术。这一技术的导通损耗和开关损耗均达到行业领先水平,为电源设备带来了更高的效率和更低的能源消耗。凭借这一技术突破,安森德的产品迅速在市场上获得认可,为公司的快速发展奠定了坚实基础。

Denyo Europa Gmbh公司的发展小趣事

Denyo Europa Gmbh公司始终认为企业是社会的一部分,应该承担起相应的社会责任。公司积极参与各种公益活动,为当地社区的发展贡献力量;同时,公司还关注弱势群体的需求,为他们提供力所能及的帮助。这种对社会责任的担当精神,使公司在社会中树立了良好的企业形象。

Fujitsu America公司的发展小趣事

随着云计算技术的兴起,Fujitsu America紧跟时代潮流,积极推动云计算服务的全球化布局。公司凭借其强大的技术实力和丰富的行业经验,为北美乃至全球的企业客户提供了一站式的云计算解决方案和服务。Fujitsu America的云计算服务不仅涵盖了基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)等多个层面,还注重与客户的深度合作,根据客户的实际需求提供定制化的解决方案,帮助客户实现数字化转型和业务升级。

Advanced Thermal Solutions公司的发展小趣事

为了进一步扩大市场份额,ATS开始实施全球化战略。公司先后在北美、欧洲和亚洲等地设立了分公司或办事处,以便更好地服务全球客户。同时,ATS还积极参与国际展览和交流活动,与全球各地的合作伙伴建立紧密的合作关系。这些举措使ATS的产品和服务得以覆盖更广泛的地域,公司的知名度和影响力也不断提升。

FARNELL公司的发展小趣事

FARNELL公司成立于1937年,由创始人在英国利兹创建。起初,公司专注于电子元器件的分销,凭借其优质的产品和可靠的供货能力,逐渐在电子行业中崭露头角。在那个时代,电子产品正处于快速发展阶段,FARNELL公司凭借其前瞻性的市场洞察力和灵活的供应策略,赢得了众多客户的信赖。

问答坊 | AI 解惑

麻烦推荐个运放,能测出1mV左右电压,失真比较小~~

本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata   麻烦推荐个运放,能测出1mV左右电压,失真比较小 用OP07可以不? …

查看全部问答>

KEIL下LPC1114代码运行问题

用keil编码1114的i2c,我在设置了编译优化选项之后出现了巨大的问题。索性,在取消掉所有的优化选项后i2c通信已经正常。   可惜结果仍然不正确,我就跟代码。这时候才发现一个无法理解的问题。我在funcA()里调用funcB()时传入一个静态myVar ...…

查看全部问答>

疑问

   大家好,我现在跟同学一起做一个有关嵌入式的东西,就是想让平台上的图像在触摸屏幕上显示出来,用软件来实现 希望大家能多多指导!!…

查看全部问答>

有关CDMA模块的AT指令问题

如题,公司用的是ANTDATA公司出的DTGS-800模块,虽然也带有文档说明,但我觉得不够详细,所以特来发帖提问,希望大家踊跃发言,问题如下: 1、读取短信的时候,怎样才能不改变短信的状态呢?例如,执行了以下AT命令 AT+UGSM=1 返回OK(DTGS-800支 ...…

查看全部问答>

求助:PWM输出8.2KHZ1:1的方波,为什么在4.3K有个的很强频率分量

设置如下: unsigned short pwmizhouqi=256;   LPC_TMR16B1->TCR = 0;      LPC_SYSCON->SYSAHBCLKCTRL |= (1PIO1_9 = 0X01;   LPC_TMR16B1->MR0 = pwmizhouqi/2;       LPC ...…

查看全部问答>

求教

MSP430f2XX  系列单片机能不能用并口JTAG下载程序?一定要用USB  二线制的吗?谢谢…

查看全部问答>

LaunchPad调试nrf24l01--续

原帖不能编辑了,就新开一帖在这里,望斑竹谅解   目前为止,基于launchpad和nrf24l01的单向收发已经实现,程序在下面放出,还有很多要改进的,仅供参考。欢迎高手拍砖。   学习经历: 1.收到板子后查了下资料,发现很丰富啊,于是 ...…

查看全部问答>

单片机编程

http://wenku.baidu.com/view/eeb3310d6c85ec3a87c2c586.html…

查看全部问答>

MPLAB IDE和PICC编译问题。

我用的是MPLAB ICE和PICC编译PIC16F722,之前编译什么的都没问题,重装系统后再安装后就再也编译不成功了,提示No installed compiler driver supports device 16F722。 编译PIC16F505没有问题。每次点Project-Select Language Toolsuite后HI-TECH ...…

查看全部问答>