使用 Nucleo
STM32F091RC 板,我配置了 ADC 以测量序列中的所有通道,即特定芯片具有的所有 10 个 ADC 引脚,以及 3 个内部引脚:温度、vrefint、vbat。
我校准了 ADC,按照勘误表中的说明在启用之前等待了一段时间,测量了 Vrefint 多次(当时只有序列中的那个通道,以防 MUXing 可能产生轻微的串扰),从参考计算 VDDA 和来自系统内存的存储值。
当我测量 10 个外部引脚上的电压时,它们似乎都正确且相当准确。
Vbat 看起来也不错。Vrefint 看起来也像数据表中所说的那样。
但是内部温度完全关闭。
测得95℃左右,但MCU明显感觉不到人体温度。
我已经尝试了 3 件事来计算它:
- 阅读参考手册并自己实施。当这看起来不对时,作为完整性检查,我
- 查看 LL 库是否有东西,确实,它有宏 __LL_ADC_CALC_TEMPERATURE
- 我查看了参考手册的附录并找到了示例代码(见下文)
所有 3 种变体在 95 摄氏度左右都得到了完全不合理的结果。
我用冷冻喷雾检查了 MCU 外壳,事实上,在喷雾几秒钟后,测量/计算的温度下降到几乎一半,然后在几秒钟后再次升高到 95°C。
所以温度通道肯定是启用的,它是转换序列中的正确索引。
另请注意,我使用了 239.5 个 ADC 滴答的最大可用采样时间。
我得到的 ADC 值大约是 1400。它已经补偿了 vdda,没有补偿 iw 大约是 1500。
这个温度传感器输出的那些通常值是@ 3V3 吗?
到底还有什么可能是错的?
作为参考,我使用的参考手册中的代码(几乎一字不差,只是省略了参考电压补偿,因为结果无论如何都是 ~ 1 - 是的,我还检查了我测量的 VDDA 是多少 - 它非常接近标称的 3300 .).
- static unsigned calc_tempr(int ADC_DR)
- {
- /* Temperature sensor calibration value address */
- #define TEMP110_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7C2))
- #define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7B8))
- int32_t temperature; /* will contain the temperature in degrees Celsius */
- temperature = ADC_DR - (int32_t) *TEMP30_CAL_ADDR;
- temperature = temperature * (int32_t)(110 - 30);
- temperature = temperature / (int32_t)(*TEMP110_CAL_ADDR - *TEMP30_CAL_ADDR);
- temperature = temperature + 30;
- return temperature;
- }
0