Batteryless Sensors with ADP5901

Table of contents

RoadTest: Enroll to Review the ADI Energy Harvesting EVB ADP5091-2-EVALZ

Author: dimiterk

Creation date:

Evaluation Type: Evaluation Boards

Did you receive all parts the manufacturer stated would be included in the package?: True

What other parts do you consider comparable to this product?: AEM10941, EM8500 and BQ series from TI as well as a number of harvesting IC

What were the biggest problems encountered?: 1. ADP5091-2-EVALZ board disables the dynamic and hybrid switching modes 2. No documentation on PV panel 3. Relatively little documentation compared to other ICs.

Detailed Review:


In this roadtest we will take a look at the ADP5901 Energy harvester board from ADI. Many thanks to      and Element 14 for providing the opportunity to review this board. The premise behind energy harvesting IC such as ADP5901 is the implementation of always on batery-less sensors. In this review we will implement a sensor node powered from the ADP5901 and measure it's performance as well as review the evaluation board.

The ADP5091 evaluation PCB is composed of two PCB’s. The first contains the photovoltaic panel and a 10 pin right angle female connector. The positive and negative terminals of the solar panel can be probed on the top side of the PCB (pads J2, J3).  The second PCB contains the low power SMPS harvesting IC.  .In addition there is a printout of the ADP5091-2-EVALZ User Guide denoted as UG-927.


And that's all there is included with the board. In the back you can see a CR2032 holder for a backup CR2032 battery.  The kit does not ship with any Backup batteries.

Note that the backup battery is not rechargeable from the harvester. Only the super-capacitor

Solar panels

The PV panel is based on solar cell from Alta devices. There is no part number provided so no datasheet is available.

The open circuit voltage of the solar panel under a lamp measures really close to 1.5V.

The maximum output from the solar cell with no load is: 1.5V

Hardware description



On the  evaluation board connector J1 should be jumpered. to enable VSYS connected to the output. Connector J2 is a 10 pin SMD connector.

By jumpering it one can select the output voltages of the LDO and VSYS power rail.

Pins 1 and 2 of J2 are also jumpered if SW is set as output. The VOUT can either be jumpered to the SYS output pin which is the switcher output or to the REGOUT pins.

The REGOUT pin can also deliver power independently of the VOUT pin.

 The PGOOD pin will toggle high when SYS ramps up to 3 V.

The BAT pin is connected through a 4.7 ohm resistor to a supercap.

REG_D0 pins is tied to GND on this evaluation board. This means that hysteresis boost mode cannot be enabled by pulling this pin HIGH. In addition to that the hybrid mode is disabled.

REG_D1 enables the LDO. This pin is connected with a zero-ohm resistor to the PGOOD pin. When PGOOD pin goes HIGH, the LDO is enabled.

R25 needs to be disabled to allow an external MCU to activate the LDO.


Configuring output voltage

VID sets the output voltage.  This is done by setting a jumper to J2 pins 3-4, 5-6, 7-8.

The output voltage is programmable via the external feedback resistor divider
using the equation:  VREG _OUT  = VREF  (1 R7/ R9)  where 
VREF value is 1.0 V

The supported output voltages on this development board are:


VID Resistor












J1 is used to stop Switching Boost Charger



PV board


The efficiency can be calculated as η = Vsys * Isys /  (Vin * Iin ) .

The scope plot (yellow) below shows the Vout pin when the supercap is charged.

The scope plot below shows the LDO output collapses when a high impedance source is connected. The mote is always in sleep mode but when it wakes up sends the sensor data it can draw 56mA.

The scope plot below shows how the mote loads the LDO output .

When powering the mote from a 3.3V SMPS power supply sourced from a Li-ion battery every time there is a LORA packet transimiison the power supply rail droops.

Building a bateryless mote

Wireless sensor nodes are called motes.  The simplest architecture of a mote is a PMIC coupled with an MCU and a radio. Due to the integration of RF frontend on modern chips it can be as simple as a two chip solution.

For this roadttest a custom mote was used. The mote couples a LORA radio with an ESP32 MCU.  The ESP32 stays in low power most of the time. It contains an IMU that has two interrupt pins. The IMU driver is configured to fire an interrupt if motion is detected. In addition to that as most MEMS, the IMU contains an internal temperature sensor.

The idea was to have this sensor coupled with an ESP32 will be used in order to send data to a gateway. The simplest scenario is to implement a Deep Sleep with Timer Wake Up. The ESP32 offers a deep sleep mode for power saving applications.

In this mode CPUs, most of the RAM, and all the digital peripherals which are clocked from APB_CLK are powered off.

The only parts of the chip which can still be powered on are: RTC controller, RTC peripherals ,and RTC memories

This code displays the most basic deep sleep with a timer to wake it up and how to store data in RTC memory to use it over reboots

While the ESP32 is not a state of the art MCU when it comes to power consumption it's main advantage is the BLE functionality that can be used in such scenarios.


The tests above showed that the  ADP5901 cannot supply enough power to the mote under indoor light conditions. Testing with an LED shows that's it's not possible to power the LED for more than 1-2 seconds without a backup battery.

Powering an LED

The mote firmware is configure to wake from sleep every 30 seconds. This can be modified and for the tests all the printf() were disabled. However the mote sill cannot be powered from the LDO output.


#define INT_GPIO    27
#define ACCEL_GPIO  26
#define MAGNE_GPIO  25

RTC_DATA_ATTR int bootCount = 0;

LSM303AGR accel;

int counter = 0;
const int Update_Node = 30;

void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;

  wakeup_reason = esp_sleep_get_wakeup_cause();

    case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
    case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
    default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;

void setup(void)
  Serial.begin(115200);     //initialize Serial Monitor
  Serial.println("Low Power mote with IMU sensor. \r\n");

  int timer = millis();
  Serial.println("\n   Start:" + String(timer));
  pinMode(PWDN, OUTPUT);
  digitalWrite(PWDN, LOW);    // Enable radio
  //setup LoRa transceiver module
  SPI2.begin(SCK, MISO, MOSI, SS);   //SPI LoRa pins
  LoRa.setPins(SS, RST, DIO0);

  if (!LoRa.begin(915E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
   Wire.begin (23, 18, 100000);   // sda= GPIO_21 /scl= GPIO_22
   pinMode(SPI_CSpin, OUTPUT);
   digitalWrite(SPI_CSpin, HIGH);
   pinMode(SPI_CSpin2, OUTPUT);
   digitalWrite(SPI_CSpin2, HIGH);

   pinMode(23, INPUT_PULLUP);
   pinMode(18, INPUT_PULLUP);

   Serial.println("Accelerometer Test"); Serial.println("");

   if (accel.checkWhoAmI()) {
        Serial.println("FOUND ACCEL!");
    else {
        Serial.println("NO ACCEL!");

    accel.enableAccelerometer(LSM303AGR::LowPowerMode, LSM303AGR::HrNormalLowPower10Hz,  LSM303AGR::XYZ, LSM303AGR::Scale4g, true);

    accel.enableMagnetometer(LSM303AGR::MagHighResMode, LSM303AGR::Hz100, LSM303AGR::Continuous);
    accel.enableInterrupt1(3,100,3, LSM303AGR::OrCombination);
    accel.enableInterrupt2(3,100, 3, LSM303AGR::OrCombination);
    accel.enableMagnetometerInterrupt(LSM303AGR::XYZ, 200, true);
    Serial.println("Boot number: " + String(bootCount));

    digitalWrite(PWDN, HIGH);    
    Serial.println("Going to sleep now");
    Serial.println("Finished:" + String(millis() - timer));
    esp_sleep_enable_timer_wakeup(Update_Node * 1000000LL);


void loop(void)


void SendIMUPacket(void)
  Serial.print(" ");
  Serial.print(" ");
  Serial.print(" ");
  Serial.print(" ");
  Serial.print("Sending packet: ");

  // send packet
  LoRa.print("X: ");
  LoRa.print("Y: ");
  LoRa.print("Z: ");

  LoRa.print("Mx: ");
  LoRa.print("My: ");
  LoRa.print("Mz: ");


In this road test the ADP5901 evaluation board was tested with a wireless mote in order to implement an always on bateryless IOT node. The harvester IC on this EVB has been hardwired to disable some of the features so a full evaluation was not possible. In addition due to lack of tools such as a source/measure unit (SMU) a full evaluation of the IC efficieny needs to be done and correlated with indoor and outdoor lux levels

Implementing a low power mote and coupling that with the harvester shows that it may be possible to implement bateryless sensors as long as the power budget constrains fall under the capacity of the super-cap implemented on this board. For indoor low light conditions this does not seem to meet the threshold currently.


The good

1. Contains LDO and main switcher as well as configuration pins to enable/disable modes.

The bad
1. Documenatation for PV panel is not available.
2. This evaluation board disables the hybrid mode by hardwiring one the configuration pins to GND.

3. Uses more parts compared to other harvester IC.

4. More expensive compared to other harvester IC.