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

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

理解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(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,这让我想起了《信号与系统》中的“奈圭斯特采样频率”。

如下图所示:

从上图中我们可以看到,对于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波不同频率的计算值如下表:

_______________________________________________________________________

f Hz | 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)

{

/* 开启辅助时钟*/

/* 使能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;

}

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;

相关文档
最新文档