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

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

如下图所示:
从上图中我们可以看到, 对于 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)
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; 口
{ /* 开启辅助时钟 */ /* 使能 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; }
深入理解 STMwenku.baidu.com2 定时器中的输入捕获滤波器 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 的一组窄脉冲,它就会在 通过分频和滤波器后被滤除掉。也许我前面的说法有些模糊, “滤波放在后面可 以更多地保证得到干净的波形”,你可以按照我上面的分析理解。
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
我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话: 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,这让我想起了《信号与系统》中的“奈圭斯 特采样频率”。
TIM_TimeBaseStructure; TIM_OCInitStructure; TIM_ICInitStucture;
/* TIM3 Configration */ /* Time Base configuration f = */ TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = ARR - 1; //ARR = 1800, 2000, 2048, 2057 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Channel 1 Configuration in PWM mode */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = ARR / 2; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_ICInitStucture.TIM_Channel = TIM_Channel_2; TIM_ICInitStucture.TIM_ICFilter = 0x0F;
相关文档
最新文档