【经验】Zigbee SoC芯片EFR32MG21系列如何进行BatteryMonitor Plugin的修正

2020-02-07 世强
Zigbee SoC芯片,EFR32MG21,Silicon Labs Zigbee SoC芯片,EFR32MG21,Silicon Labs Zigbee SoC芯片,EFR32MG21,Silicon Labs Zigbee SoC芯片,EFR32MG21,Silicon Labs

SILICON LABSZigbee 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发送时测量电池电压,而是周期性测量电池电压。

 

授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,3D模型库,原理图,PCB封装文件,选型指南来源平台:世强硬创平台www.sekorm.com
现货商城,价格查询,交期查询,订货,现货采购,在线购买,样品申请渠道:世强硬创平台电子商城www.sekorm.com/supply/
概念,方案,设计,选型,BOM优化,FAE技术支持,样品,加工定制,测试,量产供应服务提供:世强硬创平台www.sekorm.com
集成电路,电子元件,电子材料,电气自动化,电机,仪器全品类供应:世强硬创平台www.sekorm.com
  • +1 赞 0
  • 收藏
  • 评论 2

本文由Song提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。

评论

   |   

提交评论

全部评论(2

  • asd Lv8 2020-02-19
    nice
  • ACE Lv7. 资深专家 2020-02-07
    学写了
没有更多评论了

相关推荐

【经验】多协议无线 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

芯科科技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

【经验】多协议无线SoC EFR32MG的ZigBee开发之Token使用教程

EFR32MG系列是Silicon Labs公司针对多协议推出的无线SOC,单芯片可以支持Sub-G、蓝牙、Thread和Zigbee多种协议。Token是用来存储非易失性数据的即掉电后也能保存,本文档指导大家如何在EmberZNet PRO应用程序中自定义Token来存储非易失性数据。

设计经验    发布时间 : 2019-02-13

【经验】无线SoC芯片EFR32MG21手动生成OTA文件的方法与注意事项

在使用SILICON LABS无线SoC芯片EFR32MG21芯片设计ZigBee产品时,我们会用到OTA功能,这就要产生OTA文件。EmberZNet 6.x版本的项目中会自动为启用了OTA客户端插件的项目创建OTA文件,需要我们手动去创建OTA文件。

设计经验    发布时间 : 2023-05-24

【经验】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

【经验】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

【经验】教你如何修改EFR32MG系列SOC ZigBee工程的CCA阈值

Silicon Labs公司的EFR32MG系列SOC单芯片已被广泛应用于智能家居市场产品中。对于ZigBee协议栈,无论单播还是广播,数据包在发送之前MAC层会检测CCA(Clear Channel Assessment ),如果检测到接收信号强度低于阈值,数据包就不发送。因此需要根据实际情况来设置合理的CCA阈值,本文就指导大家来设置EFR32MG系列SOC的CCA阈值。

设计经验    发布时间 : 2019-01-31

【经验】如何通过串口给EFR32MG系列Zigbee SOC芯片升级NCP固件程序?

EFR32MG系列是芯科科技针对 IOT在智能家居,工业控制等行业中推出的zigbee SOC芯片方案。拥有最佳的RF射频性能和最全的Zigbee网络协议。被广泛应用。产品在使用过程总会出一些小小的问题,需要对功能修复或者固件进行升级,除了无线 ota 之外,可以通过 uart 的形式对固件进行升级。本文是通过Hypertrm一个Xmodem GUI工具通过串口升级固件为例进行介绍。

设计经验    发布时间 : 2020-06-04

展开更多

电子商城

查看更多

只看有货

品牌:SILICON LABS

品类:Wireless SoC

价格:¥21.5556

现货: 98,861

品牌:SILICON LABS

品类:Wireless Gecko SoC

价格:¥8.1764

现货: 111,379

品牌:SILICON LABS

品类:Mighty Gecko Multi-Protocol Wireless SoC

价格:¥27.0929

现货: 98,034

品牌:SILICON LABS

品类:Wireless SoC

价格:¥9.1982

现货: 88,300

品牌:SILICON LABS

品类:8位MCU

价格:¥5.8534

现货: 88,212

品牌:SILICON LABS

品类:Wireless SoC

价格:¥27.2234

现货: 85,520

品牌:SILICON LABS

品类:Wireless SoC

价格:¥22.1593

现货: 76,980

品牌:SILICON LABS

品类:Wireless SoC

价格:¥19.9760

现货: 74,309

品牌:SILICON LABS

品类:Wireless Gecko SoC

价格:¥10.4994

现货: 67,034

品牌:SILICON LABS

品类:Transceiver

价格:¥15.8878

现货: 66,919

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:SILICON LABS

品类:Switch Hall Effect Magnetic Position Sensor

价格:¥2.2924

现货:150,000

品牌:SILICON LABS

品类:Light Sensor

价格:¥20.3400

现货:28,003

品牌:SILICON LABS

品类:Position Sensor

价格:¥3.0897

现货:12,568

品牌:SILICON LABS

品类:8位MCU

价格:¥4.9000

现货:12,000

品牌:SILICON LABS

品类:Mixed-Signal MCU

价格:¥10.1700

现货:10,000

品牌:SILICON LABS

品类:Gecko MCU

价格:¥15.6000

现货:5,353

品牌:SILICON LABS

品类:8 BIT MCU

价格:¥3.7900

现货:3,451

品牌:SILICON LABS

品类:Wireless SoC

价格:¥15.1400

现货:1,455

品牌:SILICON LABS

品类:Mixed-Signal MCU

价格:¥11.1200

现货:1,201

品牌:SILICON LABS

品类:8 BIT MCU

价格:¥16.8500

现货:550

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

物联网天线方案设计/虚拟天线芯片方案设计

Ignion可支持多协议、宽频段的物联网天线方案设计,协议:Wi-Fi、Bluetooth、UWB、Lora、Zigbee、2G、3G、4G、5G、CBRS、GNSS、GSM、LTE-M、NB-IoT等,频段范围:400MHz~10600MHz。

最小起订量: 2500 提交需求>

IoT射频性能测试

支持 3Hz ~ 26.5GHz射频信号中心频率测试;9kHz ~ 3GHz频率范围内Wi-SUN、lora、zigbee、ble和Sub-G 灵敏度测量与测试,天线阻抗测量与匹配电路调试服务。支持到场/视频直播测试,资深专家全程指导。

实验室地址: 深圳/苏州 提交需求>

世强和原厂的技术专家将在一个工作日内解答,帮助您快速完成研发及采购。
我要提问

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

研发客服
商务客服
服务热线

联系我们

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

投诉与建议

E-mail:claim@sekorm.com

商务合作

E-mail:contact@sekorm.com

收藏
收藏当前页面