历史上的今天
今天是: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_CNT
TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 PWM模式2:在向上计数时,一旦TIMx_CNT
TIMx_CCR1时通道1为有效电平,否则为无效电平。
在两种模式下TIMx_CNT(计数器当前值)与TIMx_CCR1(捕获/比较值) 只是决定是有效电平还是无效电平
有效电平可以是高电平也可以是低电平,这需要结合CCER寄存器的CC1P位的值来确定。

TIMx_CCER寄存器的CCCP位,设置输入/捕获通道1输出极性
0:高电平为有效电平
1:低电平为有效电平
若为向上计数,且CCER寄存器的CC1P位为0,则当TIMx_CNT 同样向上计数,且CCER寄存器的CC1P位为1,则当TIMx_CNT 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:低电平为有效电平 0:关闭使能 1:打开使能 5、输出电平信号 摘自: 《STM32中文参考手册》254页 通用定时器框图 具体不同定时器对应引脚在对应芯片数据手册的引脚说明(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->即可访问与定时器相关寄存器
4、CCER寄存器:CC1E位:输入/捕获1输出使能。TIM定时器的四路通道TIMx_CHx输出PWM

STM32定时器输出通道引脚

工程创建







配置下载工具


史海拾趣
|
Aeroflex 5800系列设备满足不断发展的自动测试需求 如果您是一位工程师,而且正在进行混合信号测试、器件编程、功能测试、在系统编程或者简单协议通信,那么Aeroflex设计的5800系列自动测试设备(ATE系统)能够让您的工作更轻松。5800系列ATE设备采用开放式并且高度可配置的结构,因而能轻松适应不断发 ...… 查看全部问答> |
|
我现在有一块板子,里面自己已经写了USB的固件程序了,可是PC机端的驱动不会开发,想学一学,希望大家给点意见。 我知道固件程序的设备描述表,配置描述表,接口描述表,终端描述表等的定义,我板子上使用的是HID类,目的是想通过USB传递字符(功 ...… 查看全部问答> |
|
STM 32 103xx 用SPI2作为Slave,和inter 196KC通讯时收不到数据,196端用IO口模拟SPI时序,用示波器观看和SPI2连接的MOSI和SCK 均有波形.估计196KC的程序没有错误的,因为和196端还同时连接一个X25045 ...… 查看全部问答> |
|
这个游戏有一个BUG,第一个拼图里面选项没有电感。。。所以基本上做对只可能靠蒙了,呵呵 说说易电源吧,这种电感,mos管,二极管都集成在一个芯片里面的稳压器其实不只有NS一家有,早先也看过凌特和intersil也出过, 不过他们做的这种电源模块 ...… 查看全部问答> |
|
摘要:分析了电压型 PWM 整流器的双闭环解耦控制原理。针对 PI 控制条件下电网扰动与负载扰动对直流侧电压动态波形影响较大的特点,引入了带负载电流前馈的控制方案,有效的提高了系统抗干扰性能。最后,在 PSCAD 仿真环境下,建立了系统的仿真 ...… 查看全部问答> |




