文章目录

  • 1 平台条件
  • 2 代码的添加
    • 2.1 ADC的初始化
    • 2.2 ADC的disable
    • 2.3 ADC读取函数
    • 2.4 ADC执行读取函数后,进行中断数据的处理
    • 2.5 注意点

1 平台条件

1.软件: gecko_sdk_3.2.3
2:硬件:EFR32BG22C224F512GM32
3.IDE工具:SimpliStudio 5

2 代码的添加

官方有自己的库,以及应用历程,可以添加以及计算

需要包含的.h文件

#include “em_device.h”
#include “em_cmu.h”

2.1 ADC的初始化

// Set CLK_ADC to 10kHz (this corresponds to a sample rate of 1ksps)
#define CLK_SRC_ADC_FREQ        5000000  // CLK_SRC_ADC; largest division is by 4
#define CLK_ADC_FREQ            10000    // CLK_ADC; IADC_SCHEDx PRESCALE has 10 valid bits// When changing GPIO port/pins above, make sure to change xBUSALLOC macro's
// accordingly.
#define IADC_INPUT_BUS          CDBUSALLOC
#define IADC_INPUT_BUSALLOC     GPIO_CDBUSALLOC_CDEVEN0_ADC0// Stores latest ADC sample and converts to volts
static volatile IADC_Result_t sample;
static volatile double singleResult;static uint16_t batt_valu =0;
uint8_t batt_level =100;
void read_adc(void);
/**************************************************************************//*** @brief  IADC Initializer*****************************************************************************/
void initIADC (void)
{// Declare init structsIADC_Init_t init = IADC_INIT_DEFAULT;IADC_AllConfigs_t initAllConfigs = IADC_ALLCONFIGS_DEFAULT;IADC_InitSingle_t initSingle = IADC_INITSINGLE_DEFAULT;IADC_SingleInput_t initSingleInput = IADC_SINGLEINPUT_DEFAULT;// Enable IADC clockCMU_ClockEnable(cmuClock_IADC0, true);// Reset IADC to reset configuration in case it has been modifiedIADC_reset(IADC0);// Configure IADC clock source for use while in EM2
//  CMU_ClockSelectSet(cmuClock_IADCCLK, cmuSelect_FSRCO);//2022-3-3// Modify init structs and initializeinit.warmup = _IADC_CTRL_WARMUPMODE_KEEPINSTANDBY;// Set the HFSCLK prescale value hereinit.srcClkPrescale = IADC_calcSrcClkPrescale(IADC0, CLK_SRC_ADC_FREQ, 0);// Configuration 0 is used by both scan and single conversions by default// Use unbuffered AVDD as referenceinitAllConfigs.configs[0].reference = iadcCfgReferenceInt1V2 ;initAllConfigs.configs[0].vRef   =1210;// Divides CLK_SRC_ADC to set the CLK_ADC frequency for desired sample rateinitAllConfigs.configs[0].adcClkPrescale = IADC_calcAdcClkPrescale(IADC0,CLK_ADC_FREQ,0,iadcCfgModeNormal,init.srcClkPrescale);// Single initializationinitSingle.dataValidLevel = _IADC_SINGLEFIFOCFG_DVL_VALID1;// Set conversions to run continuouslyinitSingle.triggerAction = _IADC_TRIGGER_SCANTRIGACTION_ONCE;// Set alignment to right justified with 12 bits for data fieldinitSingle.alignment = iadcAlignRight12;// Configure Input sources for single ended conversioniadcPosInputDvdd;选择读取源//initSingleInput.posInput = iadcPosInputAvdd;initSingleInput.negInput = iadcNegInputGnd;// Initialize IADCIADC_init(IADC0, &init, &initAllConfigs);// Initialize ScanIADC_initSingle(IADC0, &initSingle, &initSingleInput);// Allocate the analog bus for ADC0 inputsGPIO->IADC_INPUT_BUS |= IADC_INPUT_BUSALLOC;// Enable interrupts on data valid levelIADC_enableInt(IADC0,IADC_IEN_SINGLEFIFODVL );//// Enable ADC interruptsNVIC_ClearPendingIRQ(IADC_IRQn);NVIC_EnableIRQ(IADC_IRQn);
}

2.2 ADC的disable

/*****************************************************************iadc_uinit*/
void iadc_uinit(void)
{// Reset IADC to reset configuration in case it has been modifiedIADC_reset(IADC0);IADC_disableInt(IADC0,IADC_IEN_SINGLEFIFODVL);// Enable IADC clockCMU_ClockEnable(cmuClock_IADC0, false);NVIC_DisableIRQ(IADC_IRQn);}

2.3 ADC读取函数

void read_adc(void)
{initIADC();// Start singleIADC_command(IADC0, iadcCmdStartSingle);
}

2.4 ADC执行读取函数后,进行中断数据的处理

/**************************************************************************//*** @brief  ADC Handler*****************************************************************************/
void IADC_IRQHandler(void)
{float temp_batt=0.0;// Read data from the FIFO, 12-bit resultsample = IADC_pullSingleFifoResult(IADC0);// For single-ended the result range is 0 to +Vref, i.e., 16 bits for the// conversion value.singleResult = (sample.data*3.3)/0x0FFF;uint16_t temp =singleResult*1000;batt_valu=temp*4;BLE_RTT("singleResult===%d.....valu=%d\r\n",sample.data,batt_valu);IADC_clearInt(IADC0, IADC_IF_SINGLEFIFODVL);iadc_uinit();
}

2.5 注意点

系列0和系列1的一些Silincon Labs的蓝牙、MCU芯片采取的是把内部LDO的参考源电压x2来提升测量范围,才能测量VDD,系列2的EFR32BG22系列蓝牙SOC简化了这个过程。EFR32BG22如果不采用外部的参考源,测量VDD时,会采用内部的1.21V作为参考源,VDD作为输入信号源。那么问题来了: VREF=1.21V,而VDD一般会大于1.22V,介于1.8V到3V之间,超过了量程,是否根本无法测量?
连接来源:访问地址

但是EFR32BG22有一个特点,当VDD作为ADC的输入源时,实际上有进行1/4分压,如下:

所以当输入源=VDD/4时,1.21V的VREF量程是足够的。
实现过程:
开始GPIO和IADC时钟
// Enable GPIO clock branch
CMU_ClockEnable(cmuClock_GPIO, true);
// Enable IADC clock
CMU_ClockEnable(cmuClock_IADC0, true);
参考源选择内部1.21V
initAllConfigs.configs[0].reference = iadcCfgReferenceInt1V2;
参考源选择,直接选择VDD,例如:这里VDD为电池供电3V,那么实际内部输入电压只有0.75V,小于参考源电压,可以测量出来VDD的电压:
initSingleInput.posInput = iadcPosInputDvdd;
initSingleInput.negInput = iadcNegInputGnd;
4. VDD电压计算
采集到的IDAC数据:sample = IADC_pullSingleFifoResult(IADC0).data;
计算输入电压:singleResult = (sample * 1.21) / 0xFFFF;
还原VDD实际电压:VDD = singleResult *4;

Silicon EFR32BG22(5)ADC读取电池电压功能相关推荐

  1. 普中科技51单片机的ADC采样电位器功能实现以及特点

    ADC模数转换的目的: **单片机能够接受和处理的数据都是离散的数字量,而不是连续的模拟量,**就和机器语言不能和普通语言一样通用,要先转换成单片机能够接受的数据,才能进行对模拟量数据(比如,温度,受 ...

  2. STM32——ADC读取光敏传感器控制LED灯,看门狗中断

    本文介绍两种使用方法 一.编写读取AD值的函数,之后判断AD值,进行相应操作,比如点灯. 二.用ADC读取光敏传感器AO口输出,并配置ADC通道看门狗监控这条通道,当光线太暗时打开LED灯. 之后会再 ...

  3. 高通SDM450 ADC读取电池驱动调试

    由于项目需要,使用的sdm450模块不带PMIC电源管理的,而项目又需要接电池使用,所以硬件把电池端接到一个ADC口,做了个简单的电池电路,通过ADC读取数值来确定电池电压,然后换算电池电量. 电池驱 ...

  4. 【沁恒WCH CH32V307V-R1开发板两路ADC读取实验】

    [沁恒WCH CH32V307V-R1开发板两路ADC读取实验] 1. 前言 2. 软件配置 2.1 安装MounRiver Studio 3. ADC项目测试 3.1 打开ADC工程 3.2 编译项 ...

  5. 有悔棋功能的五子棋c语言代码,有保存读取悔棋功能的五子棋.doc

    有保存读取悔棋功能的五子棋 制作拖动鼠标产生水纹动画的制作 1.导入一张合适的图片到库中 2.在库中刚导入的图片上点击右键.点击"链接",再按下图设置链接属性. 3.新建一个空影片 ...

  6. mac系统如何开启自带NTFS读取/读写功能教程

    U盘格式(FAT32.NTFS.exFAT) 1.FAT32格式兼容性好,Windows平台的传统文件格式,但不支持4GB以上的文件,可转NTFS 2.NTFS格式推出的要晚,技术更先进,更高的安全属 ...

  7. ESP32 ESP-IDF ADC监测电池电压(带校正)

    陈拓 2022/06/24-2022/06/24 1. 概述 此示例显示如何配置ADC1并读取连接到GPIO引脚的电压. 引脚功能 在本例中,我们使用默认的ADC_UNIT_1,我们电池供电的应用中将 ...

  8. Silicon EFR32BG22低功耗蓝牙开发入门篇

    一 环境搭建 开发环境使用官方提供的Simplicity Studio,在官网即可下载到.silicon 官网:https://www.silabs.com/ 该平台的SDK以及文档全部都可以通过Si ...

  9. 低功耗产品ADC精确测量电池电压(电量)

    最近在搞一个小项目用到了电池电量采集,在网上看到了一个低功耗产品教程可实现电池电压精确采集,特此记录学习.https://www.bilibili.com/video/BV1eV411t7fn?p=3 ...

最新文章

  1. SQLSERVER拆分字符串的函数(表值函数)
  2. Angular和SAP C4C的事件处理队列
  3. 没有可用于当前位置的源代码
  4. 初学Windows编程笔记1——窗口和消息
  5. 【Python】爬虫学习
  6. Memcached使用手册
  7. SQL语句,统计一段时间内有多少个工作日
  8. boost::callable_traits的is_rvalue_reference_member的测试程序
  9. 第二届构建之法论坛预告(草案)
  10. 前出塞数据挖掘的一些必须了解的概念
  11. 面向对象第四单元总结和期末总结
  12. 区块链100讲:Vitalik Buterin-以太坊Casper惩罚条件的最小化
  13. 数据禾|2001年珠江-西江经济带植被类型分布数据
  14. 可控硅工作原理及参数详解
  15. donet framework4.X==windows窗体应用新建项目,通过System.Data.SqlClient连接sqlserver进行查询
  16. 本地blast安装使用教程
  17. 在OpenWRT路由器上自动更新github等网站的hosts
  18. 敏捷项目管理传统项目管理的区别
  19. 七年之痒,从小米6看小米公司的善与罪
  20. WM_CTLCOLOR消息重载

热门文章

  1. echarts 旭日图sunburst
  2. git did not exit cleanly (exit code 128)处理方式
  3. RecentsActivity启动分析二
  4. oRbIt 的专栏 用天文方法计算二十四节气(下)
  5. pyspark:RDD和DataFrame
  6. 简单的md5加密数据及密码复杂度校验
  7. 调试spi转can芯片MCP2518和can芯片MCP2542FD
  8. Jmeter接口压力测试--先登录后再测
  9. @sequencegenerator oracle,SequenceGenerator注解的使用
  10. 风暴英雄修改服务器,风暴英雄已支持全球各服务器切换 国服不包含在内