gpt4 book ai didi

c - AVR 引脚变化中断不可预测地触发

转载 作者:行者123 更新时间:2023-12-01 12:39:55 26 4
gpt4 key购买 nike

所以,我使用的是 ATMega168NerdKits使用两个中断 INT0 和 INT1 设置并连接一个 LCD。我想附上 Grove Heart Rate Monitor ,我已附加到 PCINT1 并尝试启用和使用

void hrm_init()
{
//clear pin
DDRB &= ~(1<<DDB0);
PORTB |= (1<<PORTB0);
//turn on pull up
PCICR |= (1<<PCIE0); //enable pcint 1
PCMSK0 |= (1<<PCINT1); //Trigger on change of PCINT1 (PB1)
sei();
}

ISR(PCINT0_vect)
{
uint8_t changedBits;

changedBits = PINB ^ porthistory;
porthistory = PINB;

//pin has changed
if (changedBits & (1<<PB1))
{
beats += ((PINB & _BV(PB1)) ? 1 : 0); //add a beat on the rising edge
}
}

(节拍计数代码是从网上偷来的,因此使用了宏。)

这在大多数情况下都有效,但可以在这里和那里添加额外的节拍,我已经看到多达 10 个,同时我也有一个定时器中断(我将用它来计算每分钟的节拍)。

void clock_init() 
{
TCCR0A |= (1<<WGM01);
TCCR0B |= (1<<CS02) | (1<<CS00);
OCR0A = 143;
TIMSK0 |= (1<<OCIE0A);
}

SIGNAL(SIG_OUTPUT_COMPARE0A) {
the_time++;

if (the_time > 500)
{
bpm = beats;
bpm *= 12; //60 seconds divided by 5

the_time = 0;
beats = 0;
}
}

最佳答案

心率监测器的信号很可能有噪音。有几种方法可以解决这个问题。一种是硬件过滤器,但您可以使用“去抖动”或“去毛刺”机制在软件中处理它。

这是一种“去毛刺”机制。您不会期望在几毫秒内出现两次心跳。因此,您可以拒绝(跳过对应的计数)任何上升沿,例如前一个上升沿的两毫秒内。

如果您有一个毫秒分辨率的自由运行定时器,只需在每个上升沿捕获定时器即可。如果与上一个边沿相差超过2毫秒,则计算该边沿,否则不计算。计数时,保存定时器值,以备下次比较。

使用无符号算术减去并将结果与​​两毫秒进行比较。这样一来,您就不必担心计时器环绕。

ISR(PCINT0_vect)
{
static uint16_t last_rising_edge = 0;
uint8_t changedBits;

changedBits = PINB ^ porthistory;
porthistory = PINB;

//pin has changed
if (changedBits & (1<<PB1))
{
uint16_t now = get_milliseconds();

if (0 != (PINB & _BV(PB1) && (now - last_rising_edge) >= 2u)
{
beats += 1; //add a beat on the rising edge
last_rising_edge = now;
}
}
}

关于c - AVR 引脚变化中断不可预测地触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20031647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com