使用Arduino计时器

时间:2016-01-06 04:44:21

标签: arduino atmega pwm

我正在使用这个Arduino代码生成一个脉冲宽度为50%的5V,200 KHz脉冲。

void setup() {
  // put your setup code here, to run once:
  pinMode(pwmpin, OUTPUT);
  pinMode(FBo, INPUT);
  pinMode(FBi, INPUT);
  noInterrupts(); // disable all interrupts 
  TCCR0A = 0;
  TCCR0B = 0;
  TCNT0  = 0;
  OCR0A = 40; // compare match register Duty Cycle *   16MHz/200kHz
  OCR0B = 40; // compare match register 1 - Duty Cycle * 16MHz/200kHz
  TIMSK0 |= (1 << OCIE0A); // enable timer compare interrupt
  digitalWrite(pwmpin,HIGH);
  TCCR0B |= (1 << CS00);
  interrupts(); // enable all interrupts
}

ISR(TIMER0_COMPA_vect) {
  digitalWrite(pwmpin, digitalRead(pwmpin) ^ 1);
  //TIMSK0 |= (1 << OCIE0B);  // enable timer compare interrupt
  //TIMSK0 &= ~(1 << OCIE0A);  // disable timer compare interrupt
}

而不是5V 200 KHz脉冲,它向我显示大约2V 30 KHz信号。谁能告诉我这是什么问题?

1 个答案:

答案 0 :(得分:0)

问题是您在正常模式下操作T / C0而不是CTC模式。

尝试添加

TCCR0A |=  (1 << WGM01);

到你的设置程序,在比较匹配时启用计数器复位。

正常模式允许计时器从BOTTOM(0)计数到MAX(255),无论您将OCR0A设置为什么值。这将每256个时钟周期触发一次中断(62.5 kHz,时钟频率为16 MHz)。您的ISR需要将输出引脚切换两次以执行一个完整的PWM周期,从而产生观察到的PWM频率约为30 kHz。

来自ATmega datasheet

  

15.7.1普通模式

     

[...]在此模式下,计数方向始终为向上(递增),并且不执行计数器清除。当计数器超过最大8位值(TOP = 0xFF)然后从底部重新开始(0x00)时,计数器会超载。

  

15.7.2比较匹配(CTC)模式下的清除定时器

     

在比较或CTC模式下的清除定时器(WGM02:0 = 2)中,OCR0A寄存器用于操作计数器分辨率。在CTC模式下,当计数器值(TCNT0)与OCR0A匹配时,计数器清零。 [...]

对于2V,我的猜测是你测量平均电压(4.?V @ 50%占空比)而不是PWM峰值电压。