【发布时间】:2023-04-10 14:34:01
【问题描述】:
我正在开发一个简单的程序来在 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
}
}
真的很想知道我哪里出错了,所以任何帮助都将不胜感激!
【问题讨论】:
-
为什么会有
setup和main?约定是setup和loop如果你使用的是 Arduino SDK,或者main如果你不是。 -
要确认这不是硬件问题,您可以尝试 bit-banging
PORTB看看您是否可以完全控制它而不是使用计时器/计数器? -
另一个想法:如果你根本不碰
CLKPR,那么你会得到任何输出吗? -
还有两个想法:1.你确定
PRR0中的PRTIM1是0吗? 2. 如果您不费心设置OCR1A,而是将定时器设置为WGM模式7而不是模式15(即删除(1<<WGM13)|)怎么办?