历史上的今天
返回首页

历史上的今天

今天是:2025年08月18日(星期一)

正在发生

2020年08月18日 | 【STM32】HAL库 STM32CubeMX教程八---定时器输入捕获

2020-08-18 来源:eefocus

前言:

本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用

 

所用工具:

1、芯片: STM32F407ZET6/ STM32F103ZET6

2、STM32CubeMx软件

3、IDE: MDK-Keil软件

4、STM32F1xx/STM32F4xxHAL库 

知识概括:

通过本篇博客您将学到:

PWM工作原理

STM32CubeMX创建PWM例程

HAL库定时器PWM函数库

PWM创建呼吸灯

 

什么是PWM

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

 

PWM工作原理

SMT32F1系列共有8个定时器:

高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。

SMT32F4系列共有15个定时器:

高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定时器(TIM6、TIM7)。

 

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

STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出

原理讲解:

下图为向上计数模式:


  • 在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。

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

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

PWM的一个周期

  •     定时器从0开始向上计数

  •     当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平

  •     t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平

  •     当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程

  •     至此一个PWM周期完成

总结:

每个定时器有四个通道,每一个通道都有一个捕获比较寄存器, 

将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号)

 

TIMx_ARR寄存器确定PWM频率,

TIMx_CCRx寄存器确定占空比

 

详解:

若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。

 

如果初学者,看标注的红色字体,就大体可以理解

PWM的工作模式:

  • PWM模式1(向上计数)  :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件   

  • PWM模式2(向下计数)  :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件   

设置寄存器TIMx_CCMR1的OC1M[2:0]位来确定PWM的输出模式:

  • PWM模式1:在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

  • PWM模式2:在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。

 

  在两种模式下TIMx_CNT(计数器当前值)与TIMx_CCR1(捕获/比较值)   只是决定是有效电平还是无效电平   

  有效电平可以是高电平也可以是低电平,这需要结合CCER寄存器的CC1P位的值来确定。

 

CCER

TIMx_CCER寄存器的CCCP位,设置输入/捕获通道1输出极性  

  •  0:高电平为有效电平     

  • 1:低电平为有效电平

若为向上计数,且CCER寄存器的CC1P位为0,则当TIMx_CNT

同样向上计数,且CCER寄存器的CC1P位为1,则当TIMx_CNTPWM的工作过程

1、CCR1寄存器:捕获/比较值寄存器:设置比较值;

计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平    

  • OC1REF=0 无效电平    

  • OC1REF=1 无效电平

2、TIMx_CCMR1寄存器:OC1M[2:0]位:用于设置PWM模式

  • 110:PWM模式1

  • 111:PWM模式2

3、CCER寄存器:CC1P位:输入/捕获1输出极性。

  •  0:高电平为有效电平     

  • 1:低电平为有效电平


4、CCER寄存器:CC1E位:输入/捕获1输出使能。

  • 0:关闭使能

  • 1:打开使能

5、输出电平信号

TIM定时器的四路通道TIMx_CHx输出PWM

摘自: 《STM32中文参考手册》254页  通用定时器框图

 

STM32定时器输出通道引脚

 具体不同定时器对应引脚在对应芯片数据手册的引脚说明(pin description) 中查看

这里我们以TIM3_CH1  PA6作为讲解

工程创建

1设置RCC

设置高速外部时钟HSE 选择外部时钟源

2设置定时器

  • 1.选择TIM3 

  • 2.设置定时器时钟源为内部时钟源

  • 设置定时器CH1为PWM模式

  • 3.对应管脚自动设置为复用模式

  • 4.可自行选择是否开启定时器中断

Channel1~4  就是设置定时器通道的功能     (输入捕获、输出比较、PWM输出、单脉冲模式)

 

  • Mode   选择PWM模式1

  • Pulse(占空比值)  先给0

  • Fast Mode   PWM脉冲快速模式    :  和我们配置无关,不使能

  • PWM 极性:   设置为低电平        PS:  由于LED是低电平点亮,所以我们把极性设置为low

在 Parameter Settings 页配置预分频系数为 71,计数周期(自动加载值)为 499,定时器溢出频率,即PWM的周期,就是 72MHz/(71+1)/(499+1) = 2kHz

PWM频率:

Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)

  • arr 是计数器值

  • psc 是预分频值

占空比:

  • duty circle = TIM3->CCR1 / arr(单位:%)

  • TIM3->CCR1  用户设定值

比如  定时器频率Tclk = 72Mhz  arr=499   psc=71     那么PWM频率就是720000/500/72=  2000Hz,即2KHz

arr=499,TIM3->CCR1=250     则pwm的占空比为50%  

改CCR1可以修改占空比,修改arr可以修改频率

3时钟源设置

  • 1选择外部时钟HSE 8MHz   

  • 2PLL锁相环倍频72倍

  • 3系统时钟来源选择为PLL

  • 4设置APB1分频器为 /2


4项目文件设置

  • 1 设置项目名称

  • 2 设置存储路径

  • 3 选择所用IDE

5创建工程文件

然后点击GENERATE CODE  创建工程

配置下载工具

新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行

 

例程详解:

这里我们创建一个呼吸灯的例程


定义变量:


  /* USER CODE BEGIN 1 */

    uint16_t pwmVal=0;   //PWM占空比  

    uint8_t dir=1;    

  /* USER CODE END 1 */

然后使能TIM3的PWM Channel1 输出。


  /* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);

  /* USER CODE END 2 */

在while循环中添加代码:


  while (1)

  {

  /* USER CODE END WHILE */

 

  /* USER CODE BEGIN 3 */

 

  while (pwmVal< 500)

  {

  pwmVal++;

  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal);    //修改比较值,修改占空比

//   TIM3->CCR1 = pwmVal;    与上方相同

  HAL_Delay(1);

  }

  while (pwmVal)

  {

  pwmVal--;

  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal);    //修改比较值,修改占空比

//   TIM3->CCR1 = pwmVal;     与上方相同

  HAL_Delay(1);

  }

  HAL_Delay(200);

 

  /* USER CODE END 3 */

 }

或者直接修改CCRx寄存器的值


htim3.Instance->CCR1 = 300;


 通过 htim3.Instance->即可访问与定时器相关寄存器

推荐阅读

史海拾趣

Amptek Inc公司的发展小趣事

Amptek Inc 是一家专注于放射性测量和分析仪器的公司,提供各种 X 射线和伽马射线探测器以及相关的测试设备和软件。以下是 Amptek 公司发展的五个相关故事:

  1. 公司成立与早期发展:Amptek 公司于1987年成立,总部位于美国马萨诸塞州贝弗利市。公司成立初期,主要从事于放射性测量仪器的研发和生产。创始人团队在核物理和仪器设计领域拥有丰富的经验,致力于提供高性能、高精度的测量和分析解决方案。

  2. 技术创新与产品升级:随着技术的不断进步,Amptek 公司持续进行技术创新和产品升级。公司引入先进的探测器技术和数据处理算法,不断提升产品的性能和精度。公司的 X 射线和伽马射线探测器在放射性测量和分析领域具有很高的声誉,被广泛应用于科学研究、医学诊断、工业检测等领域。

  3. 全球市场拓展:Amptek 公司在全球范围内建立了广泛的销售网络和服务体系。除了在美国设立销售和服务中心外,公司还在欧洲、亚洲等地设立了分支机构和代理商,为全球客户提供及时的技术支持和售后服务。公司的产品远销全球,赢得了国内外客户的信赖和好评。

  4. 科研合作与应用推广:Amptek 公司与世界各地的科研机构、大学和实验室保持着紧密的合作关系,共同开展科研项目和应用研究。公司的产品被广泛应用于粒子物理、天体物理、材料科学、核医学等领域的实验和研究中,为科学家和研究人员提供了强大的实验工具和数据支持。

  5. 持续发展与未来展望:Amptek 公司将继续致力于技术创新和产品研发,不断提升产品的性能和功能,满足客户不断增长的需求。公司将继续拓展国际市场,加强与客户的合作关系,进一步巩固在放射性测量和分析领域的领先地位。同时,公司还将关注新兴市场和新技术的发展趋势,积极布局未来的发展方向。

Allied Wire & Cable Inc公司的发展小趣事

为了保持市场竞争力,Allied公司始终注重技术升级和品质提升。公司投入大量资金引进先进的生产设备和技术,不断提高产品的技术含量和附加值。同时,公司还建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控,确保产品的品质和性能达到最高标准。

HTC Korea(TAEJIN Technology )公司的发展小趣事

HTC Korea(前身为TAEJIN Technology Co., Ltd.)成立于2000年,最初以Linear IC产品的研发及生产为主,逐步在通信、消费类及PC等应用领域稳步发展。然而,公司的真正突破发生在2006年,这一年HTC决定从OEM代工厂转型为自主品牌制造商。这一转型并非易事,面临着合作伙伴转变为竞争对手的风险,导致股价一度暴跌。但HTC坚持下来,推出了HTC Touch和HTC Diamond等经典机型,成功吸引了市场的关注,股价逐渐回升,最终奠定了其在手机市场的重要地位。

爱浦电子(AIPULNION)公司的发展小趣事

爱浦电子自成立以来,一直致力于模块电源技术的研发与创新。在成立初期,公司便凭借其专业的研发团队和先进的生产设备,成功研发出多款具有竞争力的模块电源产品。随着技术的不断进步,爱浦电子不断对产品进行升级和优化,以满足市场日益增长的需求。公司不仅通过了ISO9001质量管理体系认证,还成功获得了CE、RoHS等国际认证,进一步提升了产品的品质和竞争力。

DS-IMP公司的发展小趣事

DS-IMP公司在发展过程中,非常重视市场拓展和品牌建设。公司制定了详细的市场战略和营销计划,通过参加国内外展会、举办技术研讨会、开展产品推广活动等方式,不断提升品牌知名度和影响力。同时,公司还积极开拓国际市场,与多家国际知名企业建立了长期合作关系。这些努力使得公司的市场份额不断扩大,品牌影响力逐渐增强。

GISMA Steckverbinder GmbH公司的发展小趣事

随着全球电子市场的不断扩大,GISMA积极实施国际化战略,努力拓展海外市场。公司不仅在欧洲市场建立了稳固的地位,还逐步将业务拓展到亚洲、北美等地区。通过参加国际展会、建立海外销售网络等方式,GISMA成功吸引了众多国际客户的关注,进一步提升了品牌知名度和市场占有率。同时,GISMA还积极寻求与国际知名企业的合作机会,共同推动电子行业的发展。

问答坊 | AI 解惑

Aeroflex 5800系列设备满足不断发展的自动测试需求

如果您是一位工程师,而且正在进行混合信号测试、器件编程、功能测试、在系统编程或者简单协议通信,那么Aeroflex设计的5800系列自动测试设备(ATE系统)能够让您的工作更轻松。5800系列ATE设备采用开放式并且高度可配置的结构,因而能轻松适应不断发 ...…

查看全部问答>

我对电子技术的爱

我是一个从小热爱电子,长大后开始学习电子专业,工作还从事电子行业。培养兴趣最重要,从小培养自己的兴趣爱好,长大后有利于你大学选择专业!从小就要规划自己的人生蓝图,有目的的学习知识。喜欢就会更爱你从事的行业,就更爱你的工作!感兴趣的 ...…

查看全部问答>

跪求《内存受限系统之软件开发》电子书

跪求《内存受限系统之软件开发》电子书~~~ 不要英文版的,要中文的,最好还是简体中文的。 麻烦有资源的兄弟姐妹支援支援啊。。…

查看全部问答>

刚接解PC机的USB驱动,散分的问题。大散分!!!

我现在有一块板子,里面自己已经写了USB的固件程序了,可是PC机端的驱动不会开发,想学一学,希望大家给点意见。 我知道固件程序的设备描述表,配置描述表,接口描述表,终端描述表等的定义,我板子上使用的是HID类,目的是想通过USB传递字符(功 ...…

查看全部问答>

高频开关电源单端反激变压器的原理与设计方法

高频开关电源单端反激变压器的原理与设计方法…

查看全部问答>

求救SPISlave工作模式??香版主请进

   STM 32 103xx 用SPI2作为Slave,和inter 196KC通讯时收不到数据,196端用IO口模拟SPI时序,用示波器观看和SPI2连接的MOSI和SCK 均有波形.估计196KC的程序没有错误的,因为和196端还同时连接一个X25045 ...…

查看全部问答>

对易电源的一点想法&悲剧的游戏分数

这个游戏有一个BUG,第一个拼图里面选项没有电感。。。所以基本上做对只可能靠蒙了,呵呵 说说易电源吧,这种电感,mos管,二极管都集成在一个芯片里面的稳压器其实不只有NS一家有,早先也看过凌特和intersil也出过, 不过他们做的这种电源模块 ...…

查看全部问答>

基于PSCAD的三相电压型PWM整流器研究与仿真

  摘要:分析了电压型 PWM 整流器的双闭环解耦控制原理。针对 PI 控制条件下电网扰动与负载扰动对直流侧电压动态波形影响较大的特点,引入了带负载电流前馈的控制方案,有效的提高了系统抗干扰性能。最后,在 PSCAD 仿真环境下,建立了系统的仿真 ...…

查看全部问答>

【PSoC4心得】出差才回,终于收到板子了!

上周就接到家里电话,说板子到了。一直出差,没见长啥样,今天终于看到了。先上个电,跑个LED再说。开工。。。。。…

查看全部问答>