0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

板子功耗高的原因有哪些

jf_14701710 ? 来源:jf_14701710 ? 作者:jf_14701710 ? 2025-05-12 09:19 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

低功耗蓝牙应用对功耗要求越低越好,功耗越低电池续航时间就越长,用户体验就越好。当你发现你板子功耗偏高时,建议按照如下步骤进行自检:

确认理论功耗值。Bluetooth LE功耗跟广播间隔或者连接间隔是成正比关系的,所以20ms连接间隔下的功耗几乎是1s状态下的50倍!,单纯地问“1mA功耗高不高?”是没有意义的,必须结合特定的应用场景才有意义。不管是广播还是连接,特定的使用场景会有一个理论功耗值,大家可以访问网址: https://devzone.nordicsemi.com/power/,以获得你的使用场景下理论功耗多少,比如连接模式下,每1秒钟发20个字节的数据包,这种模式下理论功耗为:7.5uA

wKgZPGghTLuAYoUxAABJOiwN7HU27.jpeg

确定板子漏电流。如果板子包含的元器件比较多,那么也有可能是其他非nRF5元器件导致的高功耗,比如传感器,codec,或者电路设计本身的问题等。为了确定高功耗是来自nRF5器件还是其他器件,根据自己的情况,有如下三个方法供你参考:一如果你的固件可以直接在Nordic官方DK上运行,那么你可以把你的固件直接下载到DK上,然后通过DK测量nRF5芯片的功耗,如果这个功耗正常,那么大电流应该是由其他非nRF5元器件引起的;如果这个功耗偏高,那么大电流的确是由nRF5芯片固件引起的,此时请参考后续操作步骤说明。二如果你的固件不能在DK上直接运行,那么可以让nRF5芯片进入深度睡眠模式(System OFF模式),此时nRF5芯片功耗只有零点几微安,nRF5芯片所有IO口将处于floating状态,此时再测量板子电流。如果板子电流恢复正常,那么大电流应该是由nRF5芯片固件引起的;如果板子电流还是不正常,那么大电流应该由其他非nRF5元器件引起的。关于如何进入深度睡眠模式,你可以参考工程:SDK安装目录examplesperipheralram_retentionpca10040blankarm5_no_packs,或者参考ble_app_hrs工程中函数:sleep_mode_enter。三如果你的板子太复杂,无法按照上面两种方法来确定漏电流,那么只能将板子其他非必需元器件焊下来,只留下一个nRF5最小工作系统,然后再测量此时的板子电流是否正常。

确定板子已经退出J-Link模式。如果板子一直是电池供电,那么在某些情况下,即使程序下载完成而且运行正常,此时板子有可能还处在J-Link模式。J-Link模式下板子会有2mA左右的额外电流。要退出J-Link模式,有2种方式,一是给板子进行上电复位,二是通过nrfjprog发出—reset指令(nRF52系列)或者—pinreset指令(nRF51系列),两种方式都能让板子退出J-Link模式,从而进入应用模式。

如果最终确认大电流的确是由nRF5芯片引起的,那么几乎可以肯定系统在进入idle模式(System ON模式)之前,没有关掉不需要的模块。模块没有关掉,它就一直在耗电,从而导致功耗过大。Idle模式下,如下模块会耗费比较多的电流,若允许建议全部关掉。

Idle模式。先说明一下什么是idle模式,所谓Idle模式,Nordic芯片手册也称为System ON模式,就是CPU可以不工作而外设可以继续工作的一种低功耗模式。idle模式下,当CPU和所有外设都不工作时,系统电流只有1.2uA左右。(注:除了idle模式,nRF5芯片还支持一种更低功耗的低功耗模式:sleep模式(Nordic芯片手册称为System OFF模式),sleep模式下,CPU和所有外设都强制关闭,所以功耗非常低:只有零点几微安。由于sleep模式下,芯片无法发出广播包或者与手机保持蓝牙连接,所以sleep模式在Bluetooth LE应用中运用得并不是很多)。Idle模式可以被任何中断唤醒(sleep模式只能被IO口唤醒),所以idle模式在实际应用中使用得比较多。在idle模式下,芯片仍然可以正常发出广播或者与手机保持蓝牙连接,所以大部分Bluetooth LE应用都是工作在idle模式下,这样既保持了Bluetooth LE功能又可以实现低功耗。有softdevice时进入idle模式的函数是:

sd_app_evt_wait

无softdevice时进入idle模式的代码是:

__WFE(); // Clear the internal event register. __SEV(); __WFE();

这里我们顺便把进入sleep模式的函数也贴出来,供大家对比参考。有softdevice时进入sleep模式的函数是:

sd_power_system_off

无softdevice时进入sleep模式的代码是:

// Enter System OFF and wait for wake up from GPIO detect signal. NRF_POWER->SYSTEMOFF = 0x1;

不管softdevice有没有使能,idle模式下的电流都很低,只有1.2uA左右

UART/UARTE。由于UART需要实时检测RX线上有没有下降沿,所以一旦UART初始化成功,高频时钟将一直处于打开状态,从而导致UART模块消耗的电流比较大,虽然UART模块本身只需要55uA的工作电流,但是为了配合UART工作其他外设(比如时钟电路)需要消耗250uA左右电流,因此普通UART需要消耗300多微安电流。Nordic还有一个增强型UART:UARTE,它是带DMA功能的,而DMA还需要消耗额外的1~2mA电流,这样UARTE工作的时候需要消耗1mA多电流。因此在进入idle模式之前,强烈建议将UART关掉,以节省系统功耗。注:为了达到低功耗和实时性双重目的,在设计UART通信的时候,我们经常会额外再加2个GPIO口用来通知对方UART要传送数据了。关闭uart的API为:nrf_drv_uart_uninit或者app_uart_close。

CLI/UART。如果你使用了CLI/UART模块,请使用cli模块自带的uninit函数去关闭本模块。当cli模块和RTOS结合一起使用的时候,经常发现cli模块关闭不彻底,从而导致idle模式下功耗还是很高(比如450uA左右),此时有可能需要多次调用nrf_cli_uninit这个函数,从而确保cli/uart模块真正被关闭了。

GPIOTE。GPIOTE中断有两种工作模式:高精度模式(hi_accuracy为true)和低精度模式(hi_accuracy为false)。hi_accuracy为true将使能IN event中断;hi_accuracy为false将使能Port event中断。IN event中断功耗比Port event中断高10~20uA(nRF51将高出几百微安),因此如果应用逻辑允许的话,那么建议使用低精度模式,即使用如下初始化语句:

GPIOTE_CONFIG_IN_SENSE_TOGGLE(false) //低功耗低精度IO口中断模式

DMA。Nordic大部分外设都自带DMA功能,如果DMA可以关闭的话(有些设备DMA是不能关闭的),用完DMA之后,记得把DMA关掉,否则会有1~2mA左右的功耗。使用ADC的时候尤其要注意这点。

FPU。每当程序要执行浮点数运算的时候,Cortex M4F会自动把FPU打开,FPU是耗能大户,其将消耗7mA以上的电流。此种情况下,进入idle模式之前必须手动关闭FPU,手动关闭FPU代码如下所示:

/* Clear FPSCR register and clear pending FPU interrupts. This code is base on * nRF5x_release_notes.txt in documentation folder. It is necessary part of code when * application using power saving mode and after handling FPU errors in polling mode. */ __set_FPSCR(__get_FPSCR() & ~(FPU_EXCEPTION_MASK)); (void) __get_FPSCR(); NVIC_ClearPendingIRQ(FPU_IRQn);

Timer0/1/2/3/4。Timer的工作电流大概为5~50uA左右(nRF51功耗会更高),对低功耗应用来说,已经非常大了。如果你的定时精度要求不高,而且是毫秒的倍数,那么强烈建议你使用app_timer来实现定时功能,app_timer的功耗只有0.2uA左右。

SPI/TWI/ADC等。在进入idle模式之前,建议把SPI/TWI/ADC等模块也uninit。大家可能会担心反复init和uninit同一个模块会不会有问题?这个不用担心,目前还没看到任何副作用。

ADC。最新的ADC驱动引入了一个宏:NRFX_SAADC_CONFIG_LP_MODE,如果你发现uninit ADC后,功耗还是很高,建议打开这个宏,再试一下,功耗有可能就降下来了。

带DMA功能的UARTE。如果你的UART使用了DMA功能,测试时,发现大部分时候uninit UART后功耗都正常,偶尔会出现uninit后功耗降不下来的情况,请把这句话加在main函数的开始:*(volatile uint32_t*)(0x4007AC84) = 0x00000002;

还有一种电流异常情况:大部分芯片功耗是正常的,只有少部分芯片功耗是异常的。这种情况一般都跟IO口状态有关,如果碰到这种情况,建议对芯片每个IO口进行重新初始化,或许问题就解决了。

若无特殊情况,避免使用输入/NOPULL配置。输入模式下,要不使用内部上拉或下拉,要不使用外部的。

如果不知道该如何配置一个IO口在idle模式的状态,建议设为默认状态,即Floating状态。

已使用IO口。不管nRF51还是nRF52,尤其这些IO口被用作为其他外设比如IIC/SPI等,哪怕IO口之前已经是确定状态,在进入idle模式之前,建议对其再次进行初始化,或许问题就解决了。

未使用IO口。这个问题好像只有nRF51802才有而且跟板子也有关系,在进入sleep模式或者idle模式之前,对未使用的IO口进行非floating初始化,即把它设为输入上拉或者下拉,而不是默认的Floating状态。(其他芯片好像没有发现这个问题)


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 蓝牙
    +关注

    关注

    116

    文章

    6100

    浏览量

    174763
  • Nordic
    +关注

    关注

    9

    文章

    217

    浏览量

    48240
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    同样的代码在官方开发板上运行正常,在自己板子上就跑不起来,怎么办?

    同样的代码在Nordic官方开发板上可以运行正常,但在自己板子上就跑不起来,如果你碰到了上述情况,建议按照如下步骤进行自检: 首先确认用户板元器件焊接良好,功能正常。如果你的板子LED的话,你可以
    的头像 发表于 05-12 15:26 ?283次阅读
    同样的代码在官方开发板上运行正常,在自己<b class='flag-5'>板子</b>上就跑不起来,怎么办?

    关于低功耗蓝牙连接功耗的评估

    如下这个好用的工具来进行: 例如,想评估在0dBm下,1s连接间隔下,发送少量数据的功耗是多少,哪怕现在你的板子还没画出来,通过这个工具,也可以很快的评估出来,结果是6uA左右,方便又快捷。如果又
    发表于 04-26 17:10

    用第三方的dlp3010板子时遇到的几个问题求解

    测到VOFS=10V,VBIAS=18V,VRST=-14V,1.8v与1.1v电压均正常,intz信号为为,host_irq一直为,GUI显示powered off 想请问下dmd初始化失败的原因
    发表于 02-26 07:19

    光谱相机的优势哪些?

    光谱相机作为现代信息采集技术的重要工具,近年来受到了广泛关注。那么,光谱相机究竟是什么?它比传统相机什么独特之处?本文将为你一一揭晓。 什么是光谱相机?
    的头像 发表于 02-21 14:54 ?526次阅读
    <b class='flag-5'>高</b>光谱相机的优势<b class='flag-5'>有</b>哪些?

    AN53-微功耗侧MOSFET驱动器

    电子发烧友网站提供《AN53-微功耗侧MOSFET驱动器.pdf》资料免费下载
    发表于 01-09 14:02 ?0次下载
    AN53-微<b class='flag-5'>功耗</b><b class='flag-5'>高</b>侧MOSFET驱动器

    ads1271损坏的原因哪些?

    量程。我的输入信号是从同一个板子上的电源模块接出来的,不知道是否是这个原因。希望大神能帮助我一下,能不能找出芯片损坏的原因,谢谢!!!
    发表于 12-25 08:36

    aducm330刷写编译后的程序到板子以后,板子的调试接口便无法访问,什么原因导致的?如何解决?

    在MDK中开发了aducm330的程序,基于官方例程的设置,刷写编译后的程序到板子以后,板子的调试接口便无法访问。 出现如下的错误: 是什么原因导致的?如何进行修复?
    发表于 12-19 06:11

    导致安规电容损坏的原因哪些

    具备一定的安全标准,以保证在故障情况下不会对使用者造成电击或火灾等危险。然而,安规电容也有可能因各种原因发生损坏,常见的原因包括: 1、过电压 安规电容的额定电压一定限制。如果施加的电压超过电容的额定电压,电容可能
    的头像 发表于 12-07 09:41 ?1211次阅读
    导致安规电容损坏的<b class='flag-5'>原因</b><b class='flag-5'>有</b>哪些

    TAS5715扫FFT在13K左右个很高的尖峰是什么原因

    TAS5715 使用的时候,扫FFT怎么发现在13K左右个很高的尖峰?扫了两块板子,还有个板子是8K左右的尖峰,不知道是什么原因,谢谢!
    发表于 11-06 07:39

    TPA3116静态功耗静态电流比较大是什么原因导致的?

    关于TPA3116静态功耗大,在TI的论坛里面发现几乎所有的电感发热都是说是因为输出LC电路导致 1,想问一下这个静态功耗静态电流比较大是什么原因导致的? 2,除了LC电路会导致,还有什么
    发表于 10-12 08:35

    光缆无法做的原因哪些

    光缆无法做(即光缆施工或制造过程中遇到困难)的原因可能涉及多个方面,包括技术、材料、环境以及人为因素等。以下是一些可能导致光缆无法做的主要原因: 一、技术因素 制造工艺复杂:光缆的制造过程涉及多个
    的头像 发表于 09-18 10:23 ?800次阅读

    栅极驱动芯片选型低功耗原因

    栅极驱动芯片选型时考虑低功耗原因主要有以下几点: 1. 降低系统能耗 低功耗的栅极驱动芯片能够显著降低整个系统的待机功耗,这对于需要长时间运行的电子设备尤为重要。低
    的头像 发表于 09-18 09:20 ?998次阅读

    SD NAND SPI模式:如何实现低功耗运行

    最近,收到客户反馈,使用我们SD NAND过程中,使用SPI模式,对SD完成操作后,SD没有进入低功耗模式,未对SD进行任何操作的情况下测得的功耗仍在20mA左右。经过我们分析,发现SD进入低功耗
    的头像 发表于 09-02 11:06 ?891次阅读
    SD NAND SPI模式:如何实现低<b class='flag-5'>功耗</b>运行

    TLE2024IDW功耗很高是什么原因导致的?

    请教大家个问题 我用的精密放大器。TLE2024IDW正负15V电源供电。但是不知道为什么功耗这么。只供电源芯片温度都到了82度 。带负载就超过85度了 但是这个芯片最高温度只有85度。我是用的能否大师帮忙解答一下。下面是
    发表于 09-02 07:49

    有没有低功耗低噪声的输入阻抗的精密放大器?

    有没有低功耗低噪声的输入阻抗的精密放大器(要单电源供电1.8V)
    发表于 08-28 06:20