Я разрабатываю простую программу для запуска зуммера в AVR на Teensy 2.0 (ATMEGA32u4), и мне очень трудно заставить работать выход PWM. Выход ШИМ находится на PB6, и я могу проверить его в цифровом виде, поэтому меня не беспокоит аппаратная настройка зуммера.
В конце концов, у ШИМ будет 50% рабочий цикл, однако частота будет модулироваться, однако Я больше обеспокоен тем, что в данный момент я не получаю никаких выходных данных.
Я пробовал несколько различных настроек ШИМ и даже запускаю второй таймер для выполнения других задач.
Вот мои настройки и скелет программы:
#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
}
}
Очень трудно понять, где я ошибаюсь, поэтому любая помощь будет высоко ценится!