同样的原理,同样的程序移植,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开销,有没有什么办法,用硬件来去干扰? |