一、STM32的内部参照电压VREFINT和ADCx_IN17相连接,它的作用是相当于一个标准电压测量点(和MSP430不一样。。),内部参照电压VREFINT只能出现在主ADC1中使用。
内部参照电压VREFINT与参考电压不是一回事。ADC的参考电压都是通过Vref+提供的并作为ADC转换器的基准电压。
当我们使用的Vref+是直接取自用VCC电压时,当VCC电压波动比较大时或稳压性能比较差时,可以借用STM32的内部参照电压VREFINT校正测量精度。
以测量1通道的电压值为例,先读出参照电压的ADC测量结果,记为ADre;再读出要测量通道1的ADC转换结果,记为ADch1;则要测量的电压为:
Vch1 = VREFINT* (((ADch1*(VREF/4096))/(ADre*(VREF/4096)))
注:VREFINT=1.21V,VREF为参考电压值=3.3V
公式简化:
Vch1 = VREFINT*(ADch1/ADre)
这种方法等于变相将内部参照电压VREFINT当成是ADC参考电压,也就是说,此时Vref参考电压的准确度已在此已对结果影响不大了,ADC的转换结果基本由VREFINT的精度决定。
注:一般情况下,这种办法只适合于当Vref+参考电压(其实也就是VCC电压)离散性实在太差的情况下使用。
我们知道,STM32中64脚和小于64脚的型号,Vref+在芯片内部与VCC信号线相连,没有引到片外,这样AD的参考电压就是VCC上的电压,那么我们可以使用一个高精度的外部参照电压,然后用上面的方法,也许可以解决因VCC电源电压精度不高带来的ADC测量不准确的问题。
建议采用以下方法结合使用: 1,采用内部参考 内部参考在芯片出厂时已经校准过精度了!(不清楚是否所有型号都校准过) 其厂内校准过程是在外部供3V电源,将采样内部参考的ADC值写入校准寄存器VREFINT_CAL! 因此,我们可以使用以下公式算出实际电压: V=(3*VREFINT_CAL*ADC_DATA)/(VREFINT_DATA*FULL_SCALE) 根据这个公式,程序需要获取VREFINT_DATA和ADC_DATA! 不过我们实际测试这个电压参考在低温下偏差比较大,可能是芯片本身的问题,目前还不清楚是全系列,还是个别型号有这个问题! 2,使用过采样! 二、请教原子大哥,怎么获取VREFINT_CAL的值(就是1.2V)? STM32F030的,ADC模块的内部参考电压VREFINT,datasheet说出厂时把校准值写入了VREFINT_CAL,地址是0x1FFF F7BA – 0x1FFF F7BB,见F030的datasheet 17页。 可是在程序中用 Data2 = *(__IO uint32_t *)(0X1FFFF7BB);或者 Data1 = *(__IO uint32_t *)(0X1FFFF7BA); 都是跳到了硬件错误中断HardFault_Handler中,这是问什么? 还有类似的,ADC有个内部温度通道,也有个校准值, 说是出厂时存到了0x1FFF F7B8 – 0x1FFF F7B9 0x1FFF F7C2 – 0x1FFF F7C3,我试了一下只有0x1FFF F7B8这个地址能读取,其他的一读就跳到了硬件错误中断,这是为啥? 最佳答案 treesss查看完整内容[请看2#楼]知道怎么回事了,指针用错了。存在那个地址里的数据是8位的,我用的是32位的指针,一读就读出界了,所以就发生硬件错误了 三、STM32芯片ADC内部的CH17参考电压的用途 |
每个STM32芯片都有一个内部的参照电压,相当于一个标准电压测量点,在芯片内部连接到ADC1的通道17。 根据数据手册中的数据,这个参照电压的典型值是1.20V,最小值是1.16V,最大值是1.24V。这个电压基本不随外部供电电压的变化而变化。 不少人把这个参照电压与ADC的参考电压混淆。ADC的参考电压都是通过Vref+提供的。100脚以上的型号,Vref+引到了片外,引脚名称为Vref+;64脚和小于64脚的型号,Vref+在芯片内部与VCC信号线相连,没有引到片外,这样AD的参考电压就是VCC上的电压。 在ADC的外部参考电压波动,或因为Vref+在芯片内部与VCC相连而VCC变化的情况下,如果对于ADC测量的准确性要求不高时,可以使用这个内部参照电压得到ADC测量的电压值。 具体方法是在测量某个通道的电压值之前,先读出参照电压的ADC测量数值,记为ADrefint;再读出要测量通道的ADC转换数值,记为ADchx;则要测量的电压为: Vchx = Vrefint * (ADchx/ADrefint) 其中Vrefint为参照电压=1.21V (根据手册,其实际范围为1.18~1.24v)。