Use a Biosensing Module to Develop Health and Fitness Wearables

By Stephen Evanczuk

Contributed By Digi-Key's North American Editors

Fueled in part by greater health awareness from COVID-19, interest in biosensing wearables continues to drive demand for more effective solutions to meet user demand for greater functionality and higher accuracy in smaller form factors with extended battery life at lower cost. For designers, this presents a set of on-going challenges as they work to meet tight time-to-market windows and budgets. Working in their favor are advances in biosensing devices, including higher functional integration and more comprehensive design solutions.

This article discusses trends in biosensors and wearables and the challenges designers face. It then introduces a heart rate and peripheral oxygen saturation (SpO2) biosensor module from Maxim Integrated and shows how developers can use it to more effectively implement wearables able to deliver accurate heart rate and other measurements without compromising the tight power budgets of battery-powered mobile products.

Design requirements for biosensing

While heart rate monitoring is a core requirement in a wide variety of consumer wearables, interest in SpO2 measurement continues to increase. Once used largely by athletes looking to optimize their fitness regimens, SpO2 measurement has found more widespread application, particularly in self-monitoring for signs of reduced respiratory function associated with COVID-19 disease. For developers, delivering suitable solutions to a health-conscious population accustomed to wearable electronics presents significant challenges with respect to cost, power, form factor, and weight.

Many biosensors now come with integrated analog front-end subsystems so developers don’t have to build the signal chains and post-processing subsystems required for health and fitness measurements, but few of these advanced devices have the right mix of capabilities for wearable devices. As a result, they don’t solve the design challenges that arise in meeting user expectations for tiny biosensing wearables that are just as unobtrusive as other types of leading wearables including smartwatches, fitness bands, and true wireless earbuds, among others.

Further challenges associated with design integration can arise when developers need to add one or more biosensing capabilities to those popular wearable types. As with every other type of mobile, battery-powered personal electronic product, consumers implicitly demand extended battery life from even the smallest product, typically selecting these products on the basis of battery life as much as on cost and functionality.

To meet these combined requirements, developers can turn to the Maxim Integrated MAXM86146 biosensing module for designing custom devices and the MAXM86146-based MAXM86146EVSYS evaluation system for rapid prototyping.

Biosensing module offers drop-in solution

Available in a 4.5 x 4.1 x 0.88 millimeter (mm) 38-pin package, the Maxim Integrated MAXM86146 biosensing module is a drop-in solution designed specifically to help speed development of compact battery-powered wearables for health and fitness. To meet requirements for both extended battery life and biosensing capabilities, the module minimizes power consumption while maintaining rapid and accurate measurement of heart rate and SpO2.

Along with two integrated photodiodes, the module includes a Maxim Integrated MAX86141 dual-channel optical analog front-end (AFE) and an Arm Cortex-M4-based microcontroller that is a biosensing-optimized variant of the Maxim Integrated MAX32660 Darwin microcontroller (Figure 1).

Diagram of Maxim Integrated MAX86146 biosensing module (click to enlarge)Figure 1: The Maxim Integrated MAX86146 biosensing module integrates an optical AFE, microcontroller, and photodiodes in a compact package. (Image source: Maxim Integrated)

Consuming only 10 microamps (μA) at 25 samples per second (sps), the integrated MAX86141 provides a comprehensive optical AFE subsystem designed to control the multiple light emitting diodes (LEDs) used for measuring heart rate and SpO2. Optical heart rate monitors routinely use photoplethysmography (PPG), which monitors changes in peripheral blood volume associated with each pulse of the heart. For this measurement, these devices typically use green light at a wavelength of 540 nanometers (nm), which is absorbed by blood and results in fewer artifacts because green light penetrates less deeply into tissue than many other wavelengths. Optical pulse oximeters use both a red LED (typically 660 nm) and an infrared (IR) LED (typically 940 nm) to measure the difference in absorption between hemoglobin and deoxyhemoglobin—the technique underlying optical SpO2 measurement methods (see Design a Low-Cost Pulse Oximeter Using Off-the-Shelf Components).

To perform these optical measurements, the developer must ensure that photodiode signal acquisition is synchronized precisely with light output pulses from the appropriate LEDs. The MAXM86146 module's integrated MAX86141 AFE provides separate signal chains for LED control and for photodiode signal acquisition. On the output side, the AFE includes three high-current, low-noise LED drivers for transmitting pulses to green LEDs for heart rate measurement, as well as red and IR LEDs for SpO2 measurement. On the input side, the AFE provides two photodiode signal acquisition channels, each with a dedicated 19-bit analog-to-digital converter (ADC). These two readout channels can operate separately or be used in combination to provide a larger radiant area.

Controlling the AFE LED and photodiode signal chains, firmware running on the onboard microcontroller adjusts the AFE settings to maximize the signal to noise ratio (SNR) and minimize power consumption. As ambient light changes, ambient light correction (ALC) circuitry built into the integrated MAX86141 responds to gradual changes in lighting conditions. Ambient light can, however, change rapidly in some situations such as when the user passes quickly between areas of shadow and bright sunlight, resulting in ALC failures. To account for this common situation, the MAX86141 includes a picket fence detect-and-replace function. Here, the device identifies large excursions in ambient measurements from previous samples and replaces individual outlying ambient light data samples with extrapolated values consistent with a relatively slow change in ambient levels.

Because the module's microcontroller uses its firmware to manage AFE operation, the detailed operations required to perform accurate HR and SpO2 measurements are transparent to developers. Using firmware settings, the module performs these measurements automatically, storing the raw data and computed results in a first-in first-out (FIFO) buffer for access by the system host processor through the module's I2C serial interface.

How the MAX86146 simplifies wearable hardware design

With its extensive integrated functionality, the MAX86146 biosensing module requires relatively few additional components to complete a design capable of providing accurate heart rate and SpO2 measurements. For simultaneous HR and SpO2 measurements, the MAX86146 can be integrated with an external low-noise analog multiplexer such as the Maxim Integrated MAX14689 switch connected to discrete green, red and IR LEDs (Figure 2).

Diagram of Maxim Integrated MAX86146 biosensing module (click to enlarge)Figure 2: To perform simultaneous heart rate and SpO2 measurements, the Maxim Integrated MAX86146 biosensing module requires few additional components beyond suitable LEDs, an analog multiplexer (MAX14689, on left), and an accelerometer to detect motion while measurements are being taken. (Image source: Maxim Integrated)

In addition, the MAXM86146 is designed to use motion data from a three-axis accelerometer to correct for the user's motion during heart rate measurements, and to detect motion during SpO2 measurements which require the user to remain at rest for the short duration of the measurement. Here, the developer can either connect a firmware-supported accelerometer directly to the MAXM86146's SPI ports or connect a general purpose accelerometer to the host processor.

The host connection option provides greater flexibility in device selection, requiring only a general purpose three-axis accelerometer such as Memsic's MC3630, capable of 25 sps. Still, developers need to ensure that accelerometer data is synchronized to heart rate data sampling. For this, the on-board microcontroller internally decimates or interpolates accelerometer samples as needed to compensate for drift between HR data and accelerometer data.

Gaining a quick start with MAXM86146 evaluation and rapid prototyping

Although the MAXM86146 simplifies system hardware design, developers looking to evaluate the MAXM86146 or rapidly prototype their applications can skip hardware design and immediately begin working with the device by using the MAXM86146EVSYS evaluation system. Powered by USB or a 3.7 volt lithium polymer (LiPo) battery, the MAXM86146EVSYS comprises a MAXM86146-based MAXM86146_OSB optical sensor board (OSB) connected by flex cable to a Bluetooth low energy (BLE) enabled MAXSensorBLE main data acquisition board (Figure 3).

Image of Maxim Integrated MAXM86146EVSYS evaluation systemFigure 3: The Maxim Integrated MAXM86146EVSYS evaluation system includes a BLE-enabled main processor board and flex cable connected MAXM86146-based sensor board. (Image source: Maxim Integrated)

The MAXSensorBLE board integrates a Maxim Integrated MAX32620 host microcontroller and Nordic Semiconductor's NRF52832 Bluetooth microcontroller. In fact, the MAXSensorBLE board serves as a complete reference design for a BLE-enabled wearable design. Along with supporting active and passive components, the MAXSensorBLE board design comes complete with a Maxim Integrated MAX20303 power management integrated circuit (PMIC) designed specifically to extend battery life of wearables.

The MAXM86146_OSB optical sensor board combines a MAXM86146 biosensing module with a MAX14689 analog switch and complete set of LEDs required to perform simultaneous HR and SpO2 measurements. In addition, the board integrates a firmware-supported three-axis accelerometer connected directly to the MAXM86146 module.

To evaluate the MAXM86146 module using the MAXM86146EVSYS evaluation system, developers power up the system using USB-C or a LiPo battery, and plug a BLE USB dongle if needed into a personal computer running the Maxim Integrated MAXM86146 EV System Software application. This Windows application provides a graphical user interface (GUI) that enables developers to easily modify MAXM86146 settings and immediately observe the results presented as data plots. Along with providing access to MAXM86146 registers, the GUI provides intuitive menus for setting different operating modes and configurations. For example, developers can use the GUI mode tab to set different LED sequences (Figure 4, top), and use the GUI configuration tab to apply those LED sequences for HR and SpO2 measurements (Figure 4, bottom).

Image of Maxim Integrated's MAXM86146 EV System Software GUIFigure 4: Maxim Integrated's MAXM86146 EV System Software GUI lets developers evaluate MAXM86146 performance by defining different operating modes such as LED sequences (top), and then use those sequences (bottom) for heart rate and SpO2 measurement. (Image source: Maxim Integrated).

For custom software development, Maxim Integrated provides its Wearable HRM & SpO2 Algorithm for MAXM86146 software package. Because the MAXM86146 delivers heart rate and SpO2 measurements using its integrated microcontroller firmware, the process of extracting data from the device is straightforward. The Maxim Integrated software package demonstrates the procedure for initializing the device, and finally reading data from the MAXM86146 FIFO and parsing out the individual data items (Listing 1).

typedef struct{
   uint32_t green_led_cnt;
   uint32_t ir_led_cnt;
   uint32_t red_led_cnt;
   uint32_t hr;
   uint32_t hr_conf;
   uint32_t spo2;
   uint32_t spo2_conf;
   uint32_t scd_state;
} mes_repor_t;
typedef struct {
   uint32_t led1;
   uint32_t led2;
   uint32_t led3;
   uint32_t led4;
   uint32_t led5;
   uint32_t led6;
} max8614x_mode1_data;
typedef struct {
   int16_t x;
   int16_t y;
   int16_t z;
} accel_mode1_data;
typedef struct __attribute__((packed)){
   uint8_t current_operating_mode; // mode 1 & 2
   // WHRM data
   uint16_t hr;                  // mode 1 & 2
   uint8_t hr_conf;              // mode 1 & 2
   uint16_t rr;                  // mode 1 & 2
   uint8_t rr_conf;              // mode 1 & 2
   uint8_t activity_class;       // mode 1 & 2
   // WSPO2 data
   uint16_t r;                   // mode 1 & 2
   uint8_t spo2_conf;            // mode 1 & 2
   uint16_t spo2;                // mode 1 & 2
   uint8_t percentComplete;      // mode 1 & 2
   uint8_t lowSignalQualityFlag; // mode 1 & 2
   uint8_t motionFlag;           // mode 1 & 2
  uint8_t lowPiFlag;            // mode 1 & 2
   uint8_t unreliableRFlag;      // mode 1 & 2
   uint8_t spo2State;            // mode 1 & 2
   uint8_t scd_contact_state;
} whrm_wspo2_suite_mode1_data;
void execute_data_poll( mes_repor_t* mesOutput ) {
[deleted lines of code]
  status = read_fifo_data(num_samples, WHRMWSPO2_FRAME_SIZE, &databuf[0], sizeof(databuf));
  if(status == SS_SUCCESS &&  num_samples > 0 && num_samples < MAX_WHRMWSPO2_SAMPLE_COUNT){  
  max8614x_mode1_data             ppgDataSample;
    accel_mode1_data                accelDataSamp;
    whrm_wspo2_suite_mode1_data     algoDataSamp;
    int sampleIdx = 0;
    int ptr =0;
    while( sampleIdx < num_samples ) {
      ppgDataSample.led1                 = (databuf[ptr+1] << 16) + (databuf[ptr+2] << 8) + (databuf[ptr+3] << 0);
      ppgDataSample.led2                 = (databuf[ptr+4] << 16) + (databuf[ptr+5] << 8) + (databuf[ptr+6] << 0);
      ppgDataSample.led3                 = (databuf[ptr+7] << 16) + (databuf[ptr+8] << 8) + (databuf[ptr+9] << 0);
      ppgDataSample.led4                 = (databuf[ptr+10] << 16)+ (databuf[ptr+11] << 8)+ (databuf[ptr+12] << 0);
      ppgDataSample.led5                 = (databuf[ptr+13] << 16)+ (databuf[ptr+14] << 8)+ (databuf[ptr+15] << 0);
      ppgDataSample.led6                 = (databuf[ptr+16] << 16)+ (databuf[ptr+17] << 8)+ (databuf[ptr+18] << 0);
      accelDataSamp.x                    = (databuf[ptr+19] << 8) + (databuf[ptr+20] << 0);
      accelDataSamp.y                    = (databuf[ptr+21] << 8) + (databuf[ptr+22] << 0);
      accelDataSamp.z                    = (databuf[ptr+23] << 8) + (databuf[ptr+24] << 0);
      algoDataSamp.current_operating_mode= (databuf[ptr+25]);                    = (databuf[ptr+26] << 8) + (databuf[ptr+27] << 0);
      algoDataSamp.hr_conf               = (databuf[ptr+28]);
      algoDataSamp.rr                    = (databuf[ptr+29] << 8) + (databuf[ptr+30] << 0);
      algoDataSamp.rr_conf               = (databuf[ptr+31]);
      algoDataSamp.activity_class        = (databuf[ptr+32]);
      algoDataSamp.r                     = (databuf[ptr+33] << 8) + (databuf[ptr+34] << 0);
      algoDataSamp.spo2_conf             = (databuf[ptr+35]);
      algoDataSamp.spo2                  = (databuf[ptr+36] << 8) + (databuf[ptr+37] << 0);
      algoDataSamp.percentComplete       = (databuf[ptr+38]);
      algoDataSamp.lowSignalQualityFlag  = (databuf[ptr+39]);
      algoDataSamp.motionFlag            = (databuf[ptr+40]);
      algoDataSamp.lowPiFlag             = (databuf[ptr+41]);
      algoDataSamp.unreliableRFlag       = (databuf[ptr+42]);
      algoDataSamp.spo2State             = (databuf[ptr+43]);
      algoDataSamp.scd_contact_state     = (databuf[ptr+44]);
      mesOutput->green_led_cnt           = ppgDataSample.led1;
      mesOutput->ir_led_cnt              = ppgDataSample.led2;
      mesOutput->red_led_cnt             = ppgDataSample.led3;
      mesOutput->hr                      = / 10;
      mesOutput->hr_conf                 = algoDataSamp.hr_conf;
      mesOutput->spo2                    = algoDataSamp.spo2 / 10;
      mesOutput->spo2_conf               = algoDataSamp.spo2_conf;
      mesOutput->scd_state               = algoDataSamp.scd_contact_state;
   /* printf(" greenCnt= %d , irCnt= %d , redCnt = %d ,"
                     " hr= %d , hr_conf= %d , spo2= %d , spo2_conf= %d , skin_contact = %d \r\n"
                     , mesOutput->green_led_cnt , mesOutput->ir_led_cnt , mesOutput->red_led_cnt
                     , mesOutput->hr , mesOutput->hr_conf , mesOutput->spo2 , mesOutput->spo2_conf , mesOutput->scd_state);
[deleted lines of code]

Listing 1: A snippet from Maxim Integrated's software package demonstrates the basic technique for extracting measurements and other data from the biosensing module. (Code source: Maxim Integrated)

Listing 1 illustrates the use of the C-language routine execute_data_poll() to return a number of heart rate and SpO2 readings from the MAXM86146. Here, the code reads the device's FIFO into local buffer databuf and then maps the contents of databuf into instances of a few different C-language software structures. Along with storing configuration data and other metadata into those structure instances, the routine finally provides heart rate and SpO2 measurements in mesOutput, an instance of the mes_repor_t structure. Developers can simply uncomment the final printf statement to display the result on the console.

For implementing a health and fitness wearable, the MAXM86146 software and hardware significantly simplify development. For devices intended to achieve approval of the US Food and Drug Administration (FDA), however, developers must perform appropriate testing to verify FDA-level performance of their final products. Although Maxim Integrated's MAXM86146 and its embedded algorithms deliver FDA-grade measurement performance, developers will need to ensure that their entire system—not just the sensor—meet FDA performance requirements.


Interest in wearables able to deliver accurate heart rate and SpO2 measurements continues to increase, fueled most recently by the role of SpO2 data in monitoring symptoms of the COVID-19 disease. Although specialized biosensors can provide these measurements, few existing solutions are able to meet demand for smaller devices able to extend battery life in multi-function, compact wearables. As shown, a tiny biosensing module from Maxim Integrated, supported by a rapid prototyping kit, offers an effective alternative, delivering FDA-grade measurements with minimal power consumption.

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of Digi-Key Electronics or official policies of Digi-Key Electronics.

About this author

Stephen Evanczuk

Stephen Evanczuk has more than 20 years of experience writing for and about the electronics industry on a wide range of topics including hardware, software, systems, and applications including the IoT. He received his Ph.D. in neuroscience on neuronal networks and worked in the aerospace industry on massively distributed secure systems and algorithm acceleration methods. Currently, when he's not writing articles on technology and engineering, he's working on applications of deep learning to recognition and recommendation systems.

About this publisher

Digi-Key's North American Editors