请教大家个问题,我用3.7v的锂电池供电,进行NTC测温度。经过3.3V的稳压芯片再供给MCU,但在电池电压由4.2v慢慢降到3.7v时,MCU的VDD也就会从3.3v降到2.8V。所以,要想办法,测准真实的vdd,这样才能得到正确的温度。 我在网上看到有利用内部的基准电压去教对不稳定的VDD的方法,但对48pin的stm32f103c8t6,ADC1没有IN17,在cubemx上选了Vrefint Channel,所生成的程序也没啥变化,所以不知道怎样才利用得到这内部的1.2v。(有附件和附图) 网上的方法如下: (3条消息)STM32内置参照电压的使用(转) - oushaojun2的专栏 http://blog.csdn.net/oushaojun2/article/details/7735286 STM32内置参照电压的使用 每个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.20V。 上述方法在使用内置温度传感器对因为温度变化,对系统参数进行补偿时就十分有效。 ———————————————— 版权声明:本文为CSDN博主「tianyukobe」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:http://blog.csdn.net/tianyukobe/article/details/88656601 (3条消息)stm32 精确电压测量法(内部参考电压) - qq_34672688的博客 http://blog.csdn.net/qq_34672688/article/details/91874371 stm32 精确电压测量法(内部参考电压) 原创 qq_34672688 发布于2019-06-13 16:50:46 阅读数 1660 [url=] 收藏[/url][url=]展开[/url] 芯片型号:stm32l051c8(其它型号请参考datasheet,仅供参考) 使用ADC采集电压时若使用外部参考电压,如果外部电压变化,且低于正常LDO工作电压时,输出的电压将发生改变,导致基准电压改变而导致ADC电压出现偏差,因此在该芯片上查看datasheet后得知,厂家已经为我们考虑到这种情况,并在出厂时将类似于基准电压的值写在flash中。该值的环境:25°C, VDD = 3V时的情况,可以直接地址访问读取,我读取了两个芯片的值,大概在1670值左右。通过该值我们就有一个标准。 接下来看参考手册中对该款芯片的介绍, 我们可以看到,通过读取ADC IN17可以获得内部参考电压值,假设我们现在要读取电池电量,需要读取两个通道的值: 1、ADC IN17内部参考电压原始数据,也就是下图公式中的 VREFINT_DATA 2、读取电池电量连接通道原始数据,也就是下图公式中的ADC_DATAX值,我在板子上接的是ADC IN4 下图的计算公式就是利用内部参考的校准电压值和实际读取的内部参考电压值作一个线性关系,将这个斜率对应到我们需要测量的通道值。 说明:VREFINT_CAL:内部参考电压校准值,直接地址读取。比如该款芯片地址:0X1FF80078,那么我们可以这么做: VREFINT_CAL = *(__IO uint16_t *)(0X1FF80078); FULL_SCALE:根据我们设置的ADC分辨率而定,12位ADC分辨率值:2^12 - 1 = 4096 - 1. 实测数据: VREFINT_CAL:1669 VREFINT_DATA: 1716 ADC_DATAX: 2046 FULL_SCALE: 4095 根据公式计算到电压值: VOL = 3 * 1669 * 2046 / (1716 * 4095) = 1.4578 电池电量: 1.4578 * 2 = 2.915 V 用万用表测量的电压值:1.44~ 1.45V波动, 校验成功。 ************************************************************************************************************ 2019-08-10补充 最近在项目中使用到ADC电压采集,由于使用的模拟量输出,所以对精度要求较高,使用上文的方式精度还不错,不过怎么调节都会与实际测量电压有偏差,为了降低这个误差,在软件上做处理。由于工程使用的是CubeMx生成的代码,经过调试,在采集电压前进行ADC校准会得到更好的精度。所以在采集前可加入这么一句代码: HAL_ADCEx_Calibration_Start(&hadc); //校准ADC源码参考链接:http://download.csdn.net/download/qq_34672688/11239849 |
ADC的最大数是4095=Vcc,而与Vcc的变化无关,当然NTC分压的结果也无关,也就是电压不影响测量结果。
影响测量准确度的因素,只有NTC和分压电阻的准确度及稳定性。 12bit ADC的准确度和稳定性够一般性使用,除非您的要求极高。
1.若是用电池供电,那么你的芯片最好不要用F1的,功耗偏大.
2.降低芯片工作频率,降低功耗有助于减少LDO的压差,LDO输出100mA需要70~200mV的压差。但你现在用的稳压芯片需要0.9V压差,可能你的电流消耗太大造成的,又或者你选了LM1117之类的大电流LDO。
3.可以把芯片工作在2.8V,例如选择XC6206P282MR 的LDO,电池掉到3V也不影响MCU的精度。
一个3.7V的锂电池,不通过LDO直接接在STM32f103c8t6的VDD.在使用的过程中,VDD会从4.2V慢慢降低到3.7v,那么怎样知道此时VDD到底是多少呢?
这其实是内部1.2V的设置的目的和基本应用。如果内部1.2v不好理解,我们不妨想像在外面接个1.2V的LDO,这LDO的输出是在VDD的变低,一直稳定在1.2V。
请看附图: