【发布时间】:2017-06-06 08:52:20
【问题描述】:
我试图通过 Atmega2560 上的 timer0 从 PB7 引脚获取 PWM 输出,但没有成功。它应该为连接的 repro 生成音调。我的 PWM 设置是:
DDRB = 0b11100000;
PORTB = 0b00000000;
OCR0A = 0x04;
TCCR0A = (0 << COM0A1) | (1 << COM0A0) | (1 << WGM01) | (0 << WGM00);
TCCR0B = (0 << WGM02) | (0 << CS02) | (0 << CS01) | (0 << CS00);
然后我有了这个函数,它应该会产生声音:
void SoundOutput(unsigned int uintTone)
{
if (uintTone != 0)
{
LED_2(1);
OCR0A = uintTone;
TCCR0B |= (1 << CS02) | (1 << CS01) | (1 << CS00);
}
else
{
TCCR0B &= ~((1 << CS02) | (1 << CS01) | (1 << CS00));
}
}
但是当我用音调参数调用它时没有任何反应。你能帮我么?
【问题讨论】:
-
我认为设置源的是这一行:
TCCR0B |= (1 << CS02) | (1 << CS01) | (1 << CS00);。如果所有三个都设置,则意味着: T0 引脚上的外部时钟源。时钟上升沿。如果您在 T0 上没有外部时钟源,只需设置CS00以获取例如 CPU 频率作为源,而无需任何预分频器。 -
这个行得通,我现在PB7上有输出,但是现在频率太高了。当我调用 SoundOutput(400) 时,我可以选择 12.5us 的 O-scope 周期,这对于音调生成来说太高了。
-
是的,因为 2560 的 CPU 频率是 16MHz。所以你的音频信号的周期是:
t = (1/f_CPU) * uintTone / 2。您希望参数uintTone成为结果频率吗?我稍后会发布它,因为我有时间作为答案。 -
"您希望参数
uintTone成为结果频率吗?"是的,那太好了,但是我有 11059200Hz 外部晶体而不是 16MHz。
标签: c embedded atmega atmel pwm