Arduino Mega Timer2相位频率修正PWM模式寄存器命名报错求助
问题
使用Arduino Mega 2560,想要生成可同时调整PWM频率和占空比的信号,选择Timer2的OC2A输出引脚(引脚10),编写代码如下:
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未定义,MCU数据手册显示模式5的TOP值由OCRA寄存器定义,但代码中该名称不被识别,请问该寄存器在代码中的正确名称是什么?
解决方案
寄存器名称修正:Arduino环境中,ATmega2560的Timer2相关寄存器都带有数字后缀,不存在
OCRA这个通用名称,对应Timer2的输出比较A寄存器是OCR2A。但你这里的核心问题是混淆了模式对应的TOP寄存器:模式5的TOP寄存器是ICR2:你设置的是Timer2的模式5(相位与频率修正PWM,WGM22=1、WGM21=0、WGM20=1),该模式下的TOP值由
ICR2寄存器定义,而非OCR2A。只有模式6、7的TOP值才由OCR2A定义。修正后的代码片段:
将错误的OCRA = 319;替换为ICR2 = 319;,同时修正注释中的错误:
ICR2 = 319; // TOP value -> defines the PWM frequency (25 kHz) OCR2A = 159; // duty cycle value (~50% of ICR2)
另外注意,你原代码中注释的“80% of ICR1”是错误的,ICR1属于Timer1,这里应该是ICR2,且159约为319的50%,可根据需求调整OCR2A的数值来改变占空比。
内容的提问来源于stack exchange,提问作者rodolaf
相关产品推荐
相关产品推荐

