如何将Arduino Mega引脚2和3的PWM频率修改至10kHz及以上?
Arduino Mega 引脚2/3 PWM频率改10kHz教程
首先明确:Arduino Mega的引脚2和3由Timer3控制,默认PWM频率约490Hz,远低于你需要的10kHz。下面用最简单的方式讲清楚怎么改,附完整示例代码。
核心原理(大白话版)
PWM本质是定时器反复计数,到设定值就翻转引脚电平。要改频率,只需要两个关键操作:
- 给定时器选个合适的"减速档"(预分频器),把16MHz的系统时钟放慢
- 设定一个"触发值"(比较匹配寄存器),计数到这个值就翻转电平
按10kHz计算:16MHz ÷ (8 × (199 + 1)) = 10kHz,所以预分频器选8,触发值设为199刚好达标。
示例代码
void setup() { // 先把引脚2、3设为输出 pinMode(2, OUTPUT); pinMode(3, OUTPUT); // 重置Timer3的所有寄存器,避免默认配置干扰 TCCR3A = 0; TCCR3B = 0; TCNT3 = 0; // 设置触发值,对应10kHz频率 OCR3A = 199; // 对应引脚3 OCR3B = 199; // 对应引脚2 // 配置Fast PWM模式,让PWM输出更稳定 TCCR3A |= (1 << WGM31) | (1 << WGM30); TCCR3B |= (1 << WGM32); // 开启非反相PWM:计数到触发值时引脚电平清零,溢出时置位 TCCR3A |= (1 << COM3A1); TCCR3A |= (1 << COM3B1); // 选预分频器为8,启动定时器 TCCR3B |= (1 << CS31); } void loop() { // 测试用:循环切换不同占空比 analogWrite(2, 127); // 50%占空比 analogWrite(3, 63); // 25%占空比 delay(1000); analogWrite(2, 255); // 100%占空比(一直高电平) analogWrite(3, 0); // 0%占空比(一直低电平) delay(1000); }
必看注意事项
- Timer3还控制引脚5(OC3C),修改后引脚5的PWM频率也会变成10kHz,如果你的项目用到引脚5,要提前考虑。
- 不用改
analogWrite的用法,0-255的取值依然对应0%-100%的占空比,Arduino会自动把这个范围映射到我们设置的触发值199上。 - 如果需要更高频率(比如20kHz),可以把预分频器改成4(
TCCR3B |= (1 << CS30)),触发值保持199,计算下来刚好是20kHz。
内容的提问来源于stack exchange,提问作者user42423
相关产品推荐
相关产品推荐

