【问题标题】:ATMEGA32U4 PWM issueATMEGA32U4 PWM 问题
【发布时间】: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
    }
}

真的很想知道我哪里出错了,所以任何帮助都将不胜感激!

【问题讨论】:

  • 为什么会有setupmain?约定是 setuploop 如果你使用的是 Arduino SDK,或者 main 如果你不是。
  • 要确认这不是硬件问题,您可以尝试 bit-banging PORTB 看看您是否可以完全控制它而不是使用计时器/计数器?
  • 另一个想法:如果你根本不碰CLKPR,那么你会得到任何输出吗?
  • 还有两个想法:1.你确定PRR0中的PRTIM10吗? 2. 如果您不费心设置OCR1A,而是将定时器设置为WGM模式7而不是模式15(即删除(1&lt;&lt;WGM13)|)怎么办?

标签: c avr pwm atmega32


【解决方案1】:

几个月后终于修复了,一个简单的清理解决了这个问题。

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2022-08-18
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    相关资源
    最近更新 更多