【经验】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
【经验】无线SoC芯片EFR32MG21程序中MFG_SECURITY_CONFIG参数的设置与功能
在无线SoC芯片EFR32MG21的ZigBee默认Z3Light程序运行时我们可以通过keys print这个CLI命令打印NWK key与TC Link Key等密钥参数,打印的效果如下,那我们是否可以隐藏这些密钥无法打印呢?
【经验】Simplicity Studio v5软件创建ZigBee Z3Gateway Host工程的方法
本文主要介绍如何使用Simplicity Studio v5软件创建ZigBee Z3Gateway Host工程的方法,以Silicon Labs的无线SoC芯片EFR32MG21为例。
SILICON LABS ZIGBEE 无线 Gecko SoC选型表
EFR32MG无线 Gecko SoC 是在 IoT 设备上实现节能多协议连网的理想之选。芯片解决方案结合了 76.8MHz ARM和高性能 2.4GHz 无线电,旨在为 IoT连接应用提供行业领先的节无线 SoC。
产品型号
|
品类
|
Protocol Stack
|
Frequency Band @ Max TX Power(GHz@dBm)
|
Flash(kB)
|
RAM(kB)
|
GPIO(个数)
|
Operating Temperature(℃)
|
Storage Temperature(℃)
|
Pin Count
|
AVDD Supply Voltage(V)
|
EFR32MG12P433F1024GL125-C
|
Gecko Multi-Protocol Wireless SoC
|
Bluetooth LE Zigbee Thread Proprietary, Wi-SUN
|
2.4GHz @ 19dBm, Sub-GHz @ 20dBm
|
1024kB
|
256kB
|
65
|
-40℃~85℃
|
-50℃~150℃
|
BGA125
|
1.8V~3.8V
|
选型表 - SILICON LABS 立即选型
【经验】EFR32MG21系列芯片zigbee射频性能测试
本文介绍使用CMW100测试Silicon Labs EFR32MG21系列芯片zigbee射频性能,从测试硬件、软件准备,测试环境搭建,测试zigbee射频TX和RX射频指标步骤进行详细描述,并描述了测试中的遇到的问题和解决方法。
【经验】无线SoC芯片EFR32MG21手动生成OTA文件的方法与注意事项
在使用SILICON LABS无线SoC芯片EFR32MG21芯片设计ZigBee产品时,我们会用到OTA功能,这就要产生OTA文件。EmberZNet 6.x版本的项目中会自动为启用了OTA客户端插件的项目创建OTA文件,需要我们手动去创建OTA文件。
【经验】配置迈斯威志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阈值。
【经验】ZigBee程序中NVM3基地址的重新定义
我们在使用无线SoC芯片EFR32MG21做ZigBee程序时,程序中会用到NVM3保存一些参数,但NVM3的存储地址我们在程序中很难找到设置的地方,如果想修改NVM3的存储地址要如何处理?
【经验】创建ZigBee的无线SOC网关工程操作步骤
Silicon Labs公司的EFR32MG系列是针对智能家居市场应用的多协议无线SOC,单芯片支持蓝牙、ZigBee和Thread等协议,尤其是高性价比的系列2产品MG21、MG22,在ZigBee应用方面受到广大工程师的青睐。对于新手来说,使用SOC模式网关是最简单不过,本文就指导大家创建ZigBee的SOC网关工程操作步骤。
【选型】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 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芯片供电。
【经验】芯科多协议SoC EFR32MG22从启动到加入ZigBee3.0网络的时间分析
我们在使用SILICON LABS多协议SoC EFR32MG22做ZigBee产品时会关心芯片从上电到加入网络具体需要多长时间,这个对使用电池类供电的产品是很重要的参数,本文将分析一下这个过程的时间,介绍初始化时间与扫描入网时间。
电子商城
品牌:SILICON LABS
品类:Wireless Gecko SoC
价格:¥8.1764
现货: 102,628
品牌:SILICON LABS
品类:Mighty Gecko Multi-Protocol Wireless SoC
价格:¥27.0929
现货: 90,767
现货市场
品牌:SILICON LABS
品类:Switch Hall Effect Magnetic Position Sensor
价格:¥2.2924
现货:126,000
服务
Ignion可支持多协议、宽频段的物联网天线方案设计,协议:Wi-Fi、Bluetooth、UWB、Lora、Zigbee、2G、3G、4G、5G、CBRS、GNSS、GSM、LTE-M、NB-IoT等,频段范围:400MHz~10600MHz。
最小起订量: 2500 提交需求>
支持 3Hz ~ 26.5GHz射频信号中心频率测试;9kHz ~ 3GHz频率范围内Wi-SUN、lora、zigbee、ble和Sub-G 灵敏度测量与测试,天线阻抗测量与匹配电路调试服务。支持到场/视频直播测试,资深专家全程指导。
实验室地址: 深圳/苏州 提交需求>
登录 | 立即注册
提交评论