在加载16MHz 运行的出厂校准后、我预计看到 RSELx=15、其中 s DCOCTL 值处于中等范围。 RSELx=14且 DCOCTL 接近最大值时发现两个微秒、以实现16MHz。 我想如果我们不进一步校准,这是可以的–但我们现在要达到 DCOCTL 的最大值。
我想我们有解决方案(见下文)、但我想知道我可以预期的工厂校准范围以及 RSELx=14是否有意这样做。 (对我来说看起来像是一个过程错误)。
系统使用30秒内采样的60Hz 线路频率来调整微控制器时钟。 该过程是连续的、并将针对温度引起的 DCO 源变化进行自动调整。
该器件的寄存器 RSELx 可选择基频范围。 通常、RSELx 的值为15。
寄存器 DCOx 和 MODx 是校准值、用于微调 RSELx 定义范围内的工作频率
BCSCTL1中的 RSELx、DCO 中的 DCO 和 DCOCTL 中的 MODx 在加电时从制造商预编程的校准数据空间加载。 每隔30秒将捕获的60Hz 频率与理想值进行比较、DCOCTL 寄存器会递增或递减、以使时钟频率保持一致。
上电时的典型值:
RSELx = 0x0F (根据数据表、该值应始终为0x0F)
DCOCTL = 0xAA
故障样本的值:
RSELx = 0x0E
DCOCTL = 0xE0
当控制器升温时、必须增大 DCOCTL 的值以补偿因温度引起的时钟漂移。 在故障单元中、DCOCTL 递增、直到它绕回0x00、从而导致时钟和电机速度下降。 DCOCTL 的低位对高于0xE0值的时钟频率没有影响、因此代码会不断调整、直到寄存器换至0。
现在对 DCOCTL 的值进行了简单的限制、以防止绕回。 但是、这不能解决调整问题。 由于 DCOCTL 的值为最大值、因此故障电机现在将在控制加热时释放少量速度。
解决方案:
添加了代码来检测 RESEL 值何时为14以及 DCOCTL 值何时复用(0xE0)。 如果这种情况持续60秒、软件会写入 RSEL=15并将 DCOCTL 复位为中间范围值。 然后继续正常进行连续校准。
谢谢
Viktorija