Keep NRF52840 and its peripherals operating during sleep?

We are working on an application using T-SOM. Our application needs the T-SOM to continuously monitor two sensors, one on the I2C bus and one using the UART of the NRF52840, as well as the IMU onboard the T-SOM. Our power budget does not permit an always-on cellular connection!

Is it possible to (using the user firmware on the T-SOM) to get into a low power state (ideally under 1 mA) without relying on the sleep function that is configured through the web console?

There's no easy way to get to 1 mA, but with the nRF52 in normal operating mode, peripherals and cellular disabled, it's 3.38 mA. Add in a little for the IMU, you'll be under 4 mA, much less than with cellular on.

Parameter Symbol Min Typ Peak Unit
Operating Current (uC on, peripherals and radio disabled) Iidle 3.35 3.38 4.39 mA
Operating Current (uC on, cellular connected but idle) Icell_cloud_idle 19.2 21.2 97.1 mA
Operating Current (uC on, cellular connected and transmitting) Icell_cloud_tx 19.5 63.6 280 mA

Technically the nRF52 can operate in a mode where it microsleeps in sub-milliseconds increments, for example between transactions to poll your sensors, but there's no way to access that from Device OS.

1 Like

4 mA is not too bad, especially because by "continuously" I mean "at least once every five seconds". How would I modify the tracker source code to keep the I2C and usart peripheral on?

Even in normal operating state with cellular off you'll be under 5 mA. It will probably mostly be making sure both cellular and CAN are turned off.

In other words, the all peripherals off measurement is just a contrived state for testing purposes; Tracker Edge is not ever in that state normally.

So would the right approach be to disable sleep in the web console for my project, then manually handle turning the cell modem on and off on my end?

Correct

Is there an app note or example of how to do that properly, ideally while allowing the Tracker software to continue to provide motion, GNSS, state of charge, etc?

I've figured out how to put the Tracker into a low power (300-400 uA) state that can wake from time or IMU events, but now I am trying to prevent the Tracker from reconnecting to the cell network when it wakes. Any advice?

Hi, do you see this line in setup()?

Particle.connect();

if so, you can control the connection by controlling when your fw executes it.

You should also have this line outside setup() and loop() (usually at the top, under the #include statements):

SYSTEM_MODE(SEMI_AUTOMATIC);

Does that help?