同样的原理,同样的程序移植,STM32工作良好,AVR端口输入捕捉干扰很大。 是AVR的问题吗? 有没有什么硬件方式可以修正?
实现目的,检测PD4的脉冲输入,捕捉ICR1,使能ICNC1开启噪声抑制,但输入的时候ICR1跳变很大,
于是加入滤波算法,中位值平均滤波法,
一开始,采样12次,去掉一个最大值和一个最小值,中间10个取平均值,没多大效果,然后采样率慢慢往上加
采样20次,各去5个最大值和5个最小值,终于比较稳定了。偶尔有跳变。
追踪采样200次,各去50个最大值和50个最小值,示波器非常稳定,和STM32的输入捕捉可以媲美。
但是这个应该是AVR的问题, 示波器测试了。输入的波形很稳定。就是1个2Khz的方波,AVR不加滤波算法根本无法使用。是这样的吗?
以下为部分代码- /*
- *********************************************************************************************************
- * 函 数 名: TIM1_GPIO_Config
- * 功能说明: 配置TIM1输出PWM时用到的I/O
- * 形 参:无
- * 返 回 值: 无
- *
- *********************************************************************************************************
- */
- static void TIM1_GPIO_Config(void)
- {
- PWM1_DDR &= ~(1 << PWM1_GPIO_PUL); //PD4(ICP1)口为输入捕捉口
- PWM1_PORT |= (1 << PWM1_GPIO_PUL); //使能PD4的内部上拉电阻,平时该口为高电平,以便执行下降沿捕捉
- }
- /*
- *********************************************************************************************************
- * 函 数 名: TIM1_Mode_Config
- * 功能说明: 配置TIM1输入捕捉寄存器
- * 形 参:无
- * 返 回 值: 无
- *
- *********************************************************************************************************
- */
- static void TIM1_Mode_Config(void)
- {
- _CLI(); // 关总中断
- TCCR1A = 0x00; //设置为普通模式
- TCCR1B |= (1 << ICNC1)|(1 << CS11); //开启输入捕捉口的噪声抑制器,时钟8分频
- TCCR1B &= ~(1 << ICES1); //下降沿捕捉
- TIMSK |= (1 << TICIE1); //输入捕捉使能
- TCNT1 = 0; //计数初值
- _SEI(); // 开总中断
-
- }
连续采样200次的话,对于剧烈变化的波形,反应会非常迟钝,而且增加RAM开销,有没有什么办法,用硬件来去干扰?
|