This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1312R:CC1312R 的功耗

Guru**** 2478765 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1336634/cc1312r-power-consumption-of-cc1312r

器件型号:CC1312R

您好!

我的 mainThread 作为附件

/*
 *  ======== txTaskFunction ========
 */
void *mainThread(void *arg0)
{
#if 0
#if (POWER_CONSUMPTION_TEST == 1)
#if 0	// shutdown
		DBG ("POWER_CONSUMPTION_TEST\n");
		/* Go to shutdown */
		Power_shutdown(0, 0);
#else	// standby
		while (1)
			{
			GPIO_write(CONFIG_GPIO_OP_GLED, 1);
			Task_sleep (_TO_TICK(10000));
			GPIO_write(CONFIG_GPIO_OP_GLED, 0);
			Task_sleep (_TO_TICK(10000));
			}
#endif
#endif
#endif

	PowerCC26X2_ResetReason resetReason = PowerCC26X2_getResetReason();

	/* If we are waking up from shutdown, we do something extra. */
	if (resetReason == PowerCC26X2_RESET_SHUTDOWN_IO)
		{
		/* Application code must always disable the IO latches when coming out of shutdown */
		PowerCC26X2_releaseLatches();

		/* In this example we toggle LED1 */
		//LED_startBlinking(led1Handle, 500, 3);
		DBG ("PowerCC26X2_RESET_SHUTDOWN_IO\n");

		running_sec = 0;
		}

	Semaphore_post(task_start_sem);

	RF_Params rfParams;
	RF_Params_init(&rfParams);

	/* Customize the CMD_PROP_TX command for this application */
	RF_cmdPropTx.syncWord = AIOT_SYNC_WORD;
	RF_cmdPropTx.pktLen = PAYLOAD_LENGTH;
	RF_cmdPropTx.pPkt = packet;
#if (MULTI_THREAD == 0)
	RF_cmdNop.startTrigger.triggerType = TRIG_ABSTIME;
#else
	RF_cmdNop.startTrigger.triggerType = TRIG_NOW;
#endif
	RF_cmdNop.startTrigger.pastTrig = 1;

	/* Set up the next pointers for the command chain */
	RF_cmdNop.pNextOp = (rfc_radioOp_t*)&RF_cmdPropCs;	// carrier sense command
	RF_cmdPropCs.pNextOp = (rfc_radioOp_t*)&RF_cmdCountBranch;
	RF_cmdCountBranch.pNextOp = (rfc_radioOp_t*)&RF_cmdPropTx;
	RF_cmdCountBranch.pNextOpIfOk = (rfc_radioOp_t*)&RF_cmdPropCs;

	/* Customize the API commands with application specific defines */
	RF_cmdPropCs.rssiThr = RSSI_THRESHOLD_DBM;
	RF_cmdPropCs.csEndTime = (IDLE_TIME_US + 150) * 4; /* Add some margin */
	RF_cmdCountBranch.counter = CS_RETRIES_WHEN_BUSY;

	// change tx power
	RF_cmdPropRadioDivSetup.txPower = tx_power_table [nvs_cfg_data.rf_tx_power];

	/* Request access to the radio */
#if defined(DeviceFamily_CC26X0R2)
	rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioSetup, &rfParams);
#else
	rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
#endif// DeviceFamily_CC26X0R2

	/* Set the frequency */
	//RF_cmdFs.fractFreq = fract_freq[nvs_rf_channel];
	RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);

#if (POWER_CONSUMPTION_TEST == 1)
#if 0	// shutdown
		DBG ("POWER_CONSUMPTION_TEST\n");
		/* Go to shutdown */
		Power_shutdown(0, 0);
#else	// standby
		while (1)
			{
			GPIO_write(CONFIG_GPIO_OP_GLED, 1);
			Task_sleep (_TO_TICK(10000));
			GPIO_write(CONFIG_GPIO_OP_GLED, 0);
			Task_sleep (_TO_TICK(10000));
			}
#endif
#endif

我通过移动 Task_sleep()位置来测试功耗。
当我将 Task_sleep ();在 rf_postCmd ()之前为 Ser freq...时、电流消耗是合理的。
但是,我把 Task_sleep ()放在  rf_postCmd ()之后,电流消耗很高,大约是4mA。
我知道 AFA、在使用 TI_RTOS 时、Task_sleep () l 函数本身就是电源管理。
如果没有、我该怎么做?

我称之为 Power_SHUTDOWN ()、在该位置、电流消耗会变得合理。

Br
保罗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Paul、

    请查看此应用手册以了解如何执行功率测量。 确保跳线连接方式与应用手册的测试设置部分中所述相同。  www.ti.com/.../swra478d.pdf

    请查看 rfPacketTx 示例、避免在应用中调用电源驱动器 API。

    如果您需要设备进入待机状态,您是对的,如果没有活动线程,您可以使用 task_sleep()进入待机状态。  

    另请注意、调试时不允许待机。 因此、如果您处于活动的调试会话中、预计电流消耗会很高。

    此致、

    SID  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    我的代码基于 rfListenBeforeTalk。
    该代码不使用任何睡眠();

    但 rfPacketTx 使用 sleep 和 rf_yield ();

    我在调用 sleep ()之前把 RF_Yield (),电流消耗变得合理;

    Br
    保罗  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Paul、

    如果您使用 RF_Yield、设备将关闭无线电。

    如果无线电处于活动状态,则会消耗功率。 如果未对  rfListenBeforeTalk 示例进行任何修改、则在数据包传输之间将看到200ms 的待机电流。

    https://dev.ti.com/tirex/explore/node?node=A__AIg6hAunm0zPgieQJ-sMBg__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK_PROPRF_MODULE__BSEc4rl__LATEST

    如果需要更小的平均电流、可以增加传输之间的间隔。

    此致、

    SID

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    谢谢你。
    我已经将周期更改为几十秒。  

    Br
    保罗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我的代码来自 ListenBeforeTalk 示例代码。

    void *mainThread(void *arg0)
    {
    	PowerCC26X2_ResetReason resetReason = PowerCC26X2_getResetReason();
    
    	/* If we are waking up from shutdown, we do something extra. */
    	if (resetReason == PowerCC26X2_RESET_SHUTDOWN_IO)
    		{
    		/* Application code must always disable the IO latches when coming out of shutdown */
    		PowerCC26X2_releaseLatches();
    
    		/* In this example we toggle LED1 */
    		//LED_startBlinking(led1Handle, 500, 3);
    		DBG ("PowerCC26X2_RESET_SHUTDOWN_IO\n");
    
    		running_sec = 0;
    		}
    
    	Semaphore_post(task_start_sem);
    
    	RF_Params rfParams;
    	RF_Params_init(&rfParams);
    
    	/* Customize the CMD_PROP_TX command for this application */
    	RF_cmdPropTx.syncWord = AIOT_SYNC_WORD;
    	RF_cmdPropTx.pktLen = PAYLOAD_LENGTH;
    	RF_cmdPropTx.pPkt = packet;
    	RF_cmdNop.startTrigger.triggerType = TRIG_ABSTIME;
    	RF_cmdNop.startTrigger.pastTrig = 1;
    
    	/* Set up the next pointers for the command chain */
    	RF_cmdNop.pNextOp = (rfc_radioOp_t*)&RF_cmdPropCs;	// carrier sense command
    	RF_cmdPropCs.pNextOp = (rfc_radioOp_t*)&RF_cmdCountBranch;
    	RF_cmdCountBranch.pNextOp = (rfc_radioOp_t*)&RF_cmdPropTx;
    	RF_cmdCountBranch.pNextOpIfOk = (rfc_radioOp_t*)&RF_cmdPropCs;
    
    	/* Customize the API commands with application specific defines */
    	RF_cmdPropCs.rssiThr = RSSI_THRESHOLD_DBM;
    	RF_cmdPropCs.csEndTime = (IDLE_TIME_US + 150) * 4; /* Add some margin */
    	RF_cmdCountBranch.counter = CS_RETRIES_WHEN_BUSY;
    
    	// change tx power
    	RF_cmdPropRadioDivSetup.txPower = tx_power_table [nvs_cfg_data.rf_tx_power];
    
    	/* Request access to the radio */
    #if defined(DeviceFamily_CC26X0R2)
    	rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioSetup, &rfParams);
    #else
    	rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    #endif// DeviceFamily_CC26X0R2
    
    	/* Set the frequency */
    	//RF_cmdFs.fractFreq = fract_freq[nvs_rf_channel];
    	RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    
    	static uint32_t _time = 0;
    
    	/* Get current time */
    	_time = RF_getCurrentTime();
    
    	/* Run forever */
    	while(true)
    		{
    		int len;
    
    		len = build_sensor_data_packet (packet);
    		DBG ("(%d) PKT SENT: ", pkt_tx_cnt ++);
    		for (int i = 0; i < len; i ++)
    			{
    			DBG ("%02X,", packet[i]);
    			}
    		DBG ("\n");
    		RF_cmdPropTx.pktLen = len;
    		/* Set absolute TX time to utilize automatic power management */
    		_time += (PACKET_INTERVAL_US * (nvs_cfg_data.broadcast_period_msec));
    		RF_cmdNop.startTime = _time;
    
    		/* Send packet */
    		RF_runCmd(rfHandle, (RF_Op*)&RF_cmdNop, RF_PriorityNormal, &callback, 0);
    
    		RF_cmdNop.status = IDLE;
    		RF_cmdPropCs.status = IDLE;
    		RF_cmdCountBranch.status = IDLE;
    		RF_cmdPropTx.status = IDLE;
    		RF_cmdCountBranch.counter = CS_RETRIES_WHEN_BUSY;
    
    		RF_yield (rfHandle);
    		Task_sleep (_TO_TICK(10000));
    		}
    }
    

    我添加了 RF_Yield 和 Task_sleep。

    可以吗?  

    当我将 Task_sleep 设置1秒时
    这种代码在1~2天和更多的时间里都能很好地发挥作用。

    但我将睡眠设置为10秒。 它在大约20 ~30秒后停止运行。

    nvs_cfg_data.broadcast_period_msec 设置为5000。 5秒

    AFA 我知道、LBT 在 TX 前监控空气状态、如果空气中没有能量、那么发送。
    因此、我使用这个 LBT。 在韩国、 RSSI_THRESHOLD_DBM 设为90

    rfPacketTx 也具有同样的功能? 该示例没有任何设置 RSSI_THRESHOLD_DBM。

    Br
    保罗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Paul、

    你对 RF_Yield 的使用似乎是可以的、它允许无线电内核在 TX 之后断电。 您正在使用的_to_tick 宏是什么?

    此外、如果您要使用 LBT、listenBeforeTalk 示例是正确的起点。 rfPacketTx 在传输前不侦听。

    此致、

    SID

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #define _to_tick (ms)(ms*100)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Paul、

    不确定为什么会导致问题。 除非时钟节拍周期处理不正确。  

    在 SDK 中提供的空示例中、我们使用睡眠包装器函数。  

    请您尝试使用它而不是直接调用 Task_Sleep ()吗?

    此致、
    SID

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    RF_runCmd (rfHandle、(RF_Op*)&RF_cmdNop、RF_PriorityNormal、&callback、0);  
    此函数似乎用于在 LBT 情况下进行内部电源管理。

    我取消睡眠状态并测量电流。
    电流消耗约为20~30uA。
     使用 SLEEP 功能时几乎相同。

    而且、它在一个小时后效果很好。
    --------
    还有一个问题。

    #define  packet_interval_US 1000

    _time +=(packet_interval_US *(nvs_cfg_data.broadcast_period_msec));)
    rf_cmdNop.StartTime =_time;


    我将  nvs_cfg_data.broadcast_period_msec 设置为100,000。
    我预计间隔为100秒、但发送数据包的间隔为8~9 μ s。
    我将 nvs_cfg_data.broadcast_period_msec 设置为200,000
    数据包 TX 中断看起来不是双倍。

    如何设置 TX 间隔?

    Br
    保罗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Paul、

    请尝试此行为起始时间指定值。

    RF_cmdNop.startTime = RF_getCurrentTime() + RF_convertMsToRatTicks(nvs_cfg_data.broadcast_period_msec);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    它工作得很好。
     有猜测的最大间隔 nvs_cfg_data.broadcast_period_msec?
    当我将 nvs_cfg_data.broadcast_period_msec 设置为100,000时、检测到 TX 间隔约为30秒。

    Br
    保罗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Paul、  

    RF_convertMstoRatTicks 应允许您以 ms 为单位设置时间。  

    你想做什么?

    下面这一行将在将来的绝对时间安排命令。

    请尝试此行为起始时间指定值。

    [/报价]

    如果没有其他更高优先级的事件发生、那么每当您计划发送 TX 时、设备就可以进行发送

    此致、

    SID