如何校准微控制器内部振荡器:DIY修剪过程算法
2019年12月13日经过Eduardocorpeño.本文提出了一种旨在为人类校准MCU的内部振荡器的算法,在示波器和电子表格的帮助下。还显示了一个数字实验。
在以前的文章中标题如何校准MCU内部振荡器,我解释了MCU中内部RC振荡器的校准技术的性质。现在,我们将通过您可以在微控制器上执行的简单程序来看一下。
可能有几个工具可以帮助您调整MCU的内部振荡器,其中一些由仪器供应商提供,其他一些甚至打算在MCU的固件上运行。但是,您要完全掌握此过程的工作原理,我建议您遵循此仪器辅助程序来修剪MCU的内部振荡器。假装你在学校,至少把它作为一个实验室分配一次!
校准程序
要运行此实验,您需要电源,MCU,设备编程器,电子表格和示波器,逻辑分析仪或频率计数器。让我们快点看看台阶:
- 编译并运行生成1kHz方波的应用程序。
- 衡量实际的基线期间。
- 测量修剪寄存器的预期分辨率。
- 计算绝对错误。
- 计算百分比错误。
- 重复以下步骤,直到达到所需的错误或所需的调整为0。
- 计算修剪寄存器的所需调整。
- 计算新的修剪值。
- 替换修剪寄存器值,重新编译和运行,并测量新时段。
- 计算绝对错误。
- 计算百分比错误。
让我们校准MCU!
让我向您展示在全新MC9S08SH8微控制器上执行的这些步骤的示例,其中包含前面描述的8位ICSTRM寄存器。根据手册,该寄存器的预期修剪精度在±0.2%和±0.4%之间,这意味着该寄存器中的1步的增加或减少预期增加或减少了基线未经监测期的0.2%至0.4%。由于该百分比可以在芯片到芯片的范围内变化,因此我们必须测量它。
对于这个实验,让我们说我们希望获得比±0.5%更好的准确性。
- 运行1kHz方波发生器。
瞄准一段时间是至关重要的确切地1ms。因此,您应该使用MCU供应商提供的工具,例如计时器或PWM模块。使用库和代码生成器,并远离基于软件的时间计数延迟。 - 衡量实际的基线期间。
\ [t_ {baseline} = 880.98 \ mu s \]
对于此实验,我使用了NI-ELVIS II套件的示波器,由NITIONION INSTRUMENTS,如下所示:
- 测量修剪寄存器的预期分辨率。
这是基线期间的0.2%至0.4%,或这些值之间的任何东西:
\ [解决方法_ {min} =修剪\:compleciCe_ {min} \ times t_ {baseline} = 0.002 \ times 880.98 \ mu s = 1.762 \ mu s \]
\ [解决方法_ {max} = trim \:compleciCy_ {max} \ times t_ {baseline} = 0.004 \ times 880.98 \ mu s = 3.524 \ mu s \]
所以我们必须衡量它。为此,我们将测量ICSTRM值为129的生成时段,并计算基线时段的漂移。在129时设置ICSTRM后,重新编译和测量时段,我得到了\(t_ {基线+ 1} = 883.18 \ mu s \)。
这两个值显示了\(修剪\:精度= 0.2497 \%\)的周期增加,最终计算\(分辨率=修剪\:精度\ time t_ {baseeline} = 0.002497 \ times 880.98 \ mu s = 2.2 \ mu s\) - 计算绝对错误。
绝对误差是所获得的时期高于目标时段。对于我们的实验,这是
\ [error = t_ {获得} -t_ {target} = 880.98 \ mu s-1000 \ mu s = -119.02 \ mu s \]
负值意味着所获得的期间低于目标时段。 - 计算百分比错误。
这只是目标时段除外的绝对错误。在我们的实验中,这是
\ [\%ERROR = \ FRAC {ERROR} {T_ {target}} = \ FRAC {-119.02 \ mu s} {1,000 \ mu s} \ time100 \%= - 11.9 \%\] - 重复以下步骤,直到达到所需的错误或所需的调整为0。
最初,错误是-11.9%,所以我们必须开始迭代。- 计算修剪寄存器的所需调整。
这是修剪寄存器的单位数我们需要添加或减去以获得我们的目标期间。这是通过将绝对误差转换为修剪寄存器单元来计算:
\ [\ delta_ {trim \ _adj} = - \ frac {error} {stateSteate} = - \ frac {-119.02 \ mu s} {2.2 \ mu s} = 54.1Units \大约54Units \]
我们需要近似,因为ICSTRM是一个整数。 - 计算新的修剪值。
\ [ictrm = ictrm + \ delta_ {trim \ _adj} = 128 + 54 = 182 \] - 替换修剪寄存器值,重新编译和运行,并测量期限。
\ [t_ {获得} = 1030 \ mu s \] - 计算绝对错误。
\ [error = t_ {获得} -t_ {target} = 1030 \ mu s-1000 \ mu s = 30 \ mu s \] - 计算百分比错误。
\ [\%ERROR = \ FRAC {error} {T_ {target}} = \ FRAC {30 \ MU S} {1000 \ mu s} \ time100 \%= 3 \%\]
- 计算修剪寄存器的所需调整。
上面的数据仅显示了第一次迭代的结果。在5次迭代之后,错误无法进一步改善。这是由此产生的输出信号,其中仪器报告的时间为1ms:
下表显示了整个过程:
迭代 | \(trm_ {old} \) | \(t_ {获得} \) | 错误 | \(trm_ {adj} \) | \(trm_ {new} \) | % 错误 |
1 | 128. | \(880.98 \ mu s \) | -119.02 | 54.10000. | 182. | -11.90% |
2 | 182. | \(1030 \ mu s \) | 30.00 | -13.63636. | 168. | 3.00% |
3. | 168. | \(993.39 \ mu s \) | -6.61 | 3.00455 | 171. | -0.66% |
4. | 171. | \(999.91 \ mu s \) | -0.09 | 0.04091. | 171. | -0.01% |
5. | 172. | \(1000.02 \ mu s \) | 0.02 | -0.00909. | 172. | 0.002% |
请注意,在步骤4中,我们达到了我们的目标:错误降低了0.5%。对于电子表格来说,建议改变价值的变化也是太低的,但它是负面的。尝试更新调整值始终是一个好主意,直到错误再次开始。因此,在步骤5中,我尝试将修剪值增加一个,从而产生0.002%的误差。误差现在是积极的,实验结束;没有办法进一步改善。在此特定芯片上启动启动时加载到ICSTRM的值将为172。
此过程几乎是确定性的。查看错误列,您可以看到准确性提高的程度如何:几乎在每一步上提高一个级!您还可以看到以下情节的改进。
结语
现在你已经经历了一个很好的算法来校准自己的MCU,记住你没有有在微控制器上运行此算法。您应该随时使用微控制器供应商提供的工具,以使修剪程序更容易。