Test program for a Max30102 heartrate sensor on a STM32L476RG specific board ENSMM
Dependencies: mbed
These two pictures show how to connect the Mheuve Sensor to the ST-Link debugger (don't forget to disable ST-link jumpers and JP5 on the board! ):
These two pictures show how to connect the Mheuve Sensor TX RX to the ST-Link debugger (don't forget to cross TX and RX, it means Mheuve sensor TX on ST-Link RX and ST-Link TX on Mheuve sensor RX ):
The Mheuve sensor board needs to be powered by an external battery.
The result appears on the terminal, speed config is 115200 bds.
Diff: algorithm/algorithm.h
- Revision:
- 0:346a7fa07998
- Child:
- 3:7c0fb55eb3ff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/algorithm/algorithm.h Wed Apr 20 21:46:06 2016 +0000 @@ -0,0 +1,100 @@ +/** \file algorithm.h ****************************************************** +* +* Project: MAXREFDES117# +* Filename: algorithm.c +* Description: This module is the heart rate/SpO2 calculation algorithm header file +* +* Revision History: +*\n 1-18-2016 Rev 01.00 SK Initial release. +*\n +* +* -------------------------------------------------------------------- +* +* This code follows the following naming conventions: +* +*\n char ch_pmod_value +*\n char (array) s_pmod_s_string[16] +*\n float f_pmod_value +*\n int32_t n_pmod_value +*\n int32_t (array) an_pmod_value[16] +*\n int16_t w_pmod_value +*\n int16_t (array) aw_pmod_value[16] +*\n uint16_t uw_pmod_value +*\n uint16_t (array) auw_pmod_value[16] +*\n uint8_t uch_pmod_value +*\n uint8_t (array) auch_pmod_buffer[16] +*\n uint32_t un_pmod_value +*\n int32_t * pn_pmod_value +* +* ------------------------------------------------------------------------- */ +/******************************************************************************* +* Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +* OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of Maxim Integrated +* Products, Inc. shall not be used except as stated in the Maxim Integrated +* Products, Inc. Branding Policy. +* +* The mere transfer of this software does not imply any licenses +* of trade secrets, proprietary technology, copyrights, patents, +* trademarks, maskwork rights, or any other form of intellectual +* property whatsoever. Maxim Integrated Products, Inc. retains all +* ownership rights. +******************************************************************************* +*/ +#ifndef ALGORITHM_H_ +#define ALGORITHM_H_ + +#include "mbed.h" + +#define true 1 +#define false 0 +#define FS 100 +#define BUFFER_SIZE (FS* 5) +#define HR_FIFO_SIZE 7 +#define MA4_SIZE 4 // DONOT CHANGE +#define HAMMING_SIZE 5// DONOT CHANGE +#define min(x,y) ((x) < (y) ? (x) : (y)) + +const uint16_t uw_hamm[31]={ 41, 276, 512, 276, 41 }; //Hamm= long16(512* hamming(5)'); +//SPO2table is computed as -45.060*ratioAverage* ratioAverage + 30.354 *ratioAverage + 94.845 ; +const uint8_t uch_spo2_table[184]={ 95, 95, 95, 96, 96, 96, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 99, 99, 99, 99, + 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 99, 99, 99, 99, 99, 99, 99, 99, 98, 98, 98, 98, 98, 98, 97, 97, + 97, 97, 96, 96, 96, 96, 95, 95, 95, 94, 94, 94, 93, 93, 93, 92, 92, 92, 91, 91, + 90, 90, 89, 89, 89, 88, 88, 87, 87, 86, 86, 85, 85, 84, 84, 83, 82, 82, 81, 81, + 80, 80, 79, 78, 78, 77, 76, 76, 75, 74, 74, 73, 72, 72, 71, 70, 69, 69, 68, 67, + 66, 66, 65, 64, 63, 62, 62, 61, 60, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 31, 30, 29, + 28, 27, 26, 25, 23, 22, 21, 20, 19, 17, 16, 15, 14, 12, 11, 10, 9, 7, 6, 5, + 3, 2, 1 } ; +static int32_t n_dx[ BUFFER_SIZE-MA4_SIZE]; // delta +static int32_t n_x[ BUFFER_SIZE]; //ir +static int32_t n_y[ BUFFER_SIZE]; //red + + +void maxim_heart_rate_and_oxygen_saturation(uint32_t *un_ir_buffer , int32_t n_ir_buffer_length, uint32_t *un_red_buffer , int32_t *n_spo2, int8_t *ch_spo2_valid , int32_t *n_heart_rate , int8_t *ch_hr_valid); +void maxim_find_peaks( int32_t *n_locs, int32_t *n_npks, int32_t *n_x, int32_t n_size, int32_t n_min_height, int32_t n_min_distance, int32_t n_max_num ); +void maxim_peaks_above_min_height( int32_t *n_locs, int32_t *n_npks, int32_t *n_x, int32_t n_size, int32_t n_min_height ); +void maxim_remove_close_peaks( int32_t *n_locs, int32_t *n_npks, int32_t *n_x, int32_t n_min_distance ); +void maxim_sort_ascend( int32_t *n_x, int32_t n_size ); +void maxim_sort_indices_descend( int32_t *n_x, int32_t *n_indx, int32_t n_size); + +#endif /* ALGORITHM_H_ */ \ No newline at end of file