【经验】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
设计经验 发布时间 : 2018-09-24
【经验】Simplicity Studio v5软件创建ZigBee Z3Gateway Host工程的方法
本文主要介绍如何使用Simplicity Studio v5软件创建ZigBee Z3Gateway Host工程的方法,以Silicon Labs的无线SoC芯片EFR32MG21为例。
设计经验 发布时间 : 2022-06-11
【经验】创建ZigBee的无线SOC网关工程操作步骤
Silicon Labs公司的EFR32MG系列是针对智能家居市场应用的多协议无线SOC,单芯片支持蓝牙、ZigBee和Thread等协议,尤其是高性价比的系列2产品MG21、MG22,在ZigBee应用方面受到广大工程师的青睐。对于新手来说,使用SOC模式网关是最简单不过,本文就指导大家创建ZigBee的SOC网关工程操作步骤。
设计经验 发布时间 : 2020-04-09
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 立即选型
芯科科技BG27/MG27 SoC系列产品荣获2023年维科杯芯片技术突破奖,专为尺寸极小的物联网设备设计
Silicon Labs的BG27蓝牙SoC以及支持Zigbee及其他专有协议的MG27 SoC系列产品获颁“维科杯OFweek 2023物联网行业创新技术产品奖-芯片技术突破奖殊荣”。
原厂动态 发布时间 : 2023-09-12
【经验】无线SoC芯片EFR32MG21程序中MFG_SECURITY_CONFIG参数的设置与功能
在无线SoC芯片EFR32MG21的ZigBee默认Z3Light程序运行时我们可以通过keys print这个CLI命令打印NWK key与TC Link Key等密钥参数,打印的效果如下,那我们是否可以隐藏这些密钥无法打印呢?
设计经验 发布时间 : 2023-05-26
【经验】EFR32MG21系列芯片zigbee射频性能测试
本文介绍使用CMW100测试Silicon Labs EFR32MG21系列芯片zigbee射频性能,从测试硬件、软件准备,测试环境搭建,测试zigbee射频TX和RX射频指标步骤进行详细描述,并描述了测试中的遇到的问题和解决方法。
设计经验 发布时间 : 2020-09-30
【经验】配置迈斯威志WizPro200EFM烧录器实现脱机烧录无线SoC芯片EFR32MG21固件的方法
Silicon Labs的EFR32MG21无线SoC芯片,主要用于ZigBee和Matter设备。本文主要介绍如何配置迈斯威志WizPro200EFM烧录器,实现脱机烧录EFR32MG21无线SoC芯片固件的方法。
设计经验 发布时间 : 2023-01-21
【经验】无线SoC芯片EFR32MG21手动生成OTA文件的方法与注意事项
在使用SILICON LABS无线SoC芯片EFR32MG21芯片设计ZigBee产品时,我们会用到OTA功能,这就要产生OTA文件。EmberZNet 6.x版本的项目中会自动为启用了OTA客户端插件的项目创建OTA文件,需要我们手动去创建OTA文件。
设计经验 发布时间 : 2023-05-24
【经验】教你如何修改EFR32MG系列SOC ZigBee工程的CCA阈值
Silicon Labs公司的EFR32MG系列SOC单芯片已被广泛应用于智能家居市场产品中。对于ZigBee协议栈,无论单播还是广播,数据包在发送之前MAC层会检测CCA(Clear Channel Assessment ),如果检测到接收信号强度低于阈值,数据包就不发送。因此需要根据实际情况来设置合理的CCA阈值,本文就指导大家来设置EFR32MG系列SOC的CCA阈值。
设计经验 发布时间 : 2019-01-31
【经验】多协议无线SoC EFR32MG的ZigBee开发之Token使用教程
EFR32MG系列是Silicon Labs公司针对多协议推出的无线SOC,单芯片可以支持Sub-G、蓝牙、Thread和Zigbee多种协议。Token是用来存储非易失性数据的即掉电后也能保存,本文档指导大家如何在EmberZNet PRO应用程序中自定义Token来存储非易失性数据。
设计经验 发布时间 : 2019-02-13
【经验】ZigBee程序中NVM3基地址的重新定义
我们在使用无线SoC芯片EFR32MG21做ZigBee程序时,程序中会用到NVM3保存一些参数,但NVM3的存储地址我们在程序中很难找到设置的地方,如果想修改NVM3的存储地址要如何处理?
设计经验 发布时间 : 2023-05-23
【应用】基于EFR32MG21作为zigbee接入单元和SGM2205作为电源转换芯片设计的智能家居zigbee网关产品
笔者有参与一款智能家居zigbee网关产品研发,zigbee单元基于芯科科技最新Gecko系列2高性价比EFR32MG21A020F512IM32-B芯片设计,WiFi单元基于专注于物联网应用的乐鑫ESP32-DOWD芯片设计,并选用圣邦微SGM2205-ADJXTDB8G/TR电源芯片实现5V转3.3V为zigbee和WiFi芯片供电。
应用方案 发布时间 : 2019-08-15
【经验】如何在Gateway Soc (internal flash)中实现 Ota Server?
EFR32MG多协议SoC芯片是Silicon Labs专门针对 IOT 推出的ZigBee方案,高达19.5dbm的发射功率,-102.7dbm的接收灵敏度,在业界内拥有最佳的RF射频性能,具有最全的Zigbee网络协议,被广泛应用在智能家居,工业控制等行业。本文介绍在开发 Zigbee Gateway 时如何在Gateway Soc (internal flash)中实现 Ota Server
设计经验 发布时间 : 2019-01-03
【经验】Simplicity Studio v5软件配置ZigBee调试打印信息的方法
在调试EFR32MG21无线SoC芯片的ZigBee程序时,需要EFR32MG21芯片使用串口打印ZigBee的调试信息。本文以EFR32MG21芯片的Z3Light工程为例,介绍Simplicity Studio v5软件配置ZigBee调试打印信息方法。
设计经验 发布时间 : 2023-03-31
电子商城
品牌:SILICON LABS
品类:Wireless Gecko SoC
价格:¥8.1764
现货: 104,128
品牌: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 灵敏度测量与测试,天线阻抗测量与匹配电路调试服务。支持到场/视频直播测试,资深专家全程指导。
实验室地址: 深圳/苏州 提交需求>
登录 | 立即注册
提交评论