STM32——定时器TIME模块之输入捕获

本文探讨了STM32定时器模块如何同时实现输入捕获和PWM输出功能,介绍了配置步骤并解决了两个关键疑问:同一定时器是否能同时支持这两种功能以及输入捕获的频率范围限制。

STM32的定时器模块有很强大的功能,除了普通的定时功能之外还可以进行输入捕获和输出比较(PWM),PWM已在别的文章中介绍过,现在介绍一下输入捕获。


在这里先说本人在测试时想到的两个疑问:


疑问1:STM32的同一个定时器是否能同时进行输入捕获和输出比较(PWM)?
疑问2:假设疑问1的答案是可以,那输入捕获的范围是不是受限制?


功能实现:

1、既然是输入捕获,肯定需要相关引脚对信号进行检测,所以需要查找开发手册和数据手册来确定是哪几个引脚,要用哪几个引脚,然后给予合适的配置(图1)。


2、要进行输入捕获实验,首先需要配置某个定时器的时基功能,这样我们才能根据这个时基计算我们的捕获信息;其次就是要配置输入(通道、边沿设置、映射、分频是几次时间、滤波是单次事件的采样次数);还要配置中断优先级,同时启动相关中断(图2);


3、为了解答前面的疑问,我们在同一个定时器里添加PWM输出,配置方式可以参考手册(图3);


4、使能定时器。

5、添加相关中断函数,这里设计到更新中断和捕获中断。需要说明的是,本实验的主要目的是为了测试捕获实验,通过不惑实验可以实现对固定频率的脉冲频率检测,或者脉宽检测等,本实验中刚好输出了PWM波,所以可以尝试的测测频率。思路是这样的:既然是固定频率和占空比的PWM波,那我可以连续测两次上升沿,将两次上身沿之间的计数器相减,然后根据定时器预分频值计算频率。由于在实际测试中存在所测频率很低,可能在两个上升沿之间定时器计数器更新了好几次,所以需要添加更新中断来记录这个更新(图4)。其中"Time2_Ch1_Cap_FreVal = TIM_GetCapture1(TIM2) + (Arr_Val + 1)*(Time2_Ch1_Cap_Sta&0x1F) - Time2_Ch1_Cap_Val;"是计数记录的最终结果值。


6、主函数中轮询判断是不是已经检测完成一次测试了,如果是,那清除掉相关屏蔽,然后利用"72000000/((Psc_Val+1)*(Time2_Ch1_Cap_FreVal))"
计算出频率。其中有一些小技巧,在对Time2_Ch1_Cap_Sta状态值清除的时候只清除0x80和0x20,是为了实现只有在两个上升沿之间进行更新记录(图5)。


疑问解答:
1、通过上面的介绍我们知道,可以用一个定时器实现既进行输入捕获,又进行PWM输出;

2、捕获的频率范围是否受限制,答案是不一定。以本实验为例,arr= 899,psc= 3;那么很明显,该实验中定时器的时钟频率是18M,所以当所测信号频率太高,在一个计数值跳变之间发生了两次上升沿,这种是测不出来的,或者测出来也是不准确的,也就是说当所测的信号频率越接近该定时器的时钟频率,误差值就越大,在实测的时候600K的频率就有点问题了(也可能是操作问题,该数据没有太大参考价值)。那么反过来,当所测频率很低,那测试结果怎么样,这个时候大家只要保证记录定时器更新的变量不要溢出,在计算过程中所有相关变量不要因为其他值的影响而不准确就不会有太大误差,在本例程中Time2_Ch1_Cap_Val定义为u8类型,可用的就低5位,最大值也就是31,计算可以知道能测的最低频率645.16多,所以如果要再低,就设置该变量为u16类型,把特殊比特位左移就行了(图6)。



输入捕获能需要结合自己的算法逻辑,可以实现不同的作用,需要我们结合自身项目开发。


### STM32定时器输入捕获与ADC采集的关系及必要性 #### 关系分析 STM32中的定时器输入捕获功能主要用于测量信号的时间特性,例如周期、频率以及占空比等参数。而ADC(模数转换器)则用于将模拟信号转化为数字信号以便进一步处理。两者虽然都属于数据采集的功能模块,但在应用场景上存在显著差异。 当需要对脉冲宽度调制(PWM)信号或其他周期性方波信号进行时间特性的精确测定时,通常会采用定时器输入捕获模式来完成这一任务[^1]。然而,在某些情况下,如果目标是对连续变化的电压水平或者非周期性的模拟量进行监测,则可能需要用到ADC来进行采样并量化这些数值[^2]。 因此,在实际应用中是否存在关联取决于具体的项目需求: - 如果仅需关注电平跳变时刻及其间隔长度这类基于时间维度的信息,则无需借助于ADC; - 若除了上述提到的时间属性外还需掌握当前瞬态下的真实幅值大小(即模拟量),那么此时便有必要引入ADC参与工作流程之中[^3]。 #### 场景区别 以下是两种技术各自适用的主要场景描述: | 特征/类别 | 定时器输入捕获 | ADC采集 | |------------------|-----------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | 数据类型 | 时间戳信息 | 模拟电压值 | | 主要用途 | 测量PWM信号的周期、频率和占空比 | 获取传感器输出的实际电压值 | | 应用实例 | 控制电机转速调节 | 温度监控 | 从表可以看出两者的侧重点不同:前者更倾向于处理离散事件的发生时机;后者则是为了捕捉物理世界里不断变动的状态特征。 #### 使用方法对比 对于启用定时器实现输入捕获而言,开发者首先要确保相关GPIO端口已经正确配置成复用推挽形式,并且连接到了所选通道对应的引脚之上。接着通过初始化结构体设定好预分频系数、计数方向以及其他必要的选项之后再启动该单元即可开始正常运作过程^。 至于如何运用ADC达成预期目的方面,则涉及到另外一套完全不同的操作逻辑——首先得挑选合适的规则组并将待测源加入其中作为成员之一;其次调整分辨率位宽至满足精度要求的程度范围内;最后记得安排DMA传输机制从而提高效率减少CPU负担等等细节事项都需要仔细斟酌一番才行. ```c // 启动ADC转换示例代码片段 void Start_ADC_Conversion(void){ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_7Cycles5); ADC_Cmd(ADC1, ENABLE); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值