使用我的 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 定义的,但当我将该名称放入代码中时,它无法识别。有谁知道该寄存器的名称,以便我可以在代码中使用它?
谢谢
当您想要更改 Timer2 频率时,您必须牺牲通道 A(与 Timer1 不同,没有输入捕获寄存器,可以用作 TOP 值)
图中的OCRA表示OCR2A(OCR2A表示:O输出C比较R注册定时器2通道A)
因此只能使用B通道作为PWM输出
注意:Timer2 仅是 8b,像 319 (0x13F) 这样的值将溢出到 63 (0x3F)