AVR定时器比较中断 (2015-06-19 23:50:31)

最近打算自己做个蓝牙接收机,接在四轴上,于是研究下怎么输出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);

  }

}

你可能感兴趣的:(AVR定时器比较中断 (2015-06-19 23:50:31))