在Arduino Mega ATmega2560微控制器中编程PWM

Reg*_*ego 5 c avr arduino ada pwm

我正在尝试在Arduino Mega(ATmega2560)上启用PWM,但我遇到了一些问题.

首先,我正试图在Ada中编程.我希望将三个Timer3通道与FastPWM一起使用,所以我写道

procedure Main is
begin

   -- Nullify Timer3 buffers
   TCCR3A := 0;
   TCCR3B := 0;
   TCCR3C := 0;

   -- Waveform Generation Mode
   --  Fast PW, 8-bit, TOP = 0x00FF, Update OCR3x at BOTTOM, TOV3 Flag Set on TOP
   --  => WGM33|WGM32|WGM31|WGM30 = 0|1|0|1
   TCCR3A := TCCR3A or TCCR3A_WGM30;
   TCCR3B := TCCR3B or TCCR3B_WGM32;

   -- Compare Output Mode:
   --  Fast PWM, non-inverting mode
   --  => COM3A1|COM3A0|COM3B1|COM3B0|COM3C1|COM3C0 = 1|0|1|0|1|0
   TCCR3A := TCCR3A or TCCR3A_COM3A1 or TCCR3A_COM3B1 or TCCR3A_COM3C1;

   -- Clock Select: clk/1024 => CS32|CS31|CS30 = 1|1|1
   TCCR3B := TCCR3B or TCCR3B_CS32 or TCCR3B_CS31 or TCCR3B_CS30;

   -- Set Timer3 pins as output :
   -- Channel A : Digital Pin 5 / Chip Pin 5 (PE3/OC3A/AIN1)
   -- Channel B : Digital Pin 2 / Chip Pin 6 (PE4/OC3B/INT4)
   -- Channel C : Digital Pin 3 / Chip Pin 7 (PE5/OC3C/INT5)
   DDRE := DDRE_DDE3 or DDRE_DDE4 or DDRE_DDE5;

   OCR3AH := 0;
   OCR3AL := 250;

   OCR3BH := 0;
   OCR3BL := 250;

   OCR3CH := 0;
   OCR3CL := 250;

end Main;
Run Code Online (Sandbox Code Playgroud)

硬件连接正常; 我在Arduino IDE上使用简单代码测试了它.所以对我而言,很明显代码缺少某些东西或出错了,这应该是由PWM初始化问题引起的.有人可以解释一下我在哪里犯了这样的错误吗?

提前致谢.

更新

如果Ada很难得到整个逻辑,那么C中的等效代码就是(你可以使用AS6构建它,结果是相同的,即没有生成信号):

int main(void){
    TCCR3A = 0;
    TCCR3B = 0;
    TCCR3C = 0;

    /* Waveform Generation Mode
    Fast PW, 8-bit, TOP = 0x00FF, Update OCR3x at BOTTOM, TOV3 Flag Set on TOP
    => WGM33|WGM32|WGM31|WGM30 = 0|1|0|1 */
    TCCR3A = TCCR3A|(1<<WGM30);
    TCCR3B = TCCR3B|(1<<WGM32);

    /* Compare Output Mode:
    Fast PWM, non-inverting mode
    => COM3A1|COM3A0|COM3B1|COM3B0|COM3C1|COM3C0 = 1|0|1|0|1|0*/
    TCCR3A = TCCR3A|(1<<COM3A1)|(1<<COM3B1)|(1<<COM3C1);

    /* Clock Select: clk/1024 => CS32|CS31|CS30 = 1|1|1 */
    TCCR3B = TCCR3B|(1<<CS32)|(1<<CS31)|(1<<CS30);

    /* Set Timer3 pins as output :
    Channel A : Digital Pin 5 / Chip Pin 5 (PE3/OC3A/AIN1)
    Channel B : Digital Pin 2 / Chip Pin 6 (PE4/OC3B/INT4)
    Channel C : Digital Pin 3 / Chip Pin 7 (PE5/OC3C/INT5)*/
    DDRE = DDRE|(1<<DDE3)|(1<<DDE4)|(1<<DDE5);

    /* Set PWM Duty Cycles */
    OCR3AH = 0;
    OCR3AL = 250;

    OCR3BH = 0;
    OCR3BL = 250;

    OCR3CH = 0;
    OCR3CL = 250;
}
Run Code Online (Sandbox Code Playgroud)

小智 1

查看www.atmel.com/Images/doc2549.pdf第 136 页,我看到一条注释:

\n\n

“第 57 页 \xe2\x80\x9cPRR1\xe2\x80\x93 功率降低寄存器 1\xe2\x80\x9d 中的功率降低定时器/计数器 3 位 PRTIM3 必须写入 0 才能启用定时器/计数器 3 模块。 ”

\n\n

可能相关吗?

\n\n

我不知道电源管理寄存器的默认值是什么,而且我没有使用过2560。

\n\n

其余的对我来说看起来不错,尽管我在 328p 上使用了计时器库 avr-timer0.adb 等,而不是自己滚动。

\n