21:【stm32】定时器二:输入捕获

输出捕获

1、输出捕获的简介

定时器通过通道捕获输入电平的变化,而通道有CH1~CH4,这4个通道。

我们设定对通道CH3的输入电平进行捕获。假如CH3突然捕获到一个上升沿,然后CRR3对计数器CNT进行拍照,记录此时计数器的数值为R1,CNT的值会被拍照 入CCR3中。然后过一段时间,CH3捕获到一个下降沿,然后CRR3对计数器CNT进行拍照,记录此时计数器的数值为R2,CNT的值会被拍照 入CCR3中。而通过R2-R1就可以计算出这个电平的时间。

2、输入捕获原理

如图为:输入捕获的内部结构,其中内部结构由输入滤波器,边沿检测,信号选择器,分频器组成


2.1、输入滤波

通过RCC来的时钟信号对输入的波形进行采样,最终得出完整的波形。

2.2、信号选择

通道1和通道2为一组:通道1传来的边沿信号,可以通过通道2进行信号选择,通道1也可以进行通道2的信号选择。

通道3和通道4为一组:通道3传来的边沿信号,可以通过通道4进行信号选择,通道3也可以进行通道4的信号选择。

所以计数脉宽如下:

2.3、CCx事件和CCx中断

3、标准库编程

c 复制代码
//通过输入捕获功能进行超声波的测距。
/*
	超声波模块的初始化
*/
void App_SR04_Init(void)
{
	//1. 配置PA0引脚,连接超声波的Trig引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//输出推挽模式
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//1.1 配置PA8,用TIM1的通道CH1进行输入捕获
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_8;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPD;//下拉输入
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//2. 配置定时器
	//2.1 开启定时器TIM1的时钟
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1,ENABLE);//复位
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1,DISABLE);//释放
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能时钟
	
	//2.2 打开预加载
	TIM_ARRPreloadConfig(TIM1,ENABLE);
	
	//2.3 配置时基单元
	TIM_TimeBaseInitTypeDef TIMInitStruct;
	TIMInitStruct.TIM_Prescaler = 71;//72倍分频,1MHz,1us计数一次
	TIMInitStruct.TIM_Period = 65535;//自动重装,因为最大为38ms,即计数38000次,所以直接配置为大于38000都行
	TIMInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIMInitStruct.TIM_RepetitionCounter = 0;//重复计数器RCR为0,因为使用的是TIM1,TIM1有RCR
	TIM_TimeBaseInit(TIM1,&TIMInitStruct);
	
	//2.4 手动启动Update事件
	TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
	
	//3. 配置输入捕获
	//3.1 禁用霍尔传感器
	TIM_SelectHallSensor(TIM1,DISABLE);
	
	//3.2 配置输入滤波的分频系数为2,采样信号Fdts的分频系数
	TIM_SetClockDivision(TIM1,TIM_CKD_DIV2);
	
	//3.3 配置通道1的参数,上升沿进行拍照
	TIM_ICInitTypeDef TIMICInitStruct;
	TIMICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道CH1
	TIMICInitStruct.TIM_ICFilter = 0x08;
	TIMICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发拍照
	TIMICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频系数为1
	TIMICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//来源于通道1,所以直接输入
	TIM_ICInit(TIM1,&TIMICInitStruct);
	
	//3.4 配置通道2的参数,下降沿进行拍照
	TIMICInitStruct.TIM_Channel = TIM_Channel_2;//选择CH2
	TIMICInitStruct.TIM_ICFilter = 0x08;
	TIMICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;//下降沿触发拍照
	TIMICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频系数为1
	TIMICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;//来源于通道1,所以间接输入
	TIM_ICInit(TIM1,&TIMICInitStruct);
	
	//4.使能通道1和通道2
	TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
	TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Enable);
}

/*
	定时器的中断函数,由上面的定时器初始化得,PSC = 71,则分频72倍,72MHz/72 = 1MHz
	1MHz代表1s/1000000 = 0.000001s = 1us,所以没间隔1us计数一次。
*/
float App_SR04(void)//计数距离
{
	//1. 先清除CCxIF标志位的值
	TIM_ClearFlag(TIM1,TIM_FLAG_CC1);//清除通道CH1的标志位
	TIM_ClearFlag(TIM1,TIM_FLAG_CC2);//清除通道CH1的标志位
	
	//2. 清除CNT的值
	TIM_GenerateEvent(TIM1,TIM_EventSource_Update);

	//3. 打开定时器
	TIM_Cmd(TIM1,ENABLE);
	
	//4. 向Trig引脚发送一个10us的脉冲
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
	PAL_DelayUs(10);
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
	
	//5.等待测量完成
	while(TIM_GetFlagStatus(TIM1,TIM_FLAG_CC1) == RESET);
	while(TIM_GetFlagStatus(TIM1,TIM_FLAG_CC2) == RESET);
	
	//6. 关闭定时器
	TIM_Cmd(TIM1,DISABLE);
	
	//7. 计数距离
	int time;
	time = (TIM_GetCapture2(TIM1) - TIM_GetCapture1(TIM1));//us*10的负6次方换算成s
	float distance = time * 1e-6 * 340 / 2 ;
	return distance;
}
相关推荐
广药门徒5 小时前
最小硬件系统概念及其组成
单片机·嵌入式硬件
GXSC8 小时前
国芯思辰|SCS5501/5502芯片组打破技术壁垒,重构车载视频传输链路,兼容MAX9295A/MAX96717
嵌入式硬件
啵啵学习8 小时前
Linux 里 su 和 sudo 命令这两个有什么不一样?
linux·运维·服务器·单片机·ubuntu·centos·嵌入式
可乐鸡翅好好吃10 小时前
通过BUG(prvIdleTask、pxTasksWaitingTerminatio不断跳转问题)了解空闲函数(prvIdleTask)和TCB
c语言·stm32·单片机·嵌入式硬件·bug·keil
才鲸嵌入式11 小时前
01 Ubuntu20.04下编译QEMU8.2.4,交叉编译32位ARM程序,运行ARM程序的方法
linux·c语言·单片机·嵌入式·arm·qemu·虚拟机
广药门徒12 小时前
我认为STM32输入只分为模拟输入 与 数字输入
stm32·单片机·嵌入式硬件
早睡的叶子13 小时前
proteus8安装教程
stm32·嵌入式硬件
天月风沙15 小时前
PX4 | 无人机关闭磁力计罗盘飞行(yaw estimate error报错解决方法)
单片机·嵌入式硬件·mcu·无人机
计蒙不吃鱼18 小时前
星闪开发之Server-Client 指令交互控制红灯亮灭案例解析(SLE_LED详解)
嵌入式硬件·物联网·iot·星闪·星闪开发
想搞嵌入式的小白19 小时前
STM32 NVIC中断控制器
stm32·单片机·嵌入式硬件·nvic