在Arduino上实现高精度PWM而不占用主循环,核心是利用硬件定时器的比较匹配中断(如Timer1的OCRnA/OCRnB)在中断服务程序(ISR)中翻转引脚电平,并动态更新比较值以控制占空比和频率。推荐使用Timer1(16位)而非Timer0(被millis占用),配置为CTC模式(WGM=4),设置OCR1A为周期,OCR1B为占空比阈值。在ISR中,根据当前引脚状态决定是否翻转,并重新计算下一次比较值。为避免中断过频,建议PWM频率不超过10kHz,且ISR内避免耗时操作(如digitalWrite,改用直接端口操作)。若需更高精度或更复杂波形,可改用硬件PWM(如Timer1的PWM模式)或使用DMA,但纯中断方案适合灵活占空比。实操时,先用`cli()`/`sei()`保护配置,并测试实际波形。
mcuku 阿沐 · 2026-08-27