使用
STM32F091 板,我将 ADC 设置为:
- 以最长的可选采样时间采样(239.5 个周期)
- 时钟源是内部 14 MHz RC 振荡器
- 分辨率 12 位
- 所有可用频道的顺序,包括。虚拟重构
在启动时,有一点偏差:我将 ADC 设置为仅对 VERFINT 进行采样,采集大量样本并取平均值;由此,根据参考手册中的公式计算 Vdda,并将该值以更高精度的格式存储,以计算固件正常运行期间的所有其他电压。
然后我将频道顺序设置为所有频道,如上所述。
VREFINT 通道也作为序列的一部分被捕获,以定期粗略监控 3V3
电源电压是否仍然正常。
在操作期间,当软件连续触发 ADC 序列时,我进行了以下观察:
- 所有通道的值,但一个保持在与测量轨的标称值的 +/- 偏差几个百分点
- 只有 VREFINT 值有很大的偏差
- 大部分时间都在点上
- 但每隔几秒我就会得到一个比预期低大约 26% 的值
- 当这个错误值出现时,它非常接近 ADC 值 2042 左右,而工厂校准值 1536,转换后的 Vdda 将是2.465V 而不是 3.3V
- 我检查了我的转换代码:它对所有合法的 ADC 值都保持正确,没有数字溢出或类似的事情。
- 我没有在示波器上看到这些事件,即我没有看到真正的 Vdda 毛刺(无论如何,在 +/-100mV 范围内有一些开关噪声)
- 由于所有其他通道不会随着时间的推移在其值曲线中显示同步故障,即使它们应该,因为它们都应该受到故障 VDDA = VREF 的影响,因此我得出结论,这一定是某种人工制品
如果没有人反对这个逻辑,那么现在的问题就是:
这个人工制品是什么/在哪里?
采样时间应该不会太短,已经是最长的了。
我再次阅读了参考资料中 ADC 章节的部分,还有勘误表,没有发现任何我可能忽略的与此相关的内容。
编辑:
好的,我忘记了一件事:对于常规电压通道,我有(软件)8 倍平均,我最近添加的这个 Vrefint 监控使用该通道的原始最后一个 ADC 值将其转换回 Vdda。
禁用常规电压的平均现在稍微改变了图片,但它并没有那么奇怪:现在*一些*通道也有一个“最后一个错误时间戳”(来自 sys
tick 的毫秒分辨率)与最后一个 Vdda 错误对齐(即超出 +/-10% 的范围)。
而其他通道,在让它运行 15 分钟后,仍然只有启动后 100 毫秒的时间戳,预计会稳定下来。
所以:我现在确实在Vrefint/Vdda 之外的
某些通道上看到了这一点,但在其他通道上看不到,在示波器上也没有什么特别之处。所有通道都通过相同的代码在相同的循环中捕获,唯一的特殊处理是 Vrefint 值取自具有最后样本而不是平均样本的缓冲区。那些受到影响的渠道似乎保持不变。
即在禁用平均之前,同样受影响的通道的错误之前已被“平均掉”。使用它作为解决方案并忽略原因似乎不是一个好主意。
有趣的是受影响频道号码的模式:
0 否,1 否,2 是,3 是,4 否,5 否,6 是(在测试中未跟踪超出该范围,但似乎 2x 否,2x 是,2x 否,...)
0