在目前与Arduino微控制器相关的项目中,我发现没有一种方法能不直接操作底层寄存器,而改变PWM频率的。就目前我所google到的,没有一种通用的库能改变arduino微控制器的PWM频率。网上有各种关于改变PWM频率的代码段,但是最终我还是决定参考400多页的ARV-Mega系列单片机的datasheet来实现这些功能。
据我推测,Arduino的编程人员没有发行任何关于改变PWM频率的方法是因为很难编写一个简单的,直观的硬件定时器封装程序,而不至使初学者困惑。硬件本身就有一些特殊的局限性,它们以一些奇怪的方式表现出来。
请允许我与大家分享一些:
PWM的行为是由叫作定时器的集成元件决定的。每个定时器有2个或4个通道。每个通道连到一个控制器引脚上。改变一个引脚的频率需要改变它所连接的定时器的频率,这样反过来也会改变其它连到同一个定时器的引脚的频率。Timer0通常被用作实现Arduino的计时功能(例如,millis()函数)。改变timer0的频率将会破坏你工程里使用计时函数的其它程序段部分。Arduino中有两种定时器,8位定时器和16位定时器。简单来说,就是它们所存在的细微差别使得不限制一方或另一方的代码实现变得困难。使用一个8位的定时器来设定定制的频率(使用预分频产生不了的频率)需要牺牲一个通道。换句话说,每个设定定制频率的8位定时器会失去在一个引脚产生pwm的能力(连接A通道的引脚会更准确些)。除了Leonardo的所有Arduino都有两个8位定时器,这意味着如果你把所有定时器设定特殊的频率,上述所说的Arduino控制器总共将会牺牲两个引脚。
先不管这些,我依然觉得对硬件定时器做一个库或封装是非常值得的,这样我或者任何其他选择使用这个库的人不必花那么多时间去深挖那些容易产生bug的逐位操作的模块和初始化部分。
这个库有五个全局函数: