在Arduino Uno(=ATMEGA328 / P.),如何手动清除计时器1输出比较信号?
代码的目的是在从输入脉冲中精确间隔后生成一些输出脉冲。有两个输出通道需要驱动,可能具有不同的延迟。脉冲长度并不重要,只需要至少8μs长,但上升沿的时序需要准确。
目前我的代码是这样的:
#define mains_period 16667 //在microSeconds ISR(Timer1_capt_vect){gtccr = _bv(tsm);TCNT1 = TCNT1 - ICR1 - MAINS_PERIOD + 1 + 300;gtccr = 0;} ISR(timer1_compa_vect){delaymicroseconds(8);OC1A = 0;// <----------我在这里做什么?} ISR(timer1_compb_vect){delaymicroseconds(8);OC1B = 0;// <----------我在这里做什么?void setup(){tccr1a = _bv(com1a0)| _BV(COM1A1) | _BV(COM1B0) | _BV(COM1B1); // set output on compare match, normal mode, prescaler /8 TCCR1B = _BV(CS11) | _BV(ICNC1) | _BV(ICES1); // input capture noise cancel, positive edge TIMSK1 = _BV(ICIE1) | _BV(OCIEA1), | _BV(OCIEB1); // generate interrupts for input capture, A/B compare match pinMode(8, INPUT); //set data direction pinMode(9, OUTPUT); pinMode(10, OUTPUT); }
我可能会重新配置定时器的输出模式以清除匹配,然后强制匹配,但似乎应该是更直接的方式来做才能做到这一点:
ISR (TIMER1_COMPA_vect) {delayMicroseconds (8);TCCR1A & = ~ _BV (COM1A0);TCCR1C = _BV (FOC1A);TCCR1A | = _BV (COM1A0);}
只是清除输出引脚寄存器位(PORTB & = ~ _BV (PORTB1);
)在这种情况下不起作用,因为只要在PIN上启用了备用功能(如定时器输出)时,端口寄存器都被忽略。
或者,如果有一种方法可以让定时器输出清除溢出(某种未记录的16位PWM模式?)甚至更好,但我怀疑有办法做到这一点。