金牌会员
 
- 积分
- 2778
- 金钱
- 2778
- 注册时间
- 2015-6-1
- 在线时间
- 394 小时
|
1金钱
本帖最后由 yuzeyuan1 于 2019-11-28 17:32 编辑
首先附上我之前的帖子:测量到的AD值换算得出的电压值与实测电压偏差较大,达到0.1V以上。由于时间原因,我上次解决了表象问题后就没再查原因。
http://www.openedv.com/forum.php?mod=viewthread&tid=297204&extra=
经过测试,手里所有F1 F4的板子的ADC,只要VREF+和VDDA的电压稳且正确,数据都没有问题。如果不是3.3V,而是3.285V,则计算时用3.285也能得到准确电压值。按公式“测量出的AD值 * 3.285 / 4096 = 测量出的电压值”。(对于这一点,我以前是知道的,但我之前做的项目并没有很关心ADC准不准,有那么个数就得了,而现在做的一些东西,哪怕差了0.02V,也能达到3%的误差,所以比较关心ADC精度。)
但手里所有STM32L4的板子,AD值都算不对,哪怕它的参考电压非常稳非常准。
在上一个帖子中,大家说是参考电压的问题,或是测量的仪器不准,或是我测的电压不准。但我这里说一下,我测的应该都是准的,只是单纯的STM32L4芯片的问题。如果有朋友遇到同样的问题,请回复一下芯片型号。
按上文所说,在STM32L4中,给一个稳稳的3V参考电压,我给ADC引脚2V电压,它的AD*3/4096后换算出来的就能达到2.05V甚至2.1V,测了很多种板子,都是一样的,但数值差别较大。于是我想起了内部参考电压VREFINT,它的使用代码用三行代码解决,我通俗点儿进行解释,其中VREFINT_DATA是取17通道的值(厂家在生产时用稳定的3.3V参考电压给VREF+,环境温度30摄氏度,ADC的17通道会输出1.212V左右的电压,具体电压会是一个偏差范围请看手册,厂家将这个1.212V电压所对应的AD值比如1662存在了地址0x1FFF75AA中),VREFINT_CAL是取的前文所说的地址0x1FFF75AA中的内容(比如取出来是1662,对应的是1.212V),VREFINT_BASE_1000就是计算后得出的参考电压(后面带个_1000是因为我乘了1000倍,将3.485变成3485,取整数便于后面使用和参数定义)
VREFINT_DATA = Get_Adc_Average(ADC_CHANNEL_VREFINT,100);
VREFINT_CAL = *((uint16_t*) (0x1FFF75AAUL));
VREFINT_BASE_1000 = 3 * VREFINT_CAL * 1000 / VREFINT_DATA;
得到参考电压后,计算公式变成了“测量出的AD值 * VREFINT_BASE_1000 / 4096 = 测量出的电压值”,然后我给引脚一个1.2V,发现哇好准,于是没再多测我就开心地去用了。。。然后发现一旦输入电压为0.5V或是2V,这个值又飘废了,我想大不了用查表吧,于是测了十来组输入电压,和计算后的电压,发现它竟然是线性的,用个“计算后的电压*0.955 + 50”就得到了准确的实际电压,这就是我终结了第一个帖子的原因,解决了这个表象问题。
现在再查一查手册有两个地方提到内部参考电压,1、Internal voltage reference (VREFINT)这一章节中,明确写着,30摄氏度下给3V参考电压,就可到了参考AD值,并存放到了地址0x1FFF 75AA - 0x1FFF 75AB中。
2、之前一直看不明白,手册的Embedded voltage reference章节中所提到的1.2V是个什么东西,现在想想应该意思是不管你给STM32芯片什么样的参考电压,它都会换算出一个1.2V的电压给到ADC17通道,把它读出来就可以用来算参考电压了。
我觉得这就是前文说的只有1.2V准的原因,因为厂家校正的就是这个电压的值,而其它的电压并没有校准。
分析完了,新人我觉得看看能少走点儿弯路,但最后还是有根本性问题不知道是什么原因,用内部参考电压计算出来的电压值只有在1.2V附近是准的,别的电压都不准,这是为什么呢?是这款芯片就这样吗?有没有办法让它全部电压都很准?如果想解决,现在看来唯一的办法还是大量取电压点,在excel里做个线性公式出来,就解决了,但这样必须保证板子各电压很稳定,估计参考电压也得非常稳定才能,不然得到的参考电压值老在变。
各位有什么好想法吗?或是说下产生这些问题的原因。
|
|