ST意法半导体
直播中

abdkjshd

8年用户 1144经验值
擅长:可编程逻辑
私信 关注
[问答]

将ADC设置为仅对VERFINT进行采样出现偏差如何解决呢

使用 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。
禁用常规电压的平均现在稍微改变了图片,但它并没有那么奇怪:现在*一些*通道也有一个“最后一个错误时间戳”(来自 systick 的毫秒分辨率)与最后一个 Vdda 错误对齐(即超出 +/-10% 的范围)。
而其他通道,在让它运行 15 分钟后,仍然只有启动后 100 毫秒的时间戳,预计会稳定下来。
所以:我现在确实在Vrefint/Vdda 之外的某些通道上看到了这一点,但在其他通道上看不到,在示波器上也没有什么特别之处。所有通道都通过相同的代码在相同的循环中捕获,唯一的特殊处理是 Vrefint 值取自具有最后样本而不是平均样本的缓冲区。那些受到影响的渠道似乎保持不变。
即在禁用平均之前,同样受影响的通道的错误之前已被“平均掉”。使用它作为解决方案并忽略原因似乎不是一个好主意。
有趣的是受影响频道号码的模式:
0 否,1 否,2 是,3 是,4 否,5 否,6 是(在测试中未跟踪超出该范围,但似乎 2x 否,2x 是,2x 否,...)


回帖(1)

李金云

2022-12-1 14:32:37
1.jpg 当我在 1 kHz systick ISR 中停止状态 LED 切换时,有趣的行为就消失了。起初的想法可能与产生噪音的引脚切换有关。但似乎没有一行代码被注释掉是罪魁祸首,(去)激活代码的不同组合可能产生相同的结果。
所以我觉得这是关于时机的。虽然引脚切换显示我的系统运行在预期的 1 kHz,但改变它的时间(在它里面做了什么,即在调用它返回后)改变了行为。
所以我终于明白了,ADC 转换序列可能会在非常不合时宜的时候被唯一的更高优先级中断——systick 中断。
是的,当错误出现时,ADC ISR OVR 位被设置。
因为对我来说,系统具有最高优先级似乎是有意义的(毕竟,这是我的时基,而且,对需要立即对变化做出反应的引脚进行关键监控,旁边是有趣的 LED 切换),
我猜:
为此使用 DMA 最有意义吗?没想到这个应用程序需要它,但看起来我需要。
2.jpg
举报

更多回帖

发帖
×
20
完善资料,
赚取积分