stm32 adc输入电压范围_STM32应用 | 在MCU电压浮动的硬体设计上实现如何用ADC量测电压...

06ce1794f850ee66665ee9f57936fa42.png

在使用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

d2bd6969bcfda3c6cfafaf17d1e0893e.png

以下是实作方式,首先设置CubeMX的ADC,打开Vrefint Channel。

设置适当的ADC参数,因为STM32L152的ADC最大接受频率会随着MCU电压降低而降低,这个测试就先将ADC频率设置到最低电压能接受的最高频率。

2e1fcac731ff483fdd2b239c37350e8d.png

以下是STM32L152的ADC说明,关于频率的部分。

cb700bff33dc759c96941c7b38aa2d10.png

设置适当的取样时间,须注意VREFINT所需的取样时间在datasheet中有说明,需参考datasheet后做适当的设置。

a435cde5026863af59b7e0298e5e2bae.png

由上图从datasheet取得的内容得知最少需要4μs的取样时间,因为ADC的频率设置在4MHz,4μs ÷ ( 1 / 4MHz ) =16,故将Sampling Time设置在16 Cycles。

64807f0f879078e26ccb3c8f10967257.png

以上就完成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)

{

HAL_Delay(100);

HAL_ADC_Start(&hadc);

HAL_ADC_PollForConversion(&hadc, 100);

dr_vrefint = HAL_ADC_GetValue(&hadc);

vdda_mv = __LL_ADC_CALC_VREFANALOG_VOLTAGE(dr_vrefint, LL_ADC_RESOLUTION_12B);

/* USER CODE END WHILE */

这样即可取得目前的VDDA电压,供之后ADC转换其他Channel的结果转换成电压使用。

d261d2af381647ffb1db7366a127c97d.png

点击 点“在看”给小编加鸡腿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值