深入理解STM32定时器中的输入捕获滤波器
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。
stm32定时器原理
stm32定时器原理STM32定时器是一种非常重要的硬件模块,能够实现精确的时间控制和周期性操作。
本文将介绍STM32定时器的原理,包括定时器的基本功能、定时器的分频器、定时器的计数器、定时器的中断、定时器的输出比较和定时器的输入捕获等。
首先介绍定时器的基本功能,STM32定时器可以产生一个特定的周期性信号,在一定的时间间隔内产生触发事件,例如控制LED闪烁、蜂鸣器发声等等。
此外,定时器还可以通过设定特定的计数值来实现定时功能,如延时、计时器等等。
其次介绍定时器的分频器,STM32定时器的分频器可以设置定时器的工作频率,通常是通过将系统时钟分频来实现。
分频器的设置可以通过修改寄存器的值来实现,通常是通过设置预分频器和分频器来实现。
接着介绍定时器的计数器,STM32定时器的计数器是用来记录分频器的计数值,通过相应的计数值来确定定时器的工作周期。
定时器的计数器可以在特定的条件下自动重置或停止,以实现特定的计时或延时功能。
然后介绍定时器的中断,STM32定时器的中断可以在定时器计数器达到特定的值时触发,然后执行中断服务程序。
在中断服务程序中可以实现特定的操作,例如控制IO口状态、改变定时器的工作频率等。
接下来介绍定时器的输出比较,STM32定时器的输出比较可以将定时器的输出信号与预设的比较值进行比较,以实现特定的操作。
例如可以控制LED的亮度、PWM信号、电机控制等等。
最后介绍定时器的输入捕获,STM32定时器的输入捕获可以在外部信号产生时捕获定时器的计数值,可以用于测量脉冲宽度、频率等等。
定时器的输入捕获通常需要设置定时器的捕获模式和捕获通道等参数。
综上所述,STM32定时器是一种非常重要的硬件模块,应用广泛,我们需要充分理解其原理和应用,以实现精确的时间控制和周期性操作。
STM32输入捕获模式
STM32输入捕获模式
在输入捕获模式下,定时器将统计外部信号的上升沿或下降沿出现的
时间,并将统计结果保存在相关的寄存器中。
用户可以根据需要选择统计
上升沿还是下降沿,并可以选择计数溢出时是否复位计数器。
1.选择定时器和通道:根据实际需求选择合适的定时器和通道。
一般
来说,每个定时器都有多个通道可以配置为输入捕获模式。
2.配置定时器:根据测量的要求配置定时器的工作模式、计数方向和
预分频系数等。
定时器的配置将影响捕获的精度和测量范围。
3.配置输入捕获:选择捕获触发源,可以选择外部信号引脚或其他定
时器的输出作为触发源。
配置捕获触发源时还可以选择捕获的边沿类型
(上升沿或下降沿)和是否复位计数器。
4.开启定时器:配置完成后,通过使能相关的定时器和通道将输入捕
获模式启用。
5.捕获外部信号:当捕获触发源产生触发信号时,定时器将开始计数,当捕获到外部信号的边沿时,定时器会自动将计数值保存在指定的寄存器中。
6.读取测量结果:根据所选择的定时器和通道,从相关的寄存器中读
取测量结果,可以通过计算得到所需的参数,比如周期、脉宽等。
输入捕获模式在很多应用中都是非常常见且重要的。
例如在测量旋转
编码器的位置和速度时,可以使用输入捕获模式来捕获编码器的A相和B
相信号,并通过计算来确定位置和速度。
此外,输入捕获模式还可以用于
测量外部信号的频率、测量脉冲信号的宽度等。
总之,STM32输入捕获模式是一种功能强大且灵活的功能,能够帮助用户实现对外部信号的精确测量和控制。
通过合理配置和使用,可以满足各种不同的应用需求。
理解STM32定时器中的输入捕获滤波器
理解STM32定时器中的输入捕获滤波器关于STM32定时器中的输入捕获滤波器的功能描述,在中文参考手册中描述如下:我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话:1)当滤波器连续采样到N次个有效电平时,认为一次有效的输入电平。
2)该数字滤波器实际上是个事件计数器,它记录到N个事件后会产生一个输出的跳变。
例如:当f(CK_INT) = 72MHz, CKD[1:0] = 01时,选择f(DTS) = f(CK_INT)/2 = 36MHz;而ETF[3:0] = 0100,则采样频率f(SAMPLI NG) = f(DTS) / 2 = 18MHz, N = 6,此时高于3M Hz的信号将被这个滤波器滤除,这样就有效地屏蔽了高于3MHz的干扰。
看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下:问题1:当滤波器连续采样到N次个有效电平时,是输出这个电平?还是输出一个跳变?问题2:当滤波器没有连续采样到N次个有效电平时,输出是的什么?带着这两个问题,我们来分析一下,下面以TIM3为例:首先可以肯定输入捕获过程如下:详细信息见参考手册中的14.2节,通用定时器框图TIM3_C H1(PA.6) ----> TI1(外部信号) -------> 输入滤波器I C1F[3:0] -----> IC1(滤波器输出信号) -------> 输入捕获预分频器IC1PSC[1:0] ----> 捕获/比较1寄存器CCR1从上面的过程可以知道,1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。
2)滤波器和预分频器可软件编程,如果IC1F[3:0] = 0x0,则滤波器全通,即TI1 和IC1是同一个信号。
STM32F4_TIM输入波形捕获(脉冲频率)
本文在前面文章“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,捕获输入信号频率。
stm32的定时器输入捕获与输出比较讲解
stm32的定时器输入捕获与输出比较(2015-09-28 09:26:24)转载▼分类:stm32标签:it明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。
外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。
时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。
输出比较:定时器中计数寄存器在初始化完后会自动的计数。
从bottom计数到top。
并且有不同的工作模式。
另外还有个比较寄存器。
一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。
然后根据不同的工作模式计数寄存器将清零或者计数到top值。
1、朋友,可以解释一下输入捕获的工作原理不?计数寄存器的初值,是自己写进去的吗?我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。
对不?timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不?那输出比较的原理你可以帮我介绍一下不?比较单元的值是人为设进去的吧?是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器。
上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了”就是比较匹配了你要IO电平怎么办?是清0还是置1?还是怎么样?这样才能产生波形啊要不然你要比较单元有什么用呢?设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不?是的你理解的很快011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?恩定时器1的输出比较模式怎么用。
stm32数字带通滤波例程
stm32数字带通滤波例程一、概述STM32数字带通滤波原理STM32数字带通滤波例程是一种基于STM32微控制器的数字信号处理技术。
带通滤波器是一种允许特定频率范围内信号通过的滤波器,对于去除噪声、提取有用信号具有重要作用。
STM32数字带通滤波例程通过设计数字滤波器,实现对输入信号的滤波处理,从而满足各种应用场景的需求。
二、详述STM32数字带通滤波算法实现1.选择合适的数字滤波器类型:常见的数字滤波器类型有FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器。
FIR滤波器具有线性相位、频率响应平坦等特点,IIR滤波器则具有实现简单、低阶滤波器性能较好等优点。
在STM32数字带通滤波例程中,可根据需求选择合适的滤波器类型。
2.设计数字滤波器的参数:数字滤波器的参数包括截止频率、通带衰减、阻带衰减等。
设计时需要根据实际应用场景和性能要求,合理设置滤波器参数。
3.实现数字滤波器:利用STM32内部的数字信号处理(DSP)模块或软件算法实现数字滤波器。
STM32提供了丰富的内置滤波器库,方便开发者快速实现数字滤波器。
4.滤波器系数优化:为了提高滤波器性能,可以通过调整滤波器系数进行优化。
常用的优化方法有最小二乘法、最小化误差平方和等。
三、分析STM32数字带通滤波性能及优化方法1.滤波性能:STM32数字带通滤波例程的性能主要体现在滤波器的频率响应、相位响应和幅频响应等方面。
通过合理设计滤波器参数和优化算法,可以实现高性能的带通滤波器。
2.优化方法:针对STM32数字带通滤波例程的性能优化,可以采用以下方法:a.调整滤波器阶数:增加滤波器阶数可以提高滤波器的性能,但同时会增加计算复杂度和资源消耗。
b.优化滤波器系数:通过最小化误差平方和等方法,调整滤波器系数,以提高滤波器性能。
c.采用多级滤波器:将带通滤波器分为多级,逐级优化,以提高整体性能。
四、总结STM32数字带通滤波应用场景及优势1.应用场景:STM32数字带通滤波例程广泛应用于各种电子设备中,如通信、音频处理、图像处理等领域。
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。
stm32 pwm输入捕捉模式学习笔记
stm32 pwm输入捕捉模式学习笔记(本文来自:android_chunhui的博客)PWM输入是输入捕获的一个特殊应用,输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。
你可以开启捕获中断然后在中断处理函数中读出保存的计数值。
主要用于读取pwm的频率和占空比。
与输入捕获不同的是PWM输入模式时,用到两个通道(一般用TIMx_CH1或TIMx_CH2),只给其中一个通道分配gpio时钟即可,另一个在内部使用。
给一个通道分配gpio时钟后,需要设置另一个为从机且复位模式。
(例如使用ch2,ch1就得设置成从机模式)。
当一个输入信号(TI1或TI2)来临时,主通道捕获上升沿,从机捕获下降沿。
假设pwm从低电平开始触发,当上升沿来临时,两个通道TIM_CNT均复位开始计数,下一个下降沿来临,从机读取TIM_CNT中的值,记为CCR1,下一个上升沿来临,主通道读取TIM_CNT的值,记为CCR2。
所以CCR2/f,为pwm周期,倒数即频率。
CCR1/CCR2就是占空比。
下面是pwm捕获模式下的配置:void Tim2_PWMIC_Init(void){TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //***通道选择,通道一为从机TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //管脚与寄存器对应关系TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入预分频。
STM32CAN滤波器、滤波屏蔽器设置详解
CAN_FiIterI nitStructure.CAN_FiIterMaSkIdLOW= OXFFFF;//完
全匹配
CAN_FiIterI nitStructure.CAN_FiIterFIFOASSig nmen t=CAN_FIFO0;
〃使用FIFOO
CAN_FiIterI nitStructure.CAN_FiIterACtiVatiO n=ENABLE;//使能过
滤器
CAN_FiIterI nit(&CAN_FiIterI nitStructure);
CAN_ITCOnfig(CAN1,CAN_IT_FMP0|CAN_IT_EPV, ENABLE);
}
/*CAN发送函数*/
Un Sig ned Char CAN1_Se ndData(void)
{
Can TXMSg TXMeSSage;
CAN _ln itStructure.CAN_NART=ENABLE;〃ENABLE;报文自动重传
CAN」nitStructure.CAN_RFLM=DISABLE;〃接收溢出时,FlFO未锁定
CAN」n itStructure.CAN_TXFP=DISABLE;〃发送的优先级由标示符的
大小决定
CAN」n itStructure.CAN_Mode=CAN_Mode_Normal;〃正常模式下
(1)位宽为32位的过滤器,优先级高于位宽为16位的过滤器。
(2)对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式。
(3)位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优 先级高。
按这样的顺序,报文能通过的第一个过滤器,就是该报文的过滤器编号,被 存入接收邮箱中。
STM32HAL库学习系列第7篇---定时器TIM输入捕获功能
STM32HAL库学习系列第7篇---定时器TIM输⼊捕获功能测量脉冲宽度或者测量频率基本⽅法1.设置TIM2 CH1为输⼊捕获功能;2.设置上升沿捕获;3.使能TIM2 CH1捕获功能;4.捕获到上升沿后,存⼊capture_buf[0],改为捕获下降沿;5.捕获到下降沿后,存⼊capture_buf[1],改为捕获上升沿;6.捕获到上升沿后,存⼊capture_buf[2],关闭TIM2 CH1捕获功能;7.计算:capture_buf[2] - capture_buf[0]就是周期,capture_buf[1] - capture_buf[0]就是⾼电平所占时间。
时钟配置:引脚看是否需要上拉做项⽬中的⼀个例⼦:/*** 函数功能: TIM_IC配置* 输⼊参数: value* 返回值: ⽆* 说明: ⽆*/void user_ic_config(uint16_t value){TIM_IC_InitTypeDef sConfigIC;if(value != 0) //1{sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;//上升沿}else//0{sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; //下降沿}sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0;HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);}/*** 函数功能: TIM_IC回调函数* 输⼊参数: htim* 返回值: ⽆* 说明: 得到转速*/void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){static uint32_t uwICValue;static uint32_t last_uwICValue;uint32_t uwDiffCapture;if ( ((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)||(htim->Channel== HAL_TIM_ACTIVE_CHANNEL_4)) && (htim->Instance == TIM3) ) {pulseCntr++;last_uwICValue = uwICValue;uwICValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_3) != HAL_OK) //开启定时器中断{}if (uwICValue > last_uwICValue){uwDiffCapture = (uwICValue - last_uwICValue); //脉冲宽度为前后两个周期相减}else if (uwICValue < last_uwICValue) //若超值{/* 0xFFFF is max TIM2_CCRx value */uwDiffCapture = ((0xFFFF - last_uwICValue) + uwICValue) + 1;}if(uwDiffCapture < 0x10000){middleCapture = uwDiffCapture; //脉冲宽度}pulsein_flag = 1; // 捕捉到标记}else if ( (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) && (htim->Instance == TIM2) ){if(uhCaptureIndex == 0){// 第⼀个脉冲,检测的是上升沿uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);uhCaptureIndex = 1;user_ic_config(0); //下降if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK) //中断{}}else if(uhCaptureIndex == 1){uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);uhCaptureIndex = 0;user_ic_config(1);//上升if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK){}/* Capture computation */if (uwIC2Value2 > uwIC2Value1){uwDiffCapture = (uwIC2Value2 - uwIC2Value1); //脉冲宽度 }else if (uwIC2Value2 < uwIC2Value1){/* 0xFFFF is max TIM2_CCRx value */uwDiffCapture = ((40000 - uwIC2Value1) + uwIC2Value2) + 1; }RCin = uwDiffCapture/2; //删除}}}应⽤:1.脉冲时间测量2.电容按键使⽤。
(stm32f103学习总结)—输入捕获模式
(stm32f103学习总结)—输⼊捕获模式⼀、输⼊捕获介绍 在定时器中断实验章节中我们介绍了通⽤定时器具有多种功能,输⼊捕获就是其中⼀种。
STM32F1 除了基本定时器 TIM6和 TIM7,其他定时器都具有输⼊捕获功能。
输⼊捕获可以对输⼊的信号的上升沿,下降沿或者双边沿进⾏捕获,通常⽤于测量输⼊信号的脉宽、测量 PWM 输⼊信号的频率及占空⽐。
输⼊捕获的⼯作原理⽐较简单,在输⼊捕获模式下,当相应的 ICx 信号检测到跳变沿后,将使⽤捕获/⽐较寄存器(TIMx_CCRx)来锁存计数器的值。
简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发⽣跳变(⽐如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/⽐较寄存(TIMx_CCRx)⾥⾯,完成⼀次捕获。
同时还可以配置捕获时是否触发中断/DMA 等。
下⾯我们以输⼊捕获测量脉宽为例,通过⼀个简图来介绍输⼊捕获的⼯作原理,如图所⽰: 从上图可以看出,t1-t2 时间就是我们需要测量的⾼电平时间,假如定时器⼯作在向上计数模式,测量⽅法是:⾸先设置定时器通道 x 为上升沿捕获,这样在 t1 时刻,就会捕获到当前的 CNT 值,然后⽴即清零 CNT,并设置通道 x 为下降沿捕获,这样到 t2 时刻,⼜会发⽣捕获事件,得到此时的 CNT 值,记为 CCRx2。
根据定时器的计数频率,我们就可以算出 t1-t2 的时间,从⽽得到⾼电平脉宽。
在 t1-t2 时间内可能会出现 N 次定时器溢出,因此我们还需要对定时器溢出进⾏处理,防⽌因⾼电平时间过长发⽣溢出导致测量数据不准。
CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即⾼电平持续时间。
⼆、输⼊捕获配置步骤(1)使能定时器及端⼝时钟,并设置引脚复⽤器映射和引脚模式等 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;(2)初始化定时器参数,包含⾃动重装值,分频系数,计数⽅式等 TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);(3)设置通⽤定时器的输⼊捕获参数,开启输⼊捕获功能 TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);(4)开启捕获和定时器溢出(更新)中断 TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)(5)设置定时器中断优先级,使能定时器中断通道 NVIC初始化库函数是 NVIC_Init()(6)使能定时器 TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);(7)编写定时器中断服务函数 void TIM5_IRQHandle()三、代码举例所要实现的功能是:使⽤TIM5的CH1检测输⼊信号⾼电平脉宽,将检测的⾼电平脉宽时间通过printf函数打印出来,同时让D1指⽰灯不断闪烁表⽰系统正常运⾏。
stm32定时器定时器中断PWM输出输入捕获
stm32定时器定时器中断PWM输出输⼊捕获STM32F4 的通⽤定时器包含⼀个 16 位或 32 位⾃动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。
STM32F4 的通⽤定时器可以被⽤于:测量输⼊信号的脉冲长度(输⼊捕获)或者产⽣输出波形(输出⽐较和 PWM)等。
使⽤定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在⼏个微秒到⼏个毫秒间调整。
STM32F4 的每个通⽤定时器都是完全独⽴的,没有互相共享的任何资源。
STM3 的通⽤ TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:1)16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下⾃动装载计数器(TIMx_CNT),注意: TIM9~TIM14 只⽀持向上(递增)计数⽅式。
2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
3) 4 个独⽴通道(TIMx_CH1~4, TIM9~TIM14 最多 2 个通道),这些通道可以⽤来作为:A.输⼊捕获B.输出⽐较C. PWM ⽣成(边缘或中间对齐模式) ,注意: TIM9~TIM14 不⽀持中间对齐模式D.单脉冲模式输出4)可使⽤外部信号(TIMx_ETR)控制定时器和定时器互连(可以⽤ 1 个定时器控制另外⼀个定时器)的同步电路。
5)如下事件发⽣时产⽣中断/DMA(TIM9~TIM14 不⽀持 DMA):A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)B.触发事件(计数器启动、停⽌、初始化或者由内部/外部触发计数)C.输⼊捕获D.输出⽐较E.⽀持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不⽀持)F.触发输⼊作为外部时钟或者按周期的电流管理(TIM9~TIM14 不⽀持)下⾯我们介绍⼀下与我们这章的实验密切相关的⼏个通⽤定时器的寄存器(以下均以 TIM2~TIM5 的寄存器介绍, TIM9~TIM14 的略有区别,具体请看《STM32F4xx 中⽂参考⼿册》对应章节)。
STM32F4 第17讲 输入捕获实验-TIMER-M4
✓ 通用定时器PWM概述
通道极性设置独立函数:
void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
获取通道捕获值
uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);
✓ 通用定时器PWM概述
✓ 通用定时器PWM概述
步骤1:设置输入捕获滤波器(通道1为例)
✓ 通用定时器PWM概述
步骤2:设置输入捕获极性(通道1为例)
✓ 通用定时器PWM概述
步骤三:设置输入捕获映射通道(通道1为例)
✓ 通用定时器PWM概述
步骤四:设置输入捕获分频器(通道1为例)
✓ 通用定时器PWM概述
步骤五:捕获到有效信号可以开启中断
输入捕获的一般配置步骤:
① 初始化定时器和通道对应IO的时钟。 ② 初始化IO口,模式为复用:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; ③设置引脚复用映射:
GPIO_PinAFConfig(); ④初始化定时器ARR,PSC
TIM_TimeBaseInit(); ⑤初始化输入捕获通道
TIM_ICInit(); ⑥如果要开启捕获中断,
TIM_ITConfig(); NVIC_Init(); ⑦使能定时器:TIM_Cmd(); ⑧编写中断服务函数:TIMx_IRQHandler();
✓ 通用定时器PWM概述
实验目的:测量信号的脉冲宽度
✓ 通用定时器PWM概述
✓ 3. 输入捕获实验讲解 端口输入捕获实验
目录
1
通用定时器输入捕获概述
STM32CAN滤波器、滤波屏蔽器设置详解
STM32 CAN 过滤器、滤波屏蔽器配置总结下面容为:一、在STM32互联型产品中,CAN1和CAN2分享28个过滤器组,其它STM32F103xx系列产品中有14个过滤器组,用以对接收到的帧进行过滤。
1、过滤器组每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。
这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上"过"一下,能通过的报文是有效报文,收进相关联FIFO(FIFO1或FIFO2),不能通过的是无效报文(不是发给"我"的报文),直接丢弃。
(标准CAN的标志位长度是11位。
扩展格式CAN的标志位长度是29。
CAN2.0A协议规定CAN控制器必须有一个11位的标识符。
CAN2.0B协议中规定CAN控制器的标示符长度可以是11位或29位。
STM32同时支持CAN2.0A/CAN2.0B协议。
)每组过滤器组有两种工作模式:标识符列表模式和标识符屏蔽位模式。
标识符屏蔽位模式:可过滤出一组标识符。
此时,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。
标识符列表模式:可过滤出一个标识。
此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。
注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐起。
所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。
按工作模式和宽度,一个过滤器组可以变成以下几中形式之一:(1) 1个32位的屏蔽位模式的过滤器。
深入理解STM32定时器中的输入捕获滤波器
我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话: 1)当滤波器连续采样到 N 次个有效电平时,认为一次有效的输入电平。 2)该数字滤波器实际上是个事件计数器,它记录到 N 个事件后会产生一个输出 的跳变。 例如:当 f(CK_INT) = 72MHz, CKD[1:0] = 01 时,选择 f(DTS) = f(CK_INT)/2 = 36MHz; 而 ETF[3:0] = 0100,则采样频率 f(SAMPLING) = f(DTS) / 2 = 18MHz, N = 6, 此时高于 3MHz 的信号 将被这个滤波器滤除,这样就有效地屏蔽了高于 3MHz 的干扰。 看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下: 问题 1:当滤波器连续采样到 N 次个有效电平时,是输出这个电平?还是输出一 个跳变? 问题 2:当滤波器没有连续采样到 N 次个有效电平时,输出是的什么? 带着这两个问题,我们来分析一下,下面以 TIM3 为例: 首先可以肯定输入捕获过程如下:详细信息见参考手册中的 14.2 节,通用定时 器框图 TIM3_CH1(PA.6) ----> TI1( 外部 信号 ) -------> 输; IC1( 滤波器输出信号 ) -------> 输入捕获 预 分频器 IC1PSC[1:0] ----> 捕获/比较 1 寄存器 CCR1 从上面的过程可以知道, 1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。 2)滤波器和预分频器可软件编程,如果 IC1F[3:0] = 0x0,则滤波器全通,即 TI1 和 IC1 是同一个信号。 借助这两点分析,我假设的滤波器的工作原理是: 问题 1 猜测答案: 当滤波器连续采样到 N 次个有效电平时, 就输出这个有效电平。 问题 2 猜测答案: 当滤波器没有连续采样到 N 次个有效电平时, 再从 0 开始计数, 输出一直保持上一次输出的有效电平。例如:滤波器上一次输出是高电平,本次 连续采样到 N-1 个高低平, 但第 N 是个低电平,那么滤波器仍然保持上次输出的 高电平,并重新开始计数,记录 1 次低电平,如果在其后采样的 N-1 个也是低电 平,此时滤波才输出低电平,于是一个下降沿才出现在 IC1 上。 举例:如果我们产生一个 f = 1MHz 的占空比为 50%的方波信号,滤波器的采样 频率 f(SAMPLING) = 18MHz,那么如果滤波器要想监测的 1MHz 信号,并且滤除 高频干扰,则理论上 N <= 9 , 即 f(SAMPLING) / N >= 2 * f,这让我想起了《信号与系统》中的“奈圭斯 特采样频率”。
stm32 PWM输入捕获
stm32 定时器pwm输入捕获输入捕捉的功能是记录下要捕捉的边沿出现的时刻,如果你仅仅捕捉下降沿,那么两次捕捉的差表示输入信号的周期,即两次下降沿之间的时间。
如果要测量低电平的宽度,你应该在捕捉到下降沿的中断处理中把捕捉边沿改变为上升沿,然后把两次捕捉的数值相减就得到了需要测量的低电平宽度。
如果要的测量低电平太窄,中断中来不及改变捕捉方向时,或不想在中断中改变捕捉方向,则需要使用PWM输入模式,或使用两个TIMx通道,一个通道捕捉下降沿,另一个通道捕捉上升沿,然后对两次捕捉的数值相减。
PWM输入模式也是需要用到两个通道。
使用两个通道时,最好使用通道1和通道2,或通道3和通道4,这样上述功能只需要使用一个I/O管脚,详细请看STM32技术参考手册中的TIMx框图。
//0-----------------------一、概念理解PWM输入捕获模式是输入捕获模式的特例,自己理解如下1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。
且IC1IC2一组,IC3 IC4一组。
并且可是设置管脚和寄存器的对应关系。
2. 同一个TIx输入映射了两个ICx信号。
3. 这两个ICx信号分别在相反的极性边沿有效。
4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。
6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)7. 由此可以计算出PWM的时钟周期和占空比了frequency=f(TIM时钟频率)/n。
duty cycle=(高电平计数个数/n),若m为高电平计数个数,则duty cycle=m/n若m为低电平计数个数,则duty cycle=(n-m)/n注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的最小频率=TIM时钟频率/65535。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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; 口
如下图所示:
从上图中我们可以看到, 对于 1MHz 的信号, 当采样频率为 18MHz 时, N 最大为 9。 当 N 大于 9 时,是不可能连续采样到大于 10 个的有效电平的。 下面我们验证这个猜测: 按照这个猜想,我们先求一下这个数字低通滤波器的最小通带截止频率。 令 CKD[1:0] = 01b, 即 f(DTS) = f(CK_INT) / 4 = 18MHz; IC1F[3:0] = 1111b, 即 f(SAMPLING) = f(DTS) / 32 = 562.5KHz, N = 8; 由公式 f(SAMPLING) / N >= 2 * f 可得: f <= 35.156KHz, 也就是说理论上: 滤波器可以监测到输入信号频率小于 35.156KHz, 占空比为 50% 的方波信号的跳变沿,换句话说,大于 35.156KHz 的此类信号将被滤除掉。 下面是 STM32 定时器输出频率的 计 算 公式 : f(OC1) = 72,000,000 / (ARR 1)*(PSC - 1); 50%的 PWM 波不同频率的计算值如下表: _____________________________________________________________________ fHz | ARR | PSC | 理论上 | 实际上 40K | 1800 – 1 | 0 | 监测不到跳变沿 | 监测不到跳变沿 36K | 2000 – 1 | 0 | 监测不到跳变沿 | 监测到跳变沿 35.156K | 2048 – 1 | 0 | 临界值 | 监测到跳变沿 35K | 2057 – 1 | 0 | 可检测到跳变沿 | 监测到跳变沿 _____________________________________________________________________ 下面是源代码: 配置 TIM3 的通道 1(PA.6)输出不同频率的占空比 50%的方波,配置 TIM3 的通道 2(PA.7)为输入捕获模 式,并使能捕获中断,在中断中输出捕获的值 ,将 PA.6 和 PA.7 短接。 在测试时请注意修改:宏定义 ARR 的常量值。 ========================================================== void RCC_Configure(void)
深入理解 STM32 定时器中的输入捕获滤波器 STM32, 定时器, 输入捕获, 滤波器
Newboy 网上收集整理
关于 STM32 定时器中的输入捕获滤波器的功能描述,在中文参考手册中描述如 下:
上面的 fDTS 由 TIMx_CR1 中的 CKD 配置: 00: tDTS = tCK_INT 01: tDTS = 2 × tCK_INT 10: tDTS = 4 × tCK_INT 11: 保留 假定选 ETF=0101,即“采样频率为 fDTS/2, N=8”;选 CKD=01,即“tDTS = 2 × tCK_INT”;并假定 fCK_INT=72MHz。 这时可以算出,采样频率为 72MHz/2/2=18MHz,因为 N=8,即在滤波器上可以滤 除掉输入端上小于 444.4ns 的脉冲。 根据这一原理, 我的理解是把滤波器放在分频的后面是为了保证通过的信号频率 不超过某个限定, 而不是为了滤除窄脉冲。 但如果 ETR 上出现较高频率的窄脉冲, 例如当分频因子为 4 时,如果 ETR 上出现了超过 9MHz 的一组窄脉冲,它就会在 通过分频和滤波器后被滤除掉。也许我前面的说法有些模糊, “滤波放在后面可 以更多地保证得到干净的波形”,你可以按照我上面的分析理解。
{ /* 开启辅助时钟 */ /* 使能 GPIOA,Pin8 50MHz 推免输出 LED0*/ /* 使能 GPIOD,Pin2 50MHz 推免输出 LED1*/ /* 使能 GPIOA.9 GPIOA.10 串口时钟 */ /* GPIOA_Pin_0~3 for ADC1_Channel_10~13 */ /* GPIOC_Pin_6~10 and GPIOB.all for TFT_LCD */ RCC->APB2ENR |= RCC_APB2Periph_GPIOA; /* 复位 USART1,再结束复位 */ RCC->APB2RSTR |= RCC_APB2Periph_USART1; RCC->APB2RSTR &= ~RCC_APB2Periph_USART1; RCC->APB2ENR |= RCC_APB2Periph_USART1; /* TIM3 */ RCC->APB1ENR |= RCC_APB1Periph_TIM3; RCC->APB1RSTR |= RCC_APB1Periph_TIM3; RCC->APB1RSTR &= ~RCC_APB1Periph_TIM3; }
我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话: 1)当滤波器连续采样到 N 次个有效电平时,认为一次有效的输入电平。 2)该数字滤波器实际上是个事件计数器,它记录到 N 个事件后会产生一个输出 的跳变。 例如:当 f(CK_INT) = 72MHz, CKD[1:0] = 01 时,选择 f(DTS) = f(CK_INT)/2 = 36MHz; 而 ETF[3:0] = 0100,则采样频率 f(SAMPLING) = f(DTS) / 2 = 18MHz, N = 6, 此时高于 3MHz 的信号 将被这个滤波器滤除,这样就有效地屏蔽了高于 3MHz 的干扰。 看了这些说法,我还是不理解这个数字滤波器到底是如何பைடு நூலகம்作的,问题如下: 问题 1:当滤波器连续采样到 N 次个有效电平时,是输出这个电平?还是输出一 个跳变? 问题 2:当滤波器没有连续采样到 N 次个有效电平时,输出是的什么? 带着这两个问题,我们来分析一下,下面以 TIM3 为例: 首先可以肯定输入捕获过程如下:详细信息见参考手册中的 14.2 节,通用定时 器框图 TIM3_CH1(PA.6) ----> TI1( 外部 信号 ) -------> 输入滤波器 IC1F[3:0] -----> IC1( 滤波器输出信号 ) -------> 输入捕获 预 分频器 IC1PSC[1:0] ----> 捕获/比较 1 寄存器 CCR1 从上面的过程可以知道, 1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。 2)滤波器和预分频器可软件编程,如果 IC1F[3:0] = 0x0,则滤波器全通,即 TI1 和 IC1 是同一个信号。 借助这两点分析,我假设的滤波器的工作原理是: 问题 1 猜测答案: 当滤波器连续采样到 N 次个有效电平时, 就输出这个有效电平。 问题 2 猜测答案: 当滤波器没有连续采样到 N 次个有效电平时, 再从 0 开始计数, 输出一直保持上一次输出的有效电平。例如:滤波器上一次输出是高电平,本次 连续采样到 N-1 个高低平, 但第 N 是个低电平,那么滤波器仍然保持上次输出的 高电平,并重新开始计数,记录 1 次低电平,如果在其后采样的 N-1 个也是低电 平,此时滤波才输出低电平,于是一个下降沿才出现在 IC1 上。 举例:如果我们产生一个 f = 1MHz 的占空比为 50%的方波信号,滤波器的采样 频率 f(SAMPLING) = 18MHz,那么如果滤波器要想监测的 1MHz 信号,并且滤除 高频干扰,则理论上 N <= 9 , 即 f(SAMPLING) / N >= 2 * f,这让我想起了《信号与系统》中的“奈圭斯 特采样频率”。