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

devtools/2024/10/15 22:24:18/

输出捕获

  • 1、输出捕获的简介
  • 2、输入捕获原理
    • 2.1、输入滤波
    • 2.2、信号选择
    • 2.3、CCx事件和CCx中断
  • 3、标准库编程

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、标准库编程

在这里插入图片描述

在这里插入图片描述

//通过输入捕获功能进行超声波的测距。
/*超声波模块的初始化
*/
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有RCRTIM_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;//选择通道CH1TIMICInitStruct.TIM_ICFilter = 0x08;TIMICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发拍照TIMICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频系数为1TIMICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//来源于通道1,所以直接输入TIM_ICInit(TIM1,&TIMICInitStruct);//3.4 配置通道2的参数,下降沿进行拍照TIMICInitStruct.TIM_Channel = TIM_Channel_2;//选择CH2TIMICInitStruct.TIM_ICFilter = 0x08;TIMICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;//下降沿触发拍照TIMICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频系数为1TIMICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;//来源于通道1,所以间接输入TIM_ICInit(TIM1,&TIMICInitStruct);//4.使能通道1和通道2TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Enable);
}/*定时器的中断函数,由上面的定时器初始化得,PSC = 71,则分频72倍,72MHz/72 = 1MHz1MHz代表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次方换算成sfloat distance = time * 1e-6 * 340 / 2 ;return distance;
}

http://www.ppmy.cn/devtools/102927.html

相关文章

YAPI接口平台中对于接口的详细配置步骤

完整笔记指路:黑马JavaWeb开发笔记07——Ajax、Axios请求、前后端分离开发介绍、Yapi详细配置步骤 注意:我进去看了一下,这个网站非常不稳定,非常卡顿,并且很多人反映无法注册,推测需要魔法。我用Google账…

一文搞懂 js 原型和原型链

文章目录 一、前言二、原型2.1 概念2.2 获取原型的方法2.2.1 __proto__获取方式2.2.2 通过构造函数prototype 属性获取2.2.2 ES6 class 通过Object.getPrototypeOf()获取类原型 2.3 通过原型实现继承2.4 原型的作用 三、 原型链四、ES6实现继承五、综述 一、前言 原型和原型链…

manim动画:利用极限的定义证明极限。

函数的证明 用极限的定义来证明下面的极限。 要用极限的定义证明 ,我们可以使用极限的定义: 设f(x)在包含a的开区间中对所有x≠a有定义,设L为实数。然后 如果,任意一个,存在一个 ,以至于如果对于所有x在f的…

.NET_web前端框架_layui_栅格布局

基础概念 layui:用于简化前端编写的框架。响应式布局(Responsive Layout):一种网页设计方法,使网页能够根据不同设备的屏幕尺寸和分辨率自动调整其内容和布局。栅格布局(Grid Layout):一种网页设计布局方法&#xff0c…

nodejs 旅游网站系统--附源码93714

摘 要 在数字化快速发展的今天,旅游业也迎来了前所未有的转型机遇。为了满足日益增长的在线旅游需求,我们倾力打造了一款基于Node.js的旅游网站系统。该系统凭借其高效的性能、灵活的扩展性和出色的用户体验,旨在为游客提供一站式的旅游服务解…

解决Selenium元素拖拽不生效Bug

前几天在使用Selenium进行元素拖拽操作时,发现Selenium自带的元素拖拽方法(dragAndDrop())不生效,网上的回答也是五花八门,比较混乱,尝试了以下几种方法均无法解决。 方案1:通过dragAndDrop()方…

idea插件开发(一)合并检查

一、引言 由于代码合并冲突的时候,代码丢失的情况频发,作者研究idea的VFS虚拟文件系统和Git4ide源码,创作idea插件检测代码合并丢失 可以区分主动删除与被动丢失,比如本地或者删除一段代码,合并之后不会被认为是丢失…

从零开学C++:string类

引言:现在我们将正式踏入C起飞阶段,C语言自带的各种类能极大地简化我们所编写的代码的量,而我们今天要学的string就是其中之一。 更多有关C的知识点详解可前往个人主页:计信猫​​​​​ 一,认识string string其实很简…