基于STM32G030系列MCU之ADC采集转电压值

简介

STM32G030系列MCU,内部有一个12位的,0.4us的ADC ,最多支持16通道,0-3.6V的电压采样应用,用户开发时,经常用到ADC采样,同时经常遇到的问题有:

如何获取MCU内部基准电压?

如何获取通道管脚的电压?

如何获取电源VBAT电压?

如何获取基准ADC值、通道ADC值、VBAT电压?

以上特别是最后一个问题,同时获得值已经包括所用的应用,内部只有一个ADC值,需要切换通道并计算,工程师调试的时候往往切换通道时候出现异常。

如何获取MCU内部基准电压?

从数据手册获取的内部基准电压为1.212V,只要获取其ADC值就可以。基准电压和ADC值就可以其它通道的电压值。

如何获取电源VBAT电压?

切换到VBAT通道,获取ADC值,跟Vcc其3倍关系,所以获取后需要x3

复制代码
vcc_VREF     =  1214;  // 基准电压 1.212mV
adc_VREF     =  GetAdcTemp(LL_ADC_CHANNEL_VREFINT);
adc_BATT     =  GetAdcTemp(LL_ADC_CHANNEL_VBAT)*3;//3 // 3倍的ADC

计算电池电压vcc_BATT = vcc_VREF * adc_BATT /adc_VREF;

如何获取通道管脚的电压?

切换到某个通道的,获取ADC值,计算此通道的电压值:如PA0为通道0,PA1为通道1,以此类推:

vcc_VREF = 1214; // 基准电压 1.212mV

adc_VREF = GetAdcTemp(LL_ADC_CHANNEL_VREFINT);

adc_PA0 = GetAdcTemp(LL_ADC_CHANNEL_0);

计算电池电压 vcc_PA0 = vcc_VREF * adc_PA0 /adc_VREF;

ADC模块怎样构建?

先设计文档app_adc.c和app_adc.h

初始化配置ADC:初始化有例程,直接拷贝例程就可以。

void APP_ConfigAdc(void)

设计通过切换通道,获取ADC值的函数

复制代码
uint16_t GetAdcTemp(uint32_t Channel),该函数实体结构如下:提供参考
uint16_t GetAdcTemp(uint32_t Channel)
{
    uint16_t ADCxData;
    uint16_t ADCxData_Voltage;
	uint32_t wait_loop_index = 0;

    //Activate_ADC();
    /* 设置ADC组常规序列通道上选择的序列 */
    LL_ADC_REG_SetSequencerRanks(ADC1, ADC_REG_RANK, Channel);

    if(Channel == LL_ADC_CHANNEL_VREFINT)
    {   /* 设定ADC的采样通道*/
        LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1),LL_ADC_PATH_INTERNAL_VREFINT);
    }
    else if(Channel == LL_ADC_CHANNEL_TEMPSENSOR)
    {
        LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1),LL_ADC_PATH_INTERNAL_TEMPSENSOR);
    }
    else if(Channel == LL_ADC_CHANNEL_VBAT)
    {
        LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1),LL_ADC_PATH_INTERNAL_VBAT);
    }
    else
    {
        LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1),LL_ADC_PATH_INTERNAL_NONE);
    }

    // 等待通道切换通道完成
    while (LL_ADC_IsActiveFlag_CCRDY(ADC1) == 0)
    {
    #if (USE_TIMEOUT == 1)
      /* Check Systick counter flag to decrement the time-out value */
      if (LL_SYSTICK_IsActiveCounterFlag())
      {
        if(Timeout-- == 0)
        {
        /* Time-out occurred. Set LED to blinking mode */
        //LED_Blinking(LED_BLINK_ERROR);
        }
      }
    #endif /* USE_TIMEOUT */
    }
    /* 清除ADC通道配置就绪 */
    LL_ADC_ClearFlag_CCRDY(ADC1);

    /* Perform ADC group regular conversion start, poll for conversion          */
    /* completion.                                                              */
    ConversionStartPoll_ADC_GrpRegular();

ADCxData = LL_ADC_REG_ReadConversionData12(ADC1);

    return ADCxData;
}
相关推荐
派勤电子2 小时前
嵌入式硬件选型|3.5寸工控板与Mini-ITX主板的扩展能力哪个更好?
嵌入式硬件·工控主板·嵌入式主板·工控主板扩展·3.5寸工控板·mini-itx·工业主板io接口
工业胶粘剂技术4 小时前
科耀K-8095M 单组分耐高温环氧 电机磁钢/新能源汽车高温结构粘接技术参数与选型
单片机·嵌入式硬件·汽车
李永奉9 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
大爱编程♡9 小时前
STM32-DMA
stm32·单片机·嵌入式硬件
云泽80810 小时前
STM32 USART 详解(三):硬件架构、内部寄存器与物理层收发原理
stm32·嵌入式硬件·硬件架构
天空'之城10 小时前
单片机基础核心知识点汇总(三十三)
数据库·单片机·嵌入式硬件
数字新视界12 小时前
机房动环监控的智能化管理与安全提升探索
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
@嵌入式扫地僧13 小时前
TFLite Micro STM32/ESP32 开箱即用推理骨架 + INT8 量化脚本实战:零调试跑通端侧 AI 推理完整步骤
人工智能·嵌入式硬件·tinyml·端侧ai·tflite micro
自小吃多13 小时前
高云FPGA ModelSim中的仿真
笔记·嵌入式硬件·fpga开发
单片机仿真设计13 小时前
基于 STM32 的家庭环境监测与火灾报警灭火系统(Proteus 仿真)
stm32·单片机·嵌入式硬件·proteus·毕设