输入捕获作用
监控外部输入信号的脉冲宽度,一个脉冲的有效时间
监控外部输入信号的周期和占空比------PWM波
捕获电平时间 --- 捕获按键时长
驱动超声波模块
定时器捕获框图及原理
捕获过程:由框图可得
外部管脚输入进来脉冲信号 ---- 按键按下的高电平
经过滤波器(过滤掉高频杂波) --- 看做打点计时器
经过边沿检测器 --- 设置上升沿检测 或 下降沿检测 或者 上升沿和下降沿检测
经过预分频器 --- 可以配页可以不配(建议不要去配置) 影响脉冲时间
如果捕获到设置边沿,捕获/比较寄存器能获取CNT的值
这是一个脉冲信号一个周期内,高电平的触发,这个过程中产生了一个上升沿和一个下降沿,显而意见这里高电平的计数值等于CNT2-CNT1,然后在通过时基进行计算就可以获取时间
但是,这是高电平整个触发到停止都在一个时间周期内,如果高电平一直持续跨越了几个周期后停下又该如何计算?
我们只需要设置一个溢出数,比如每跑完一个周期就溢出一次,这样就可以计算出高电平所占计算值了
T = ARR*n-CNT1 + CNT2;
其中这里就是最终公式,也可以理解为CNT1为第一次触发边沿变化,可能是低电平,CNT2为第二次触发边沿变化,以2次为一个循环。
定时器捕获输入通道配置
IO口初始化,复用模式
定时器复用到IO口,注意,每个IO口能被复用通道在复用的时候就选择好了对应通道,具体查数据手册,也是没有对应通道的IO口就算软件复用了也无法使用
定时器使能,选择时钟源
时基配置‘
滤波器频率、分频、通道映射、触发方式、捕获使能,中断触发使能
中断优先级配置
void TIM4_CC1_NVIC(void)
{
GPIOB->MODER &= ~(3<<12); //PB6模式清零
GPIOB->MODER |= 2<<12; //PB6模式复用
GPIOB->AFR[0] &= ~(0xf << 24);
GPIOB->AFR[0] |= 0x2 << 24; //AF2,TIM4复用到PA6
RCC->APB1ENR |= 1<<2; //打开TIM4时钟
TIM4->SMCR &= ~0x7; //内部时钟提供频率
//时基配置
TIM4->PSC = 8400 - 1;
TIM4->ARR = 10000 - 1; //计数周期为1000ms
TIM4->CNT = 0;
TIM4->EGR |= 1;
TIM4->SR &= ~1;
TIM4->CR1 |= 2<<8; //tDTS = 4 × tCK_INT,滤波采样时钟周期长,频率低
TIM4->CR1 |= 1<<7; //ARR预装载使能
TIM4->DIER |= 3; //捕获/比较 1 中断使能,更新中断使能
TIM4->CCMR1 |= 1; //CC1 通道配置为输入,IC1 映射到 TI1 上
TIM4->CCMR1 |= 0xf<<4; //滤波器频率低,采样次数多,数据准度高
TIM4->CCMR1 &=~ (3 << 2); //无预分频器
TIM4->CCER &= ~(7<<1); // 上升沿触发
TIM4->CCER |= 1; //cc1输入捕获使能
TIM4->CR1 |= 1; //TIM4使能
u32 pir = NVIC_EncodePriority(5,1,2);//优先级编码计算函数
NVIC_SetPriority(TIM4_IRQn ,pir);//配置具体中断源
NVIC_EnableIRQ(TIM4_IRQn);//中断源使能
}
特别注意的是其对应的中断服务函数,在设置为输入捕获的时候
在周期结束,也就是计数完成会进入中断
在捕获到边沿时也可以触发中断
而且共用一个中断服务函数,所以要去区分是谁触发的中断