稳定可靠防死机的低功耗小体积显示主板I3399适用于工控医疗健康(4G&16G含屏幕)
应用领域: 工业电子
在使用ADC取得输入的电压值时,有一个重要的参数是VDDA的电压值,因为从ADC量测取得的数值,需要用到VDDA的电压值,才能算出量测到的电压,公式如下。
VCHANNEL-X = VDDA ÷ ADC_RESOLUTION × ADC_DATAX
但是在部分在电池供电且线路设计较为简约的硬体上,有时会将电池直接供电给MCU,省略了LDO,故MCU的电压会随著使用时间而有压降的情况,回到上一个公式来看,因为VDDA变动,就会导致VCHANNEL-X的结果变动,以下就是要处理这个情况。STM32内部会产生一个参考电压,而STM32的ADC通常会有一个通道连接到这个参考电压让使用者可以量测,而STM32在出厂时,会在一个设定条件下用ADC量测这个内部参考电压,并将结果烧录在MCU ROM,我们可以利用这个条件来回推VDDA的电压。
依据上述公式和工厂校正的条件,可得到公式如下。
VDDA = 3000mV x VREFINT_CAL ÷ VREFINT_DATA
以下是实作方式,首先设置CubeMX的ADC,打开Vrefint Channel。
设置适当的ADC参数,因为STM32L152的ADC最大接受频率会随著MCU电压降低而降低,这个测试就先将ADC频率设置到最低电压能接受的最高频率。
以下是STM32L152的ADC说明,关于频率的部分。
设置适当的取样时间,须注意VREFINT所需的取样时间在datasheet中有说明,需参考datasheet后做适当的设置。
由上图从datasheet取得的内容得知最少需要4μs的取样时间,因为ADC的频率设置在4MHz,4μs ÷ ( 1 / 4MHz ) =16,故将Sampling Time设置在16 Cycles。
以上就完成CubeMX的设置,产生程式码后,在main.c中加入测试程式如下。
这边加入LL ADC driver的header档,裡面有所需要的define和macro。
/* USER CODE BEGIN Includes */
#include "stm32l1xx_ll_adc.h"
/* USER CODE END Includes */
这边加入所需要的两个变数,一个储存从ADC取得的转换结果,一个储存经运算后回推得到的电压值。
/* USER CODE BEGIN PV */
uint16_t dr_vrefint;
uint16_t vdda_mv;
/* USER CODE END PV */
下面是转换的程式码。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
这样即可取得目前的VDDA电压,供之后ADC转换其他Channel的结果转换成电压使用。