Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed OB1203_example_driver
Diff: main.cpp
- Revision:
- 13:5ce84c68066e
- Parent:
- 12:5de5f550e765
- Child:
- 14:ae0be10b73cd
diff -r 5de5f550e765 -r 5ce84c68066e main.cpp
--- a/main.cpp Thu Jun 21 14:58:46 2018 +0000
+++ b/main.cpp Tue Jun 26 11:40:27 2018 +0000
@@ -5,14 +5,19 @@
#define intb_pin D3
-
I2C i2c(I2C_SDA,I2C_SCL);
+//I2C i2c(PA_4,PA_7);
//SoftI2C i2c(I2C_SDA,I2C_SCL);
InterruptIn intb(intb_pin);
DigitalOut sda_pullup(D10,1);
DigitalOut scl_pullup(D11,1);
DigitalOut intb_pullup(D12,1);
+//InterruptIn intb(D10);
+//DigitalOut sda_pullup(D13,1);
+//DigitalOut scl_pullup(PA_0,1);
+//DigitalOut intb_pullup(PA_4,1);
+
OB1203 ob1203(&i2c);
Serial pc(USBTX, USBRX,256000);
Timer t;
@@ -24,6 +29,9 @@
bool spo2 = 1; //0 for HR, 1 for SpO2
bool afull = 1; //use Afull interrupt--otherwise PPG new data interrupt
bool meas_temp = 1;
+bool printAvg = 0; //default 0 print raw data
+bool redAGC = 1;
+bool IRAGC = 1;
//****************************
//internal settings
@@ -32,7 +40,7 @@
void defaultConfig()
{
- ob1203.osc_trim = 0x3F; //max trim code
+ ob1203.osc_trim = 0x00; //max trim code =0x3F
meas_temp ? ob1203.temp_en = TEMP_ON : ob1203.temp_en = TEMP_OFF;
@@ -102,11 +110,11 @@
ob1203.ppg_int_en = PPG_INT_ON;
}
//PPG
- ob1203.ir_current = 600; //max 1023. 3FF
+ ob1203.ir_current = 0x1AF; //max 1023. 3FF
if (spo2)
{
// ob1203.r_current = 0x0FF;
- ob1203.r_current = 511; //max 511. 1FF
+ ob1203.r_current = 0x1AF; //max 511. 1FF
}
else
{
@@ -133,8 +141,8 @@
// ob1203.ppg_freq = PPG_FREQ_50HZ;
ob1203.fifo_rollover_en = FIFO_ROLL_ON;
- ob1203.fifo_afull_samples_left = AFULL_SAMPLES_LEFT(8);
-
+ ob1203.fifo_afull_advance_warning = AFULL_ADVANCE_WARNING(0x0F); //warn as quickly as possible (after 17 samples with 0x0F)
+
if(mode)
{
if(spo2)
@@ -205,6 +213,17 @@
uint32_t PSprev = 0;
uint32_t PS_avg_buffer[ps_running_avg];
+ uint32_t targetIRcounts = 196608; //0.75 of full scale
+ uint32_t targetRcounts = 196608; //0.75 of full scale
+// uint32_t tol1 = 8192; //1 5 bit increment
+ uint32_t tol1 = 4096; //1 5 bit increment
+ uint32_t tol2 = 39321; //for 90% and 60% large limits
+ uint32_t step = 8;
+ uint32_t IR_in_range = 0;
+ uint32_t R_in_range = 0;
+ bool update = 0;
+ uint32_t in_range_persist = 2;
+
for (int n=0;n<ps_running_avg;n++)
{
PS_avg_buffer[n] =0;
@@ -297,9 +316,8 @@
first = 0;
// IRbaseline = running_baseline*ppgData[0];
// Rbaseline = running_baseline*ppgData[1];
- }
-
-// IRbaseline = running_baseline*ppgData[0];
+ }//end if first
+
for (int n=0;n<samples2Read/2;n++)
{
( avg_ptr+1 == running_avg ) ? avg_ptr = 0 : avg_ptr++;
@@ -324,16 +342,20 @@
R_baseline_buffer[baseline_ptr] = ppgData[2*n+1];
Rbaseline += (R_baseline_buffer[baseline_ptr] - Rbaseline_prev);
-
- //PRINT RAW DATA
- pc.printf("%d, %d, %d\r\n",t.read_us(),ppgData[2*n],ppgData[2*n+1]); //print with us counter time stamp (use only with slower data rates or averaging as this slows down the data printing);
-// pc.printf("%d, %d\r\n",ppgData[2*n],ppgData[2*n+1]); //print without us timer (faster)
+ if(printAvg)
+ {
//PRINT AVG DATA
-// pc.printf("%d,%d,%d\r\n",t.read_us(),IRavg/running_avg,Ravg/running_avg);
+ pc.printf("%d,%d,%d\r\n",t.read_us(),IRavg/running_avg,Ravg/running_avg);
// pc.printf("%d,%d\r\n",IRavg/running_avg-IRbaseline/running_baseline, Ravg/running_avg-Rbaseline/running_baseline);
-
// pc.printf("%d,%d,%d,%d\r\n",Ravg/running_avg,Rbaseline/running_baseline,Rbaseline_prev,Ravg/running_avg-Rbaseline/running_baseline);
- }
+ }
+ else
+ {
+ //PRINT RAW DATA
+ pc.printf("%d, %d, %d\r\n",t.read_us(),ppgData[2*n],ppgData[2*n+1]); //print with us counter time stamp (use only with slower data rates or averaging as this slows down the data printing);
+// pc.printf("%d, %d\r\n",ppgData[2*n],ppgData[2*n+1]); //print without us timer (faster)
+ }
+ }//end SpO2 case
else
{
( avg_ptr+1 == running_avg ) ? avg_ptr = 0 : avg_ptr++;
@@ -349,16 +371,96 @@
IRbaseline += (IR_baseline_buffer[baseline_ptr] - IRbaseline_prev); //update the average by removing the old sample and adding the new
- //PRINT RAW DATA
- pc.printf("%d\r\n%d\r\n",ppgData[2*n],ppgData[2*n+1]);
-// pc.printf("%d, %d, %d\r\n",t.read_us(),ppgData[2*n],ppgData[2*n+1]); //print with us counter time stamp (use only with slower data rates or averaging as this slows down the data printing);
+ if(printAvg)
+ {
//PRINT AVG DATA
-// pc.printf("%d\r\n%d\r\n",prevAvg/running_avg-prevBaseline/running_baseline,IRavg/running_avg-IRbaseline/running_baseline);
-
+ pc.printf("%d\r\n%d\r\n",prevAvg/running_avg-prevBaseline/running_baseline,IRavg/running_avg-IRbaseline/running_baseline);
+ }
+ else
+ {
+ //PRINT RAW DATA
+ pc.printf("%d\r\n%d\r\n",ppgData[2*n],ppgData[2*n+1]);
+// pc.printf("%d, %d, %d\r\n",t.read_us(),ppgData[2*n],ppgData[2*n+1]); //print with us counter time stamp (use only with slower data rates or averaging as this slows down the data printing);
+
+ }
+ }//HR case
+ if(n+1==samples2Read/2)
+ {
+ if(IRAGC)
+ {
+ if( ppgData[2*n] > targetIRcounts + (IR_in_range>in_range_persist ? tol2: tol1) )
+ {
+ if(ppgData[2*n]>targetIRcounts + tol2)
+ IR_in_range=0;
+ if(ob1203.ir_current>step)
+ {
+// pc.printf("IR %d, IRc %d--",ppgData[2*n],ob1203.ir_current);
+ ob1203.ir_current -= step;
+ update = 1;
+
+ }
+ }
+ else if( ppgData[2*n] < targetIRcounts - (IR_in_range>in_range_persist ? tol2 : tol1) )
+ {
+ if(ppgData[2*n]<targetIRcounts - tol2)
+ IR_in_range=0;
+ if(ob1203.ir_current+step<0x2AF) //no need to go to full current
+ {
+ ob1203.ir_current += step;
+ update = 1;
+// pc.printf("IR %d, IRc %d++", ppgData[2*n],ob1203.ir_current);
+ }
+ }
+ else
+ {
+ IR_in_range++;
+ }
+ }//end IR AGC case
+
+ if(spo2 && redAGC)
+ {
+ if( ppgData[2*n+1] > targetRcounts + (R_in_range>in_range_persist ? tol2 : tol1) )
+ {
+ if(ppgData[2*n+1]>targetRcounts + tol2)
+ R_in_range=0;
+ if(ob1203.r_current>step)
+ {
+// pc.printf(", R %d, Rc %d--\r\n", ppgData[2*n+1],ob1203.r_current);
+ ob1203.r_current -= step;
+ update = 1;
+ }
+ }
+ else if( ppgData[2*n+1] < targetRcounts - (R_in_range>in_range_persist ? tol2 : tol1) )
+ {
+ if(ppgData[2*n+1]<targetRcounts - tol2)
+ R_in_range=0;
+ if(ob1203.r_current+step<0x1FF)
+ {
+
+// pc.printf(", R %d, Rc %d++\r\n", ppgData[2*n+1],ob1203.r_current);
+ ob1203.r_current += step;
+ update = 1;
+ }
+ }
+ else
+ {
+ R_in_range++;
+ }
+ if(update)
+ {
+ ob1203.setPPGcurrent();
+ ob1203.resetFIFO();
+ update=0;
+ }
+ }//end R AGC case
}
- }
- intFlagged = 0;
- }
+ }//end sample loop
+
+
+
+ intFlagged = 0;
+
+ }//end if time to read samples
} //end if !intb
}// end mode
else