AVR定时器比较中断
扫描二维码
随时随地手机看文章
最近打算自己做个蓝牙接收机,接在四轴上,于是研究下怎么输出4路PWM。
计划是用定时器中断,然后在中断的时候计算占空比,然后对指定的PIN脚做高低电平的切换。
折腾了半天才大致上了解了这方面的用法,下面的代码在16M的ATMEGA8芯片上实现了1秒中断一次。
void setup() {
pinMode(13, OUTPUT);
//禁止中断
cli();
//TCNT1在这里是累加寄存器,一次时钟增加一次
//TCNT1 = 0;
// TCCR1控制寄存器
TCCR1A = 0;
TCCR1B = 0;
// OCR1A是累加上限寄存器,调整这个值就可以控制频率了
// 这里的15625是这样计算:16M / 1024 = 15625
OCR1A = 15625;
// 设置1024分频
// 这里_BV是个宏,就是 1 << n 的作用,各种设置bit的写法好分裂的感觉。
TCCR1B |= (_BV(CS12) | _BV(CS10));
// WGM12控制的CTC模式,就是自己会把TCNT1给清0了,否则要手工清0
TCCR1B |= 1 << WGM12;
// 设置比较中断
bitSet(TIMSK, OCIE1A);
//开启中断
sei();
}
int flag = 0;
void loop() {
// put your main code here, to run repeatedly:
}
ISR(TIMER1_COMPA_vect) {
if (flag == 0)
{
flag = 1;
digitalWrite(13, HIGH);
}
else
{
flag = 0;
digitalWrite(13, LOW);
}
}