使用 Timer2 在“相位和频率正确”(模式 5)下设置 Arduino Mega 上的 PWM 频率

问题描述 投票:0回答:1

使用我的 Arduino Mega 2560,我尝试生成一个 PWM 信号,我可以在其中更改 PWM 频率和占空比。为此,我决定使用 Timer2 OC2A 输出。代码如下:

void setup()
{
  // ======================================================
  //    Timer 2 example: Phase and Frequency correct PWM
  // ======================================================
  pinMode(10, OUTPUT);
  TCCR2A = 0;//reset the register
  TCNT2  = 0;

  TCCR2A = 0b10000001;  // COM2A1 COM2A0 COM2B1 COM2B0    -      -    WGM21  WGM20
                        //    1      0      0      0      0      0      0      1
                        // Behavior: PWM on OC2A (Arduino pin 10) ; Waveform generation mode 5 (Phase and Frequency Correct)
                        
  TCCR2B = 0b00001001;  //  FOC2A  FOC2B    -      -    WGM22   CS22   CS21   CS20
                        //    0      0      0      0      1      0      0      1
                        // Behavior: Waveform generation mode 5 (Phase and Frequency Correct) ; Prescaler -> clk/1
                        
  OCRA   = 319;         // TOP value -> defines de PWM frequency (25 kHz)
  OCR2A  = 159;         // duty cycle value (80% of ICR1)
} 

void loop() 
{

}

当我尝试编译时,出现以下错误:

PWM_Mega.ino:43:3: note: suggested alternative: 'OCR2A'
   OCRA   = 319;         // TOP value -> defines de PWM frequency (25 kHz)
   ^~~~
   OCR2A
exit status 1
'OCRA' was not declared in this scope

我了解该错误是因为 OCRA 未定义。在 uC 数据表中(见下图),定义 PWM 频率的模式 5 TOP 是使用寄存器 OCRA 定义的,但当我将该名称放入代码中时,它无法识别。有谁知道该寄存器的名称,以便我可以在代码中使用它?

enter image description here

谢谢

arduino pwm atmega32
1个回答
0
投票

当您想要更改 Timer2 频率时,您必须牺牲通道 A(与 Timer1 不同,没有输入捕获寄存器,可以用作 TOP 值)

图中的OCRA表示OCR2A(OCR2A表示:O输出C比较R注册定时器2通道A

因此只能使用B通道作为PWM输出

注意:Timer2 仅是 8b,像 319 (0x13F) 这样的值将溢出到 63 (0x3F)

© www.soinside.com 2019 - 2024. All rights reserved.