目录
输入捕获简介
IC(Input Capture)输入捕获
输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
每个高级定时器和通用定时器都拥有4个输入捕获通道
可配置为PWMI模式,同时测量频率和占空比
可配合主从触发模式,实现硬件全自动测量
输入捕获(Input Capture)是一种用于测量外部信号脉冲宽度或频率的技术,广泛应用于微控制器(如STM32系列)中。以下是对输入捕获的详细介绍:
一、定义与原理
输入捕获通过定时器模块捕获外部信号的特定事件,如脉冲的上升沿或下降沿,以便测量脉冲宽度或频率。当捕获通道检测到信号的跳变沿时,定时器的当前计数值会被锁存到捕获寄存器中。通过读取捕获寄存器中的值,可以获取到信号跳变时的时间信息。
二、配置步骤
- 初始化定时器和通道对应IO的时钟:确保定时器和相关IO口的时钟已经开启。
- 初始化IO口:将IO口配置为复用模式,并设置适当的输入模式(如上拉输入、下拉输入或浮空输入)。
- 设置引脚复用映射:将IO口映射到定时器的捕获通道上。
- 初始化定时器:配置定时器的时基单元,包括预分频器、自动重装器等参数。
- 初始化输入捕获通道:配置输入捕获的参数,如滤波器、极性(上升沿或下降沿捕获)、分频器等。
- 使能定时器:启动定时器,开始捕获外部信号。
三、应用场景
- 测量脉冲宽度:通过捕获信号的上升沿和下降沿,可以计算出脉冲的宽度。
- 测量频率:通过测量连续两个上升沿(或下降沿)之间的时间间隔,可以计算出信号的频率。
- 编码器信号处理:在编码器应用中,输入捕获可以用于读取编码器的脉冲信号,从而计算出旋转的角度或速度。
- 触摸按键检测:在某些触摸按键电路中,输入捕获可以用于检测按键的按下和释放时刻,从而实现按键功能。
四、注意事项
- 滤波器设置:为了滤除噪声信号,可以配置输入捕获的滤波器。滤波器会连续采样通道的信号电平,只有当连续多次采样都满足触发条件时,才会触发捕获中断。
- 捕获极性选择:根据外部信号的特性,选择合适的捕获极性(上升沿或下降沿)。
- 中断处理:在捕获到信号后,通常会进入中断服务程序进行处理。在中断服务程序中,可以读取捕获寄存器的值,并进行相应的计算或处理。
参考实验
实验一:输入捕获模式测频率
在这里为了测量外部信号的频率,我们先得有个信号源,产生一个频率和占空比可调的波形,可以先用PWM模块,在PA0端口输出一个频率和占空比可调的波形,测量波形的输入口设置在PA6,所以接线时直接把PA0和PA6连接在一起就可以,这样就可以测量自己PWM模块产生波形的频率了,如果有示波器的话可以把探头连接在这根线上,可以验证频率是否正确,如果有信号发生器,就不需要PA0自己输出波形了,直接用信号发生器产生可调的测试信号,接在PA6口就可以了.
接线图
示例代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
PWM_Init(); //PWM初始化
IC_Init(); //输入捕获初始化
/*显示静态字符串*/
OLED_ShowString(1, 1, "Freq:00000Hz"); //1行1列显示字符串Freq:00000Hz
/*使用PWM模块提供输入捕获的测试信号*/
PWM_SetPrescaler(720 - 1); //PWM频率Freq = 72M / (PSC + 1) / 100
PWM_SetCompare1(50); //PWM占空比Duty = CCR / 100
while (1)
{
OLED_ShowNum(1, 6, IC_GetFreq(), 5); //不断刷新显示输入捕获测得的频率
}
}
比如当前预分频系数是7200,代入右边的公式,可以得出频率就是100Hz
比如当前预分频系数为3600,则得出的频率应该为200Hz
实验效果
目前测试的为100Hz
目前测试的为200Hz
实验二:PWMI模式测频率占空比
PWMI模式(PWM Input Mode)是一种用于测量PWM(脉冲宽度调制)波形占空比的模式。在STM32等微控制器中,PWMI模式通过配置输入捕获电路来实现对PWM波形的精确测量。
PWM波形的占空比是指高电平占整个周期的百分比。在PWMI模式下,微控制器的两个输入捕获通道被配置为同时捕获同一个引脚上的PWM信号。通常,通道1被配置为捕获上升沿,而通道2被配置为捕获下降沿。这样,当PWM波形的一个周期开始时,通道1会记录下此时的计数器值(CNT),而当PWM波形的一个周期结束时,通道2会再次记录下此时的计数器值。通过这两个值,可以计算出PWM波形的周期和占空比。
具体来说,占空比的计算公式为:占空比 = (通道2捕获的计数器值 / 通道1捕获的计数器值)× 100%。而PWM波形的频率则可以通过微控制器的计数器频率和通道1捕获的计数器值来计算。
在配置PWMI模式时,需要注意以下几点:
- 确保GPIO和TIM(定时器)的时钟已经开启。
- 将GPIO配置为输入模式,并选择适当的输入模式(如上拉输入或浮空输入)。
- 配置TIM的时基单元,包括预分频器、自动重装器、计数模式等。
- 配置输入捕获单元,包括滤波器、极性、直连通道或交叉通道等参数。
- 选择适当的触发源和从模式配置。
当前分频系数3600,频率就是200Hz,
CCR=20,占空比就是20%
接线图
示例代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
PWM_Init(); //PWM初始化
IC_Init(); //输入捕获初始化
/*显示静态字符串*/
OLED_ShowString(1, 1, "Freq:00000Hz"); //1行1列显示字符串Freq:00000Hz
OLED_ShowString(2, 1, "Duty:00%"); //2行1列显示字符串Duty:00%
/*使用PWM模块提供输入捕获的测试信号*/
PWM_SetPrescaler(720 - 1); //PWM频率Freq = 72M / (PSC + 1) / 100
PWM_SetCompare1(50); //PWM占空比Duty = CCR / 100
while (1)
{
OLED_ShowNum(1, 6, IC_GetFreq(), 5); //不断刷新显示输入捕获测得的频率
OLED_ShowNum(2, 6, IC_GetDuty(), 2); //不断刷新显示输入捕获测得的占空比
}
}
实验效果
可以得到第一行显示为频率200Hz,第二行显示为占空比20%