STM32F4_TIM输入波形捕获(脉冲频率、占空比)

发布者:Yuexiang最新更新时间:2017-02-05 来源: eefocus关键字:STM32F4  TIM  输入波形捕获  脉冲频率  占空比 手机看文章 扫描二维码
随时随地手机看文章

Ⅰ、概述

本文基于上一篇文章“TIM输入波形捕获(脉冲频率)”的基础上进行拓展,上一篇文章主要是捕获波形的频率,本文主要拓展捕获波形的占空比。

笔者实验测试的方法和上一篇文章一样,通过信号发生器产生PWM信号,通过串口发送频率和占空比到上位机(上位机串口助手显示其数值)。(没有信号发生器的朋友可以结合上一篇文章PWM输出做信号源;在同一块板子上也可以使用不同定时器,将PWM输出引脚接在捕获输入引脚)

实验现象:不同频率的实验现象请看上一篇文章(该文章提供的工程笔者也是进行了大量不同频率的测试,误差在几Hz属正常范围)。

1000Hz、20% - 80%占空比现象:

 

 

1000Hz、51% - 58%占空比现象:

 

关于本文的更多详情请往下看。

 

Ⅱ、实例工程下载

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

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

 

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

 

STM32F4_TIM输入波形捕获(脉冲频率、占空比)实例:

https://yunpan.cn/cB2iknrjczWXe  访问密码

 

STM32F4资料:

https://yunpan.cn/cR2pxqF5x2d9c  访问密码 53e7

 

 

Ⅲ、原理描述

笔者将捕获PWM波形简单画了一个示意图:

从上面的示意图可以看得出来我们需要捕获三个值(两个上升沿 和 中间的下降沿)。两个上升沿用于计算一个波形的周期(也就是可以计算其频率),因为捕获的“周期差值”就是脉冲数,而通过配置,我们可以知道每一个脉冲数的时间,这样就知道整个“周期差值”的时间。得到了“占空比差值”和“周期差值”,波形的占空比就得到了。

 

笔者将TIM分为三大块:时基部分、比较输出和输入捕获,请看下面截图“通用TIM框图”。

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

 

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

该文主要讲述“输入捕获”部分,这部分输入的通道1与2、通道3与4可以相互协作。该文只使用了TIM5的通道3,捕获输入信号频率。

 

通用TIM框图:

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

 

Ⅳ、源代码分析

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

源代码很多地方都是和上一篇文章源代码相同,只修改了几个地方(其实主要就是增加了一路捕获占空比相关的配置):输入引脚的配置、TIM捕获配置及其中断、中断函数处理、主函数发送数据。

RCC、NVIC等这些容易忘记配置的地方都一样。

 

1.TIM输入捕获引脚配置

该函数位于timer.c文件下面;

主要增加了一路引脚。

 

注意2点:

A.引脚与通道对应:这个需要参看“数据手册”,该文TIM5通道3对应的引脚就是PA2.

B.复用配置:GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM5);

这个地方对于F1转F0、F4等的朋友需要注意,更加芯片系列及库的不同,他们之间存在一定的差异。

 

2. TIM输入捕获配置

该函数位于timer.c文件下面;

和上一篇文章实例比:增加了TIM5通道4的配置。同时,分频值也改为了不分频。

 

“时基部分”是在前面两篇文章讲述过的,这里主要对“输入捕获”部分理解,主要5个参数:

捕获通道:就是我们捕获的通道;

捕获极性:就是我们捕获脉冲的高还是低电平;

捕获选择:是直接捕获该通道,还是上面说的1,2通道协助捕获;

捕获分频:对捕获的脉冲分频;

捕获滤波:过滤掉波形;

 

3. 计算捕获波形频率原理

该函数位于stm32f4xx_it.c文件下面;

 

该函数是TIM捕获波形的中断函数,同一个(TIM5)中断入口,有两个通道通道,也是计算频率和占空比重要的函数;

 

结合原理描述中“示意图”可以知道,我们需要捕获3个值:V0、V2和V1。

V0和V2是在通道3捕获:

capture_value0 = (uint32_t)(TIM5->CCR3);

capture_value2 = (uint32_t)(TIM5->CCR3);

 

V1在通道4捕获:
capture_value1 = (uint32_t)(TIM5->CCR4);

 

其中有一个标志位flag_capture是用于标志我们捕获的状态,我们捕获了V0将flag_capture = 1就是告诉程序我们要捕获V1 和 V2的值了。

 

Ⅴ、说明

这篇文章是结合前几篇文章来讲述的,可以在微信“历史消息”中查看。

关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。

 

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


关键字:STM32F4  TIM  输入波形捕获  脉冲频率  占空比 引用地址:STM32F4_TIM输入波形捕获(脉冲频率、占空比)

上一篇:STM32普通定时器(TIM2-7)的时钟源
下一篇:stm32f4在液晶上画圆及填充圆的几种方法

推荐阅读最新更新时间:2024-03-16 15:32

关于由CubeMx生成stm32f4+freertos,不正常分析之堆栈大小设置
freertos官方手册上有说,移植中出现的问题大多数是由堆栈设置不合理造成的,今天结合自身遇到问题分析一下 1.任务堆栈设置过小,很容易造成硬件溢出,跳转到void HardFault_Handler(void); 调试方法,可以通过调用函数,UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );来跟踪剩余堆栈, 不过在CubeMx中的Configuration- FreeRtos- Include parameters中使能uxTaskGetStackHighWaterMark函数; 2.整体设置过小,TOTAL_HEAP_SIZE(Conf
[单片机]
RTC_WakeUp中断唤醒STM32F4停止模式
RTC_WakeUp唤醒STM32F4停止模式(借鉴的是原子哥写的代码): 首先我们先初始化RTC配置: //RTC初始化 u8 MyRTC_Init(void) { RTC_InitTypeDef RTC_InitStructrue; u16 retry=0x1FFF; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR时钟 PWR_BackupAccessCmd(ENABLE);//使能后备寄存器 if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050) { RCC_LSEConfig(R
[单片机]
stm32f407】stm32串口实验
一.串口理论 串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。 STM32F407VGT6内嵌四个通用同步/异步接收器(USART1,USART2,USART3和USART6) 和两个通用异步收发器(UART4和UART5),如图: 另外,usart和uart的差异在于usart是同步串口(亦可用于异步串口),uart是异步串口,差异如下: 同步通信:带时钟同步信号传输。 异步通信:不带时钟同步信号。 按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,
[单片机]
【<font color='red'>stm32f4</font>07】stm32串口实验
stm32f407之基本定时器TIM6&TIM7(操作寄存器)
基本定时器TIM6和TIM7包括一个由可编程分频器驱动的16位自动重载计数器。它可以用作普通的定时器,也可以用来驱动DAC。这两个定时器是完全独立的,不共享任何资源。更多时候是与DAC平配合使用。 作为定时器的配置步骤: 1.设置中断优先级分组(如果之前没有设置),这个最好一个程序里只在开头设置一次。 2.使能相关时钟。 3.设置分频。 4.清空计数器的值。 5.设置自动重装寄存器的值。 6.是否允许中断。 7.如果允许中断,设置中断优先级,使能中断。 8.使能计数器。 程序: /************************************ 标题:定时器TIM7
[单片机]
STM32CubeMX生成F1的工程中提示找不到 __HAL_TIM_SetCompare 问题
1. 问题描述 在用STM32CubeMX生成 STM32F103C8T6 的MDK工程后,在main.c中更改定时器占空比计数值的时候,报错: 总之就是HAL库内部API函数__HAL_TIM_SetCompare找不到。 2. 解决方案 经过搜索,该函数在stm32_hal_legacy.h文件中: 所以出错原因肯定是:调用此函数的时候没有包含进来这个头文件,再次通过文件名查找: 果然,包含此头文件需要定义宏USE_HAL_LEGACY。 在它前面define一下: 重新编译,问题解决成功! 这样添加之后,重新使用STM32CubeMX生成工程后,代码会被自动覆盖,需要重新添加!
[单片机]
STM32CubeMX生成F1的工程中提示找不到 __HAL_<font color='red'>TIM</font>_SetCompare 问题
STM32F407ZGT6学习之串口驱动学习
工程代码:https://pan.baidu.com/s/1Qlfg1_br0tN6yy0fcDwCjg,密码:fhh2 (一)、概述 STM32的通用同步异步收发器 (USART),相当于一座桥梁,外界设备和通过串口协议和STM32进行数据的交互。MCU把数据写到串口的数据寄存器中,串口把数据封装成符合串口协议的数据帧,发送给接收设备;或者发送设备发送数据帧给MCU,串口在接收到数据帧之后,去掉封装的位数据,并把数据放在串口的数据寄存器中,等到MCU的读取。 1、串口框架图 2. 串口的数据帧格式 串口通信需要遵循一定的帧格式,串口传输的每个字节,都是通过把该字节封装成下面图所示的数据帧,再进行传输的。空闲状
[单片机]
<font color='red'>STM32F4</font>07ZGT6学习之串口驱动学习
stm32 中空编码器tim4初始化
#include stm32f10x.h #include encode.h #include misc.h #include nvic.h #include sys.h #include delay.h void TIM4_Mode_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; //PB6 ch1 A,PB7 ch2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_
[单片机]
stm32f407驱动步进电机(用限位传感器限制位置)
一、硬件 1.硬件准备:57步进电机(型号57CM18),驱动器TB6600,开发板STM32F407ZGT6, SN-4NDO限位金属传感器,检测面在9mm左右。 2.连线 驱动器右边分有两个区域 Signal:用于驱动器与开发板连接,进行电机的控制驱动。 ENA接口:当此信号有效时,驱动器将自动切断电机绕组电流,使电机处于自由状态(无保持转矩)。当此信号不连接时默认为无效状态,这时电机绕组通以电流,可正常工作。 DIR接口:控制电机旋转方向,信号有效时电机顺时针旋转,无效时逆时针旋转。 PUL接口:步进电机驱动器把控制器发出的脉冲信号转化为步进电机的角位移,驱动器每接受一个脉冲信号 PUL,就驱动步进电机
[单片机]
<font color='red'>stm32f4</font>07驱动步进电机(用限位传感器限制位置)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved