jfpoilpret的公认答案写得很好,非常有效,在99%的情况下,我都会按照他的解释做。他的解决方案完全在您定义的参数之内,因此它们应该运作良好。但是有什么比“ 很好 ” 更好的呢?完美!毕竟,问题在于要产生一个确切的值。正如所说的,在大多数情况下(可以说是所有情况),足够接近是好的,即使当以1秒钟需要1秒钟作为时钟处理某些东西时,您仍然必须遭受继承零件的缺陷。
我会建议的并非总是可能的。在某些情况下,这是可能的,但是比这种情况要麻烦和多得多。是否值得视情况而定。我的目标主要是为将来的参考提供替代方法,在某些情况下更好。本文是针对没有电子学丰富经验的Arduino新手编写的。
对于更高级的人来说,这可能看起来太冗长和愚蠢了。但我相信,这些人可能已经知道并且不需要此答案。这也适用于每个微控制器,每个制造商和体系结构。但是对于其他微控制器,您将需要查阅正确的数据手册以找到正确的寄存器以及预分频器的名称和值。
在您的情况下,您需要一个特定的频率,其好处是,实际上可以非常轻松地实现精确的56 kHz(不计算零件的实际缺陷)。因此,这也是一个完美的例子。
生成信号取决于微控制器的计时器和时钟源,如jfpoilpret所述。他的回答仅涉及一种观点问题,并且摆弄了定时器。但是,您也可以摆弄时钟源,甚至可以同时摆弄时钟,以获得协同作用和出色的结果。通过更改环境参数(在这种情况下,是对系统进行黑客攻击并更换时钟源),我们可以更加轻松,简单地处理特定问题。
首先要提醒的是,由于切换引脚状态,您需要执行比信号频率高两倍的ISR。这是每秒112,000次。正如已经指出的那样,56,000和16,000,000的总和并不十分理想。我们需要更改信号频率或间歇频率。现在让我们处理一个不变的信号频率,并找到更好的时钟速度。
选择一个比56 kHz(或112 kHz,但实际上是相同的)大一个数量级的时钟将是最简单的,因为您只需加上零,这种数学运算对于大多数人来说是最简单的。不幸的是,这个世界上的一切都是某种妥协。并非每个值都行得通。
第一个例子是发电机转速太低。
如果您选择56,000 Hz时钟,您将无能为力,因为您需要在每个周期调用ISR,并且无能为力。这是完全没有用的。如果选择10倍快的速度(560 kHz),则将有9个微控制器周期(计时器达到其最大值需要10个周期-调用ISR函数需要1个周期)来完成工作,而这完全是不够的。您只是经常需要更多的计算能力。
另一方面,如果您选择一个太大的值,则在56 MHz时,微控制器根本无法使用它。太快了。因此,仅选择商店中的最大价值也不会减少价值。
原始的Arduino Uno R3的备用时钟为16 MHz,因此可以保证任何较慢的工作。下一个大于56且小于16 MHz的数量级的值是5.6 MHz。这样可以每隔50个周期调用一次ISR,并创建一个理想的112,000 Hz定时器频率。您的信号将恰好是56 kHz。在ISR调用之间,您将有49个MCU周期来执行您的程序,但仍约为原始时钟速度的1/3。可以使用112作为基础,并使用11.2 MHz时钟,这将产生大约16MHz谐振器的2/3。每隔100个周期就会调用一次ISR函数,并且仍会生成一个完美的56 kHz信号。
但是,这些值存在两个主要问题。
为了避免这种情况,我们可以查看可用的谐振器值,并找出可以用于生成精确所需值的其他方法。如果将56除以4,我们得到14,幸运的是有一个14 MHz谐振器。这为我们提供了更高的速度和更多的功能,并且同样容易找到寄存器值。要每秒调用ISR 112,000次,我们需要在OCR寄存器中放入十进制124或十六进制0x7C的值,因此,通过计数124个周期+ 1来调用ISR,我们得到了理想的理想值。
NB
- ISR-中断服务程序(这是仅在生成的中断上执行的代码)
- 您的程序有多大取决于内存大小!它与时钟速度无关,与您调用ISR的频率无关。
当微控制器以程序命令启动时,计数器将递增。如果产生中断,则调用ISR,并将该值存储在特殊寄存器中。当ISR代码完成时,程序计数器的值将从该特殊寄存器中恢复,并且程序从中断的地方继续进行,就好像从未发生过一样。
我将举一个非常愚蠢的例子。如果您是一个纯粹主义者,我警告您:鼻子和眼睛可能会流血。
想象一下,您必须从某个地方走到另一个地方。分步路线说明是您的主程序及其命令。您走路或跑步的速度取决于您的“时钟速度”,而不取决于路线说明(前进30步,向左1旋转90度,前进10步,向右45度等),它们始终是相同的。现在想象一下,一个小孩或一个贪婪腐败的地方政客时不时解开鞋子。这是产生中断的事件。然后您在最后一步后停下来,跪下并再次系好鞋子。这是您的ISR程序。
然后,您从停止的地方继续;您不是从头开始。当您在世间无时无刻不在走路时,即使您必须每隔一步都系鞋带,也不在乎。但是,如果您这样做有时间限制,例如在奥运会上奔跑100米(或从饥饿的食肉天敌中奔跑),停下来系鞋带可能会带来可怕的后果。微控制器也是如此。即使只执行一行代码,程序也会继续执行,尽管速度很慢。如果您根本不关心速度,那将不是问题。如果您必须做一些与时间有关的事情,例如使用其他与计时器有关的动作,那么干扰可能是非常不希望的并且会带来问题。
少即是多!更快的时钟并不总是更好。较慢的时钟设备消耗的功率要少得多。这可能是电池供电设备中的关键点。
从以下公式得出所需的周期:(
时钟速度/(预分频器值*所需的ISR调用频率))-1