【经验】Zigbee SoC芯片EFR32MG21系列如何进行BatteryMonitor Plugin的修正
SILICON LABS的Zigbee SoC芯片EFR32MG系列,与市场同类芯片相比,具有功耗低(1.5uA睡眠功耗,9mA接收功耗,16mA发射功耗at 3dbm),射频性能好(-104.7dbm接收灵敏度,+20dbm最高发射功率),Zigbee网络协议栈性能优(至少400节点在Silicon Labs办公室长期运行测试),在Zigbee市场上占有很高的份额,且目前还有很多工程师在投入研发。
Silicon Labs的EFR32MG Series 2系列由于成本的降低、体积变小、射频性能提升等优点,成为市场的新宠。但是截止EmberZNet 6.7.0版本,对应EFR32MG21系列芯片的Battery Monitor Plugin尚未更新,本文将代码奉上,供参考。主要是使用EFR32MG21的AVDD来测量主供电电压。
对Zigbee工程的battery-monitor-efr32.c直接进行修改,建议Edit in SDK:
在更改时建议增加
#if EFR32MG21
#endif
来避免本次修改对其他工程产生的影响。
前提是需要添加em_iadc.c到工程,参考文章(【经验】SiliconLabs集成开发环境SimplicityStudio IDE如何为工程添加链接文件)
将原文件line 22处 #include “em_adc.h”
修改为:
#if EFR32MG21
#include "em_iadc.h"
#else
#include "em_adc.h"
#endif
——————————————分割线——————————————————
原文件line 73处的#define ADC_REFERENCE_VOLTAGE_MILLIVOLTS 5000修改为:
#define ADC_REFERENCE_VOLTAGE_MILLIVOLTS 1200
原文件Line 111处函数:void halBatteryMonitorInitialize(void)修改为:
void halBatteryMonitorInitialize(void)
{
#if EFR32MG21
CMU_ClockEnable(cmuClock_IADC0, true);
// Declare init structs
IADC_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;
IADC_reset(IADC0);
// Set reference voltage, positive-, negative inputs
initAllConfigs.configs[0].reference = iadcCfgReferenceInt1V2;
//initAllConfigs.configs[0].analogGain = iadcCfgAnalogGain3x;
initSingleInput.posInput = iadcPosInputAvdd;
initSingleInput.negInput = iadcNegInputGnd;
// Initialize IADC
IADC_init(IADC0, &init, &initAllConfigs);
// Initialize Scan
IADC_initSingle(IADC0, &initSingle, &initSingleInput);
IADC0->SINGLE |= 1;
// Allocate the analog bus for ADC0 inputs
// GPIO->IADC_INPUT_0_BUS |= IADC_INPUT_BUSALLOC;
//GPIO->CDBUSALLOC
// IADC_command(IADC0, iadcCmdStartSingle);
// IADC_Result_t sample=IADC_pullSingleFifoResult(IADC0);
// // vData = sample.data;
// // voltageMilliV = AdcToMilliV(vData);
// emberAfPluginBatteryMonitorDataCallback(sample.data);
emberEventControlSetDelayMS(emberAfPluginBatteryMonitorReadADCEventControl,MS_BETWEEN_BATTERY_CHECK);
#else
uint32_t flags;
ADC_Init_TypeDef init = ADC_INIT_DEFAULT;
ADC_InitSingle_TypeDef initAdc = ADC_INITSINGLE_BATTERY_VOLTAGE;
// Enable ADC clock
CMU_ClockEnable(cmuClock_ADC0, true);
// Initialize the ADC peripheral
ADC_Init(ADC0, &init);
// Setup ADC for single conversions for reading AVDD with a 5V reference
ADC_InitSingle(ADC0, &initAdc);
flags = ADC_IntGet(ADC0);
ADC_IntClear(ADC0, flags);
ADC_Start(ADC0, adcStartSingle);
CMU_ClockEnable(cmuClock_PRS, true);
// Initialize the PRS system to drive a GPIO high when the preamble is in the
// air, effectively becoming a TX_ACT pin
PRS_SourceSignalSet(BSP_BATTERYMON_TX_ACTIVE_CHANNEL,
PRS_SOURCE,
PRS_SIGNAL,
PRS_EDGE);
// Enable the PRS channel and set the pin routing per the settings in the
// board configuration header
PRS->ROUTEPEN = 1 << BSP_BATTERYMON_TX_ACTIVE_CHANNEL;
PRS->PRS_ROUTE_LOC = PRS->PRS_ROUTE_LOC & ~PRS_PIN_MASK;
PRS->PRS_ROUTE_LOC = PRS->PRS_ROUTE_LOC
| (BSP_BATTERYMON_TX_ACTIVE_LOC
<< PRS_PIN_SHIFT);
GPIO_PinModeSet(BSP_BATTERYMON_TX_ACTIVE_PORT,
BSP_BATTERYMON_TX_ACTIVE_PIN,
gpioModePushPull,
0);
// Set up the generic interrupt controller to activate the readADC event when
// TX_ACTIVE goes hi
irqConfig = halGenericInterruptControlIrqCfgInitialize(
BSP_BATTERYMON_TX_ACTIVE_PIN,
BSP_BATTERYMON_TX_ACTIVE_PORT,
0);
halGenericInterruptControlIrqEventRegister(
irqConfig,
&emberAfPluginBatteryMonitorReadADCEventControl);
halGenericInterruptControlIrqEdgeConfig(irqConfig,
HAL_GIC_INT_CFG_LEVEL_POS);
halGenericInterruptControlIrqEnable(irqConfig);
#endif
}
——————————————分割线——————————————————————
原文件Line 173处函数 void emberAfPluginBatteryMonitorReadADCEventHandler(void)修改为:
void emberAfPluginBatteryMonitorReadADCEventHandler(void)
{
#if EFR32MG21
uint16_t voltageMilliV;
uint32_t vData;
uint32_t currentMsTick = halCommonGetInt32uMillisecondTick();
uint32_t timeSinceLastMeasureMS = currentMsTick - lastBatteryMeasureTick;
//emberEventControlSetInactive(emberAfPluginBatteryMonitorReadADCEventControl);
//if (timeSinceLastMeasureMS >= MS_BETWEEN_BATTERY_CHECK)
{
IADC_command(IADC0, iadcCmdStartSingle);
IADC_Result_t sample=IADC_pullSingleFifoResult(IADC0);
//double singleResult = sample.data * 3.3 / 0xFFF;
vData = sample.data;
voltageMilliV = 4*AdcToMilliV(vData);
emberAfPluginBatteryMonitorDataCallback(voltageMilliV);
lastReportedVoltageMilliV = voltageMilliV;
lastBatteryMeasureTick = currentMsTick;
}
emberEventControlSetDelayMS(emberAfPluginBatteryMonitorReadADCEventControl,MS_BETWEEN_BATTERY_CHECK);
#else
uint32_t flags;
uint32_t vData;
uint16_t voltageMilliV;
uint32_t currentMsTick = halCommonGetInt32uMillisecondTick();
uint32_t timeSinceLastMeasureMS = currentMsTick - lastBatteryMeasureTick;
ADC_InitSingle_TypeDef initAdc = ADC_INITSINGLE_BATTERY_VOLTAGE;
emberEventControlSetInactive(emberAfPluginBatteryMonitorReadADCEventControl);
// In case something else in the system was using the ADC, reconfigure it to
// properly sample the battery voltage
ADC_InitSingle(ADC0, &initAdc);
if (timeSinceLastMeasureMS >= MS_BETWEEN_BATTERY_CHECK) {
// The most common and shortest (other than the ACK) transmission is the
// data poll. It takes 512 uS for a data poll, which is plenty of time for
// a 16 cycle conversion
flags = ADC_IntGet(ADC0);
ADC_IntClear(ADC0, flags);
ADC_Start(ADC0, adcStartSingle);
// wait for the ADC to finish sampling
while ((ADC_IntGet(ADC0) & ADC_IF_SINGLE) != ADC_IF_SINGLE) {
}
vData = ADC_DataSingleGet(ADC0);
voltageMilliV = AdcToMilliV(vData);
// filter the voltage to prevent spikes from overly influencing data
voltageMilliV = filterVoltageSample(voltageMilliV);
emberAfPluginBatteryMonitorDataCallback(voltageMilliV);
lastReportedVoltageMilliV = voltageMilliV;
lastBatteryMeasureTick = currentMsTick;
}
#endif
}
—————————————————分割线———————————————————
最后说明一下,该电池电压测量经修改后,不再是RF发送时测量电池电压,而是周期性测量电池电压。
- |
- +1 赞 0
- 收藏
- 评论 2
本文由Song提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。
相关推荐
【经验】多协议无线 SOC EFR32MG实现ZigBee的OTA操作指南
EFR32MG系列是Silicon Labs公司推出支持多协议无线 SOC,可以单芯片支持私有协议、BLE5.0、BLE MESH、ZigBee和Thread协议,并且可以单芯片支持Sub-GHz和2.4GHz的频段。由于其超低功耗、高射频性能以及高集成度等特点被广泛应用于智能家居、安防、智能工业等市场。在ZigBee的实际应用中,OTA是必不可少的功能,由于选择的型号不同,配置OT
【经验】Simplicity Studio v5软件创建ZigBee Z3Gateway Host工程的方法
本文主要介绍如何使用Simplicity Studio v5软件创建ZigBee Z3Gateway Host工程的方法,以Silicon Labs的无线SoC芯片EFR32MG21为例。
【经验】创建ZigBee的无线SOC网关工程操作步骤
Silicon Labs公司的EFR32MG系列是针对智能家居市场应用的多协议无线SOC,单芯片支持蓝牙、ZigBee和Thread等协议,尤其是高性价比的系列2产品MG21、MG22,在ZigBee应用方面受到广大工程师的青睐。对于新手来说,使用SOC模式网关是最简单不过,本文就指导大家创建ZigBee的SOC网关工程操作步骤。
芯科科技BG27/MG27 SoC系列产品荣获2023年维科杯芯片技术突破奖,专为尺寸极小的物联网设备设计
Silicon Labs的BG27蓝牙SoC以及支持Zigbee及其他专有协议的MG27 SoC系列产品获颁“维科杯OFweek 2023物联网行业创新技术产品奖-芯片技术突破奖殊荣”。
【经验】无线SoC芯片EFR32MG21程序中MFG_SECURITY_CONFIG参数的设置与功能
在无线SoC芯片EFR32MG21的ZigBee默认Z3Light程序运行时我们可以通过keys print这个CLI命令打印NWK key与TC Link Key等密钥参数,打印的效果如下,那我们是否可以隐藏这些密钥无法打印呢?
【经验】配置迈斯威志WizPro200EFM烧录器实现脱机烧录无线SoC芯片EFR32MG21固件的方法
Silicon Labs的EFR32MG21无线SoC芯片,主要用于ZigBee和Matter设备。本文主要介绍如何配置迈斯威志WizPro200EFM烧录器,实现脱机烧录EFR32MG21无线SoC芯片固件的方法。
【经验】教你如何修改EFR32MG系列SOC ZigBee工程的CCA阈值
Silicon Labs公司的EFR32MG系列SOC单芯片已被广泛应用于智能家居市场产品中。对于ZigBee协议栈,无论单播还是广播,数据包在发送之前MAC层会检测CCA(Clear Channel Assessment ),如果检测到接收信号强度低于阈值,数据包就不发送。因此需要根据实际情况来设置合理的CCA阈值,本文就指导大家来设置EFR32MG系列SOC的CCA阈值。
【经验】无线SoC芯片EFR32MG21手动生成OTA文件的方法与注意事项
在使用SILICON LABS无线SoC芯片EFR32MG21芯片设计ZigBee产品时,我们会用到OTA功能,这就要产生OTA文件。EmberZNet 6.x版本的项目中会自动为启用了OTA客户端插件的项目创建OTA文件,需要我们手动去创建OTA文件。
【经验】多协议无线SoC EFR32MG的ZigBee开发之Token使用教程
EFR32MG系列是Silicon Labs公司针对多协议推出的无线SOC,单芯片可以支持Sub-G、蓝牙、Thread和Zigbee多种协议。Token是用来存储非易失性数据的即掉电后也能保存,本文档指导大家如何在EmberZNet PRO应用程序中自定义Token来存储非易失性数据。
【应用】基于EFR32MG21作为zigbee接入单元和SGM2205作为电源转换芯片设计的智能家居zigbee网关产品
笔者有参与一款智能家居zigbee网关产品研发,zigbee单元基于芯科科技最新Gecko系列2高性价比EFR32MG21A020F512IM32-B芯片设计,WiFi单元基于专注于物联网应用的乐鑫ESP32-DOWD芯片设计,并选用圣邦微SGM2205-ADJXTDB8G/TR电源芯片实现5V转3.3V为zigbee和WiFi芯片供电。
【经验】ZigBee程序中NVM3基地址的重新定义
我们在使用无线SoC芯片EFR32MG21做ZigBee程序时,程序中会用到NVM3保存一些参数,但NVM3的存储地址我们在程序中很难找到设置的地方,如果想修改NVM3的存储地址要如何处理?
【选型】ZigBee Soc芯片EM3585与EFR32MG21(Serial 2)参数对比
自2013以来,Silicon Labs(原Ember)推出了EM35x系列,这个方案凭借极好的协议栈运行稳定性,在大量产品中得到应用。2019年EFR32MG Serial 2推出后,在性能与价格方面都体现出具大的优势。加之许多原来在用EM3585,EM357的产品也遇到了一些供应和维护的困难,在进行产品升级或者降成本两个方面考虑,都会遇到选型困难,希望本文可以可以帮助大家了解到ZigBee芯片
【经验】Simplicity Studio v5软件配置ZigBee调试打印信息的方法
在调试EFR32MG21无线SoC芯片的ZigBee程序时,需要EFR32MG21芯片使用串口打印ZigBee的调试信息。本文以EFR32MG21芯片的Z3Light工程为例,介绍Simplicity Studio v5软件配置ZigBee调试打印信息方法。
【经验】芯科多协议SoC EFR32MG22从启动到加入ZigBee3.0网络的时间分析
我们在使用SILICON LABS多协议SoC EFR32MG22做ZigBee产品时会关心芯片从上电到加入网络具体需要多长时间,这个对使用电池类供电的产品是很重要的参数,本文将分析一下这个过程的时间,介绍初始化时间与扫描入网时间。
电子商城
品牌:SILICON LABS
品类:Wireless Gecko SoC
价格:¥8.1764
现货: 103,878
品牌:SILICON LABS
品类:Mighty Gecko Multi-Protocol Wireless SoC
价格:¥27.0929
现货: 90,767
现货市场
品牌:SILICON LABS
品类:Switch Hall Effect Magnetic Position Sensor
价格:¥2.2924
现货:126,000
服务
提供语音芯片、MP3芯片、录音芯片、音频蓝牙芯片等IC定制,语音时长:40秒~3小时(外挂flash),可以外挂TF卡或U盘扩容。
最小起订量: 1pcs 提交需求>
提供蓝牙BLE芯片协议、蓝牙模块、蓝牙成品测试认证服务;测试内容分Host主机层,Controller控制器层,Profile应用层测试。支持到场/视频直播测试,资深专家全程指导。
实验室地址: 深圳 提交需求>
登录 | 立即注册
提交评论