STM32F4_TIM输入波形捕获(脉冲频率)

合集下载

STM32Cube学习之八:输入捕获

STM32Cube学习之八:输入捕获

STM32Cube学习之八:输入捕获假设已经安装好STM32CubeMX和STM32CubeF4支持包。

Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F407ZETx。

Step2. 在Pinout界面下配置晶振输入引脚。

配置TIM2使用内部时钟源,CH1作为输入捕获通道,默认映射到PA0引脚。

配置TIM3使用内部时钟,CH1~CH4为PWM输出通道,默认映射引脚分别为PA6,PA7,PB0,PB1。

配置TIM4使用内部时钟,CH1,CH2为PWM输出通道,映射引脚分别为PD12,PD13。

配置串口,作为信息输出接口。

Step3.在Clock Configuration界面配置时钟源。

使用外部8M晶振作PLL时钟输入,并使用PLL输出作为系统时钟。

为了后面的计算方便,将系统时钟配置成160MHz。

Step4.配置外设参数。

在configuration界面中点击TIM2/ TIM3/ TIM4按钮,可以进入参数配置界面。

TIM2:在Parameter Settings页配置预分频系数为7,其计数时钟就是80MHz/(7+1)=10MHz。

计数周期(自动加载值),转换为十六进制形式,输入32bit最大值0xFFFFFFFF。

注意,TIM2的自动加载寄存器ARR和各个通道的捕获/比较寄存器CCRx都是32bit的。

在NVIC页面使能捕获/比较中断。

在GPIO页面设置捕获输入引脚下拉电阻,设置成上拉也可以,主要是为了使在没有信号输入时在输入引脚上得到稳定的电平。

TIM3:在Parameter页配置预分频系数为7,计数周期(自动加载值)为9999。

其溢出频率就是80MHz/(7+1)/(9999+1)=1kHz,这就是TIM3各通道输出的PWM信号的频率。

各通道输出PWM的占空比参数如上图红框标注,其他参数使用默认值。

按照图中参数,CH1~CH4输出的PWM周期都是1ms,而高电平时间分别是123.4us,234.5us,567.8us,678.9us。

stm32f4上升沿触发计算频率

stm32f4上升沿触发计算频率

stm32f4上升沿触发计算频率
在STM32F4微控制器上,要计算上升沿触发的频率,你可以通过配置定时器来实现。

首先,你需要选择一个定时器来捕获输入信号的上升沿。

然后,你可以使用定时器的捕获功能来记录上升沿触发的时间戳。

接着,你可以计算连续两个上升沿之间的时间差,然后通过这个时间差来计算频率。

具体步骤如下:
1. 配置定时器为输入捕获模式,选择触发时钟源和边沿触发。

2. 在捕获中断服务程序中,读取捕获寄存器的数值,该数值记录了上升沿触发时的定时器计数值。

3. 当下一个上升沿到来时,再次读取捕获寄存器的数值,然后计算两次捕获之间的时间差。

4. 最后,通过时间差来计算频率,频率等于1除以时间差。

需要注意的是,由于STM32F4系列微控制器的定时器可以工作
在不同的时钟频率下,因此在计算频率时需要考虑定时器的时钟频率和分频因子,以确保准确的频率计算。

除了使用定时器捕获功能,你还可以考虑使用外部中断来检测上升沿触发,然后在中断服务程序中进行频率的计算。

这种方法同样可以实现对上升沿触发频率的计算。

总之,通过配置定时器的捕获功能或者外部中断,你可以在STM32F4微控制器上实现对上升沿触发频率的准确计算。

希望这些信息能够帮助到你。

STM32F407通用定时器输入捕获

STM32F407通用定时器输入捕获

通用定时器输入捕获通用定时器作为输入捕获的使用。

我们用TIM5的通道1(PA0)来做输入捕获,捕获PA0上高电平的脉宽(用KEY_UP按键输入高电平),通过串口来打印高电平脉宽时间。

输入捕获模式可以用来测量脉冲宽度或者测量频率。

我们以测量脉宽为例,用一个简图来说明输入捕获的原理:如图所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1~t2时间,就是我们需要测量的高电平时间。

测量方法如下:首先设置定时器通道x为上升沿捕获,这样,t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置通道x为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的CNT值,记为CCRx2。

这样,根据定时器的计数频率,我们就可以算出t1~t2的时间,从而得到高电平脉宽。

在t1~t2之间,可能产生N次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。

如图所示,t1~t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以CNT的计数周期,即可得到t2-t1的时间长度,即高电平持续时间。

STM32F4的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。

STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

同时还可以配置捕获时是否触发中断/DMA等。

这里我们用TIM5_CH1来捕获高电平脉宽。

=================================================================================== 捕获/比较通道(例如:通道 1 输入阶段)=================================================================================== 接下来介绍我们需要用到的一些寄存器配置,需要用到的寄存器:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (这里的x=5)。

STM32单片机测量方波频率方法总结

STM32单片机测量方波频率方法总结

STM32单片机测量方波频率方法总结一、测周法:通过一个方波的两个上升沿或下降沿触发中断,然后定时器计数,计数的总个数乘以计数单位时间即该方波的周期,具体可通过单片机输入捕获功能实现,以下为参考代码//输入捕获初始化函数void input_frequent_init(void) //采用TIM4的Channel_1通道作为输入捕获通道{//声明结构体变量,用来初始化定时器TIM_TimeBaseInitTypeDef TIM4_TimeBaseInitStructure;TIM_ICInitTypeDef TIM4_ICInitStructure;NVIC_InitTypeDef TIM4_NVIC_InitStructure;/* 开启定时器4时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);TIM_ClearITPendingBit(TIM4,TIM_IT_Update|TIM_IT_CC1); //清除捕获和中断标志位TIM4_TimeBaseInitStructure.TIM_Period = 0xffff;//设定计数器自动重装值(设置为最大)TIM4_TimeBaseInitStructure.TIM_Prescaler = 1; //设置分频系数TIM4_TimeBaseInitStructure.TIM_ClockDivision = TIM_C KD_DIV1; //设置时钟分割:TDTS = Tck_timTIM4_TimeBaseInitStructure.TIM_CounterMode = TIM_Cou nterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4,&TIM4_TimeBaseInitStructure);/ /根据结构体参量初始化定时器TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入捕获的输入端,IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity _Rising; //设置为上升沿捕获TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelecti on_DirectTI; //映射到TI1上TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV 1; //配置输入分频,不分频TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=000 0 配置输入滤波器,此处不滤波TIM_ICInit(TIM4, &TIM4_ICInitStructure); //初始化TIM 4通道1//中断分组初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);TIM4_NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//打开TIM4的全局中断TIM4_NVIC_InitStructure.NVIC_IRQChannelPreemptionPri ority=1; //抢占优先级配置为1TIM4_NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级配置为1TIM4_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init(&TIM4_NVIC_InitStructure); //初始化中断TIM_Cmd(TIM4,ENABLE); //使能中断TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC1, ENABLE ); //使能捕获和更新中断}需要注意的是,如果所测信号中存在尖峰干扰信号,则TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器,此处不滤波这一行应根据干扰信号的高电平时间来赋予合适的滤波器的值,具体计算方法参考芯片手册或自行百度。

深入理解STM32定时器中的输入捕获滤波器

深入理解STM32定时器中的输入捕获滤波器

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void NVIC_Configure(void) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* TIM3_CC_IRQHandler */ NVIC_InitStruct.NVIC_IRQChannel =TIM3_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } #define ARR void Tim_Configure( void ) { TIM_TimeBaseInitTypeDef TIM_OCInitTypeDef TIM_ICInitTypeDef //1800, 2000, 2048, 2057
void GPIO_Configure(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 设 置 USART1 复 用 端 ----------------------------------------------------- */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /* TXD */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* RXD */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 口

STM32定时器输入捕获模式测频率

STM32定时器输入捕获模式测频率

频)72M/2M //以 2MHz 计数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数
TIM_TimeBaseStructure.TIM_Period = 65535;
//装载值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
/* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue2[0] = TIM_GetCapture1(TIM2);
/* TIM2IC_ReadValue computation */ if (TIM2IC_ReadValue2[0] > TIM2IC_ReadValue1[0]) {
TIM2Capture[0] = (TIM2IC_ReadValue2[0] - TIM2IC_ReadValue1[0]); } else {
TIM2Capture[0] = ((0xFFFF - TIM2IC_ReadValue1[0]) + TIM2IC_ReadValue2[0]); } /* Frequency computation */ Frequency0= 2000000/ TIM2Capture[0];// 计算频率=2MHz/时钟计数 IM2CaptureNumber[0] = 0; TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE); } } else if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET) { /* Clear TIM3 TIM2IC_ReadValue compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

STM32利用捕获功能完成脉冲宽度测量

STM32利用捕获功能完成脉冲宽度测量

STM32利用捕获功能完成脉冲宽度测量STM32是一款常见的32位微控制器,它具有强大的功能和灵活性。

通过利用STM32的捕获功能,我们可以实现脉冲宽度测量。

下面是一个详细的说明,包括如何配置STM32的定时器和GPIO引脚,以及如何使用捕获功能进行脉冲宽度测量。

1.配置定时器和GPIO引脚:首先,我们需要配置定时器和GPIO引脚,以确保它们能够正常工作。

在STM32中,使用CubeMX可视化工具来配置硬件资源是一个比较方便的方法。

- 打开CubeMX工具,并选择你正在使用的STM32微控制器型号。

- 在"Pinout & Configuration"选项卡中,选择所需的GPIO引脚进行输入捕获。

将引脚配置为输入模式,并启用上拉或下拉电阻。

-在同一选项卡上,选择所需的定时器。

将其配置为捕获模式,并选择所需的输入通道。

- 在"Generated Code"选项卡中,点击"Project Firmware Structure"下的"Middlewares"文件夹,选择"TIM"文件夹,然后选择"TIM_HandleTypeDef"文件。

复制该文件到你的代码工程文件夹下。

2.配置捕获功能与中断处理函数:- 在自动生成的代码中,找到`HAL_TIM_IC_MspInit`函数。

在该函数中,初始化定时器和GPIO相关的寄存器。

-在主函数中,进行以下配置:```cuint32_t ICValue1 = 0;uint32_t ICValue2 = 0;uint32_t Difference = 0;TIM_HandleTypeDef htim2;```-初始化定时器和GPIO:```cvoid MX_TIM2_Init(void)TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_IC_InitTypeDef sConfigIC = {0};htim2.Instance = TIM2;htim2.Init.Prescaler = 0;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 0xFFFFFFFF;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Init(&htim2);sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0;HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;HAL_TIMEx_MasterConfigSynchronization(&htim2,&sMasterConfig);```3.启动捕获功能和中断处理:```cvoid HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)if (ICValue1 == 0)ICValue1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);}else if (ICValue2 == 0)ICValue2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);if (ICValue2 > ICValue1)Difference = ICValue2 - ICValue1;}else if (ICValue1 > ICValue2)Difference = (0xFFFFFFFF - ICValue1) + ICValue2; }elseError_Handler(;}ICValue1 = 0;ICValue2 = 0;}}int main(void)HAL_Init(;SystemClock_Config(;MX_GPIO_Init(;MX_TIM2_Init(;HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); while (1)//主循环}```4.测试和读取脉冲宽度:通过使用上述代码配置和启动定时器和GPIO引脚后,STM32将能够使用捕获功能进行脉冲宽度测量。

STM32输入捕获的脉冲宽度及频率计算

STM32输入捕获的脉冲宽度及频率计算

STM32输入捕获的脉冲宽度及频率计算脉冲宽度的计算:脉冲宽度是指脉冲信号的高电平或低电平持续的时间。

在STM32中,定时器的输入捕获模式可以测量脉冲宽度。

输入捕获模式下,定时器会记录脉冲边沿的时间戳,可以通过计算时间戳之差来得到脉冲宽度。

具体的计算方法如下:1.配置定时器为输入捕获模式,并设置触发边沿(上升沿或下降沿)。

2.当捕获到脉冲边沿时,获取当前的定时器计数器值,作为开始时间戳。

3.当下一个脉冲边沿到来时,再次获取当前的定时器计数器值,作为结束时间戳。

4.计算时间戳之差,即为脉冲宽度。

脉冲频率的计算:脉冲频率是指单位时间内脉冲信号的个数。

脉冲频率的计算可以通过测量脉冲的周期来实现。

在STM32中,定时器的输入捕获模式可以测量脉冲的周期。

具体的计算方法如下:1.配置定时器为输入捕获模式,并设置触发边沿(上升沿或下降沿)。

2.当捕获到脉冲边沿时,获取当前的定时器计数器值,作为开始时间戳。

3.当接收到下一个脉冲边沿时,再次获取当前的定时器计数器值,作为结束时间戳。

4.计算时间戳之差,即为脉冲的周期。

5.频率等于周期的倒数。

需要注意的是,输入捕获功能只能测量单个脉冲的宽度和周期,如果要测量信号源的频率或平均脉冲宽度,需要根据测量的脉冲个数进行统计和计算。

以下是一个示例代码,演示了如何使用STM32的输入捕获功能计算脉冲宽度和频率:```c#include "stm32f4xx.h"//定义输入捕获相关的变量volatile uint32_t startTimestamp = 0;volatile uint32_t endTimestamp = 0;volatile uint32_t pulseWidth = 0;volatile uint32_t pulsePeriod = 0;volatile uint32_t pulseFrequency = 0;void TIM2_IRQHandler(void)if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)if (startTimestamp == 0)startTimestamp = TIM_GetCapture1(TIM2);} elseendTimestamp = TIM_GetCapture1(TIM2);pulseWidth = endTimestamp - startTimestamp;pulsePeriod = pulseWidth * 2;pulseFrequency = SystemCoreClock / pulsePeriod;startTimestamp = 0;}TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);}int main(void)//初始化定时器2TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_DeInit(TIM2);TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数器为向上计数模式TIM_TimeBaseInitStruct.TIM_Period = 0xFFFFFFFF; // 设置计数器的溢出值为最大值TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 设置时钟分割TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; // 设置重复计数值为0TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);//配置输入捕获模式TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; // 选择定时器通道1TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; // 设置捕获参数,上升沿触发TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 设置输入映射,直接连接至TIM2_IC1管脚TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 设置输入分频,不分频TIM_ICInitStruct.TIM_ICFilter = 0; // 不开启滤波器TIM_ICInit(TIM2, &TIM_ICInitStruct);//开启输入捕获中断TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);//启动定时器2TIM_Cmd(TIM2, ENABLE);while (1)}```在上述示例代码中,定时器2被配置为输入捕获模式,通过TIM2的通道1测量脉冲输入。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的。

在引脚上刚好相反:一个输入、一个输出。

本文只使用一个TIM5通道3(也可其他通道)捕获输入脉冲的频率,通过捕获两次输入脉冲的间隔时间来计算脉冲波形的频率。

间隔一定时间读取频率并通过串口打印出来。

当然也可通过两路通道捕获脉冲信号的占空比,计划后期整理。

笔者通过信号发生器产生信号,上位机串口助手显示捕获的脉冲频率。

(没有信号发生器的朋友可以结合上一篇文章PWM输出做信号源:在同一块板子上也可以使用不同定时器,将输出引脚接在输入引脚)
先看一下实例的实验现象:
关于本文的更多详情请往下看。

Ⅱ、实例工程下载
笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

提供下载的软件工程是STM32F417的,但F4其他型号也适用(适用F4其他型号:关注微信,回复“修改型号”)。

STM32F4_TIM输入波形捕获(脉冲频率)实例:
https:///cB6XrSi6rK3TP 访问密码
STM32F4资料:
https:///cR2pxqF5x2d9c 访问密码53e7
Ⅲ、原理描述
笔者将TIM分为三大块:时基部分、比较输出和输入捕获,请看下面截图“通用TIM框图”。

前面的文章已经将“时基部分”的一些基础知识讲述过了,“时基部分”的功能是比较有用的,它除了可以用来延时(定时)之外,它还可以拿来触发其他一些功能,如:触发DA转换、AD采集等。

上一篇文章讲述的就是图中比较输出部分,比较输出部分功能相对比较简单。

该文主要讲述“输入捕获”部分,这部分输入的通道1与2、通道3与4可以相互协作。

该文只使用了TIM5的通道3,捕获输入信号频率。

通用TIM框图:
上面两图截取“STM32F4x5、x7参考手册”建议下载手册参看。

Ⅳ、源代码分析
笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为基础建立的工程,主要以库的方式来讲述。

1.RCC时钟
该函数位于bsp.c文件下面;
本文提供的例程也可以使用TIM2(只要将例程源代码中使用到的TIM5改为TIM2,以及引脚改正过来就行)。

重点注意:
A.外设RCC时钟的配置要在其外设初始化的前面;
B.匹配对应时钟。

比如:RCC_APB2外设不要配置在RCC_APB1时钟里面
【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】
2.TIM输入捕获引脚配置
该函数位于timer.c文件下面;
注意2点:
A.引脚与通道对应:这个需要参看“数据手册”,该文TIM5通道3对应的引脚就是PA2.
B.复用配置:GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM5);
这个地方对于F1转F0、F4等的朋友需要注意,更加芯片系列及库的不同,他们之间存在一定的差异。

3. TIM输入捕获配置
该函数位于timer.c文件下面;
“时基部分”是在前面两篇文章讲述过的,这里主要对“输入捕获”部分理解,主要5个参数:
捕获通道:就是我们捕获的通道;
捕获极性:就是我们捕获脉冲的高还是低电平;
捕获选择:是直接捕获该通道,还是上面说的1,2通道协助捕获;
捕获分频:对捕获的脉冲分频;
捕获滤波:过滤掉波形;
4. NVIC配置
该函数位于bsp.c文件下面;
这里不用多说,只是提醒大家不要忘记配置这里。

5. 计算捕获波形频率原理
该函数位于stm32f4xx_it.c文件下面;
该函数是中断函数,也是计算频率重要的函数;
A.两次捕获值
捕获配置中,捕获的极性是高电平,这里就是在“上升沿”中断(捕获),如果配置为“下降沿”,则是在信号的下降沿中断。

B.计算两次捕获差值
这里常人理解都是: capture = (capture_value2 - capture_value1);
但是,需要考虑另外两种情况,就是计数器在计满和相等时候。

C.计算频率
这里可以理解为:1秒钟计了多少个数。

但是需要注意的是截图中“/2”,对系统时钟除2,原因在于RCC给TIM提供的时钟就是除了2的,所以,这个地方需要/2.
Ⅴ、说明
关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。

以上总结仅供参考,若有不对之处,敬请谅解。

Ⅵ、最后
更多精彩文章我讲第一时间在微信公众号里面分享。

本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。

如果你觉得
分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper”或者扫描下面二维码、关注,将有更多精彩内容等着你。

---------------------
作者:ybhuangfugui
来源:CSDN
原文:https:///ybhuangfugui/article/details/51885924
版权声明:本文为博主原创文章,转载请附上博文链接!。

相关文档
最新文档