欢迎来到比一比商城请登录免费注册
0   购物车  
首页>方案超市>方案详情
B1B
#

STM32应用:在MCU电压浮动的硬体设计上实现如何用ADC量测电压

人气
440
相关芯片型号:
NUCLEO-L152RE
跳转到...
温馨提示:如需了解更多信息,请通过在线咨询联系!
方案简介 性能参数

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

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的结果转换成电压使用。

  • 行业分类 : 电源电池
  • 开发平台 :
  • 交付形式 :
  • 性能参数 :
  • 应用场景 :

方案发布商

B1B

B1B

相关方案

  • 稳定可靠防死机的低功耗小体积显示主板I3399适用于工控医疗健康(4G&16G含屏幕)

    应用领域: 工业电子

     

    ¥ 1465/每件

正品保障 假一赔十
品类齐全 一站购齐
闪电发货 极速物流
现货特价 期货钜惠
客服
电话
购物车
订单