我正在使用这个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信号。谁能告诉我这是什么问题?
答案 0 :(得分:0)
问题是您在正常模式下操作T / C0而不是CTC模式。
尝试添加
TCCR0A |= (1 << WGM01);
到你的设置程序,在比较匹配时启用计数器复位。
正常模式允许计时器从BOTTOM
(0)计数到MAX
(255),无论您将OCR0A
设置为什么值。这将每256个时钟周期触发一次中断(62.5 kHz,时钟频率为16 MHz)。您的ISR需要将输出引脚切换两次以执行一个完整的PWM周期,从而产生观察到的PWM频率约为30 kHz。
15.7.1普通模式
[...]在此模式下,计数方向始终为向上(递增),并且不执行计数器清除。当计数器超过最大8位值(TOP = 0xFF)然后从底部重新开始(0x00)时,计数器会超载。
和
15.7.2比较匹配(CTC)模式下的清除定时器
在比较或CTC模式下的清除定时器(WGM02:0 = 2)中,OCR0A寄存器用于操作计数器分辨率。在CTC模式下,当计数器值(TCNT0)与OCR0A匹配时,计数器清零。 [...]
对于2V,我的猜测是你测量平均电压(4.?V @ 50%占空比)而不是PWM峰值电压。