我正在开发一个简单的程序来在 Teensy 2.0 (ATMEGA32u4) 上的 AVR 中运行蜂鸣器,但我很难让 PWM 输出工作。PWM 输出在 PB6 上,我可以对其进行数字测试,所以我不担心蜂鸣器的硬件设置。
最终,PWM 将具有 50% 的占空比,并且频率将进行调制,但是,我更担心此时我没有得到任何输出。
我尝试了几种不同的 PWM 设置,甚至还运行了第二个计时器来完成其他任务。
这是我的设置和程序框架:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void button_handler(void);
void setup(void)
{
cli(); // Disable interrupts
// Set sysclk to 16 MHz
CLKPR = (1<<CLKPCE); // Prescaler change enable
CLKPR = 0x00; // Set prescaler to zero
DDRB = (1<<DDB6); // configure PORT B6 (buzzer) as output
// initliase timer1
// Fast PWM, TOP = OCR1A, Update OCR1B at TOP, TOV1 flag set on TOP
// Clear OC1B on compare match, set OC1B at TOP
// clkI/O/1 (No prescaling)
TCCR1A = (1<<COM1B1)|(1<<WGM11)|(1<<WGM10);
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
OCR1A = 1023; // Setup PWM Registers
OCR1B = 511; // 50% duty cycle
sei(); // Enable interrupts
}
int main(void)
{
setup(); // initialise device
for (;;)
{
// runs led blinking on PORTD, removed for simplicity
}
}
真的很难看到我哪里出错了,所以任何帮助都将不胜感激!