embedded - 微控制器中的定时器/预分频器
问题描述
也许这是一个愚蠢的问题:
我有内部 20 MHz 振荡器、16 位定时器和预分频器(1、2、4、8、16、32、64、128),我想产生 1 ms 延迟。我知道该怎么做 - (20 000 000 / 1) / 1000 = 20 000 -> 将此值放入 16 位寄存器,它就可以工作。
使用预分频器 2 和 4,我得到相同的结果 1ms - (20 000 000 / 2) / 1000 = 10 000 和 (20 000 000 / 4) / 1000 = 5 000
我的问题是如何确定使用哪个预分频器?也许,我必须选择预分频器 4,因为这个值 (5000) 更接近 0,我的计时器开始从 0 计数到 5000。如果我选择 10 000,计时器将计数 2 x 5000。
先感谢您 !
解决方案
当计数器在所需时间段内不够大时,您可以使用更高的预分频器。例如,如果您想要 10 毫秒的周期,则必须使用至少4 的预分频器来获得 50000 的重载值。
导致重载小于 2 16的最小预分频器是您通常的目标。这为您提供了尽可能高的计数器分辨率,这对您将其用于 PWM 或输入捕获很有用。另一方面,如果您只是使用重新加载中断,则它并不重要。
如果您需要的周期由于 in 不是时钟周期的精确倍数而不能完全实现,那么使用较低的预分频器将最大限度地减少误差。
最后,如果你走得太低,你可能无法达到精确的时期。例如,对于您的 1ms 周期,64 的预分频器将导致重新加载 312.5,选择 312 会导致 ~1001.603ms 的周期或 313 的 ~998.403ms。
因此,通常重载值尽可能接近 65535,而不是您建议的零,这是您通常的目标。
推荐阅读
- java - 使用流转换嵌套的for循环逻辑
- flutter - 屏幕底部的 SliverAppBar(颤动)
- scala - 如何模拟其参数是scala中的新实例的方法
- postgresql - Postgres 中的乐观锁使另一个并发更新等待
- java - remove() 方法不会删除 Java ArrayList 中的对象
- python - Apache Superset 在添加新图表时中断:“函数”类型的对象不是 JSON 可序列化的
- angular - 如何在具有默认值的组件中注入指令?(避免 NullInjectorError)
- arangodb - Arango 数据库复制应用程序不工作
- flutter - 为颤振和飞镖定义一个 linter 规则
- cordova - Ionic 4 - Cordova 插件指纹 AIO - 禁用面部识别(指纹多合一)