STM32的定时器模块有很强大的功能,除了普通的定时功能之外还可以进行输入捕获和输出比较(PWM),PWM已在别的文章中介绍过,现在介绍一下输入捕获。
在这里先说本人在测试时想到的两个疑问:
疑问1:STM32的同一个定时器是否能同时进行输入捕获和输出比较(PWM)?
疑问2:假设疑问1的答案是可以,那输入捕获的范围是不是受限制?
功能实现:
1、既然是输入捕获,肯定需要相关引脚对信号进行检测,所以需要查找开发手册和数据手册来确定是哪几个引脚,要用哪几个引脚,然后给予合适的配置(图1)。
2、要进行输入捕获实验,首先需要配置某个定时器的时基功能,这样我们才能根据这个时基计算我们的捕获信息;其次就是要配置输入(通道、边沿设置、映射、分频是几次时间、滤波是单次事件的采样次数);还要配置中断优先级,同时启动相关中断(图2);
3、为了解答前面的疑问,我们在同一个定时器里添加PWM输出,配置方式可以参考手册(图3);
4、使能定时器。
5、添加相关中断函数,这里设计到更新中断和捕获中断。需要说明的是,本实验的主要目的是为了测试捕获实验,通过不惑实验可以实现对固定频率的脉冲频率检测,或者脉宽检测等,本实验中刚好输出了PWM波,所以可以尝试的测测频率。思路是这样的:既然是固定频率和占空比的PWM波,那我可以连续测两次上升沿,将两次上身沿之间的计数器相减,然后根据定时器预分频值计算频率。由于在实际测试中存在所测频率很低,可能在两个上升沿之间定时器计数器更新了好几次,所以需要添加更新中断来记录这个更新(图4)。其中"Time2_Ch1_Cap_FreVal = TIM_GetCapture1(TIM2) + (Arr_Val + 1)*(Time2_Ch1_Cap_Sta&0x1F) - Time2_Ch1_Cap_Val;"是计数记录的最终结果值。
6、主函数中轮询判断是不是已经检测完成一次测试了,如果是,那清除掉相关屏蔽,然后利用"72000000/((Psc_Val+1)*(Time2_Ch1_Cap_FreVal))"
计算出频率。其中有一些小技巧,在对Time2_Ch1_Cap_Sta状态值清除的时候只清除0x80和0x20,是为了实现只有在两个上升沿之间进行更新记录(图5)。
疑问解答:
1、通过上面的介绍我们知道,可以用一个定时器实现既进行输入捕获,又进行PWM输出;
2、捕获的频率范围是否受限制,答案是不一定。以本实验为例,arr= 899,psc= 3;那么很明显,该实验中定时器的时钟频率是18M,所以当所测信号频率太高,在一个计数值跳变之间发生了两次上升沿,这种是测不出来的,或者测出来也是不准确的,也就是说当所测的信号频率越接近该定时器的时钟频率,误差值就越大,在实测的时候600K的频率就有点问题了(也可能是操作问题,该数据没有太大参考价值)。那么反过来,当所测频率很低,那测试结果怎么样,这个时候大家只要保证记录定时器更新的变量不要溢出,在计算过程中所有相关变量不要因为其他值的影响而不准确就不会有太大误差,在本例程中Time2_Ch1_Cap_Val定义为u8类型,可用的就低5位,最大值也就是31,计算可以知道能测的最低频率645.16多,所以如果要再低,就设置该变量为u16类型,把特殊比特位左移就行了(图6)。
输入捕获能需要结合自己的算法逻辑,可以实现不同的作用,需要我们结合自身项目开发。
关键字:STM32 定时器 TIME模块 输入捕获
引用地址:
STM32——定时器TIME模块之输入捕获
推荐阅读最新更新时间:2024-03-16 16:21
一个严谨的STM32串口DMA发送&接收机制
1 前言 直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。 因此,大量数据拷贝时,使用DMA可以释放CPU资源。DMA数据拷贝过程,典型的有: 内存— 内存,内存间拷贝 外设— 内存,如uart、spi、i2c等总线接收数据过程 内存— 外设,如uart、spi、i2c等总线发送数据过程 2 串口有必要使用DMA吗 串口(uart)是一种低速的串行异步通信,适用于低速通信场景,通常使用的波特率小于或等于115200bps。 对于小于或者等于115200bps波特率
[单片机]
MSP430定时器中断程序
#include msp430g2452.h int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0; //P1.0设定为输出 P1OUT |= BIT0; //P1.0拉高 TACCTL0 = CCIE; //CCR0中断使能 TACCR0 = 50000; //终点值 //使用连续计数模式的话,此值不会有影响 TACTL = TASSEL_2 + MC_2;//控制定时器A 选择timer时钟ACLK和连续计数模式 _EINT
[单片机]
stm32引脚的VCC与VDD如何连接
stm32单片机作为一种常见的嵌入式设备,是许多电子设备和系统中必不可少的一部分。而在单片机的设计和应用中,电源电压是一个非常重要的参数,其中VCC和VDD作为单片机中的电源引脚,是最为关键的两个引脚之一。本文将介绍VCC和VDD的区别及其在单片机中的应用。 一、VCC与VDD的区别 在单片机中,VCC是最常见的电源引脚,通常用于提供数字电路中需要的正向电压。VCC的电压通常是3.3V或5V,但也有其他电压等级的单片机。 而VDD是一种特殊类型的电源电压,它是指在CMOS电路中使用的电源电压。在CMOS电路中,晶体管使用的是MOSFET,其工作需要两种类型的电压:正向电压和反向电压。VDD是指MOSFET工作时需要的正向电压,
[单片机]
STM32不同型号单片机keil工程移植说明
STM32系列单片机如果库函数开发的话,那么不同型号单片机的工程是可以直接移植的。这样的话如果项目中更换了芯片,工程就可以直接移植过去,不用重新编写。这样就节约了很多时间。 下面说一下如何将 在STM32F103RCT6单片机上开发的工程,移植到STM32F103C8T6单片机上。移植工程之前,首先要确保工程中用到的IO口,在两个芯片中都有。否则如果工程中使用IO在一个芯片上有,另一个芯片上没有,那么是不能直接移植的,需要更改 IO口后才能使用。 相关IO口可以在官方芯片资料中查看 如上图所示 PC0口,在48个引脚的单片机中是没有的,在其他单片机中的引脚位置也不一样。移植的时候引脚位置要确认好,看看位置不同是否影响使
[单片机]
STM32 中断配置 自我学习总结
简单记录一下STM32 的中断配置说明! ----第一部分是---中断向量表----- --------这个只是简单参照----不同版本也有些不一样--但是大同小异----自己可以到启动文件---startup_stm32f10x_hd.s中去查找。 ----第二部分---中断优先级配置 static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //分组 NVIC_InitStructure.NVIC_IRQChannel =
[单片机]
STM32学习之:stm32中C语言的数据类型
在编程过程中,不同的CPU,其数据类型的意义各不相同,所以一定要注意相应变量数据类型的定义和转换,否则在计算中可能会出现不确定的错误。 (一)C语言中的种类数据 整型:int short long 实型:float double STM32中的数据类型非常的多,常用的变量,文件中的定义如下: /* exact-width signed integer types */ typedef signed char int8_t; typedef signed short int int16_t; typedef signed int int32_t; typedef signed
[单片机]
STM32之SPI模式
SPI协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的 通信总线,它由摩托罗拉公司提出,当前最新的为V04.01-2004版。 根据SPI时钟极性(CPOL)和时钟相位(CPHA)配置的不同,分为4种SPI模式。 时钟极性是指SPI通信设备处于空闲状态时(也可以认为这是SPI通信开始时,即SS线 为低电平时),SCK信号线的电平信号。CPOL=0时,SCK在空闲状态时为低电平,CPOL=1时则相反。 时钟相位是指数据采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的奇数边沿被采样。当CPHA=1时,数据线在SCK的偶数边
[单片机]
stm32烧录的程序为什么会丢失呢
第一次用stm32烧录程序的时候还是很正常的,但没过多久,我又按照以前的步骤再去烧录程序,发现stm32一但按复位,就会莫名其妙的消失,这是怎么回事啊? 小编最近看到有网友在疑惑stm32烧录的程序为什么会丢失呢?在此,小编将给大家分析一下stm32烧录程序丢失的原因。 首先,你要弄清楚自己的在线烧录是通过什么方法烧录的,只有先搞明白这个问题,你才好对症下药。 1、检查一下是不是光盘的质量或者是刻录软件出了问题。毕竟这个问题说大不大,说小不小,还是会影响到stm32烧录程序的。质量好一点的光盘是能够保证程序的稳定运行的。 2、如果你的程序烧写在flash中,那么stm32烧录的程序遇到复位或者掉电是都不会消失的。 3、stm3
[单片机]