1.项目介绍
该项目是一个超级小型的心率血氧测试仪,计划装一个外壳做成那种指尖夹的形式,这样使用起来就更加的简洁。设计的时候想着能够尽可能的小巧。就把电路精简的十分厉害。供电部分原计划采用干电池进行供电,但是在购买器件的时候忘记买了,就飞出两根线用外部供电。
该项目主控我选用了美信家的MAX32660,心率血氧采集则使用了美信家的MAX30102,电源部分采用ADI家的ADP151AUJZ-3.3芯片。使用立创EDA绘制的这个PCB与原理图,不得不说立创EDA大量的元器件库真是大大缩减了开发时间。采样结果通过ole平面进行显示。
软件部分使用keil编写,总体上更偏向一个demo程序。最终计划加入的自动休眠,自动唤醒功能并没有完成,只是简单实现心率血氧采集的功能。
2.项目用到的板卡、芯片、模块、仪器、设备等介绍
该项目使用到了烙铁、风枪、万用表、jlink、示波器等工具。
前期使用了MAX32660-EVSYS开发板以及oled模块、MAX30102模块进行代码的开发。
MAX32660-EVSYS:MAX32660评估系统提供结构紧凑的开发平台,在微小、易于使用的电路板实现对MAX32660全部特性的访问。主板上已安装基于MAX32625PICO的调试适配器;完成编程后,可将其直接拆卸。调试模块支持可选的10引脚Arm® Cortex®调试连接器,用于实现DAPLink功能。
MAX32660:属于美信DARWIN产品系列,是一款超低功耗、性价比突出、集成度非常高的32位控制器。芯片封装非常小,4mm x 4mm 的TQFN已经是这个系列里最大封装,非常适合电池供电或是无线传感器的应用。MAX32660采用了带浮点运算功能的Cortex-M4内核,最大主频96MHz, 带256KB Flash和96KB SRAM,性能很强劲。
MAX30102:是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了多个LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。使移动设备以极低功耗工作,具有可编程采样率和LED电流,节省功耗低功耗心率监测仪(< 1mW)、超低关断电流、快速数据输出、高采样率等特点。
ADP151:是一款超低噪声、低压差(LDO)线性稳压器,采用2.2 V至5.5 V电源供电,最大输出电流为200 mA。在200 mA负载下压差仅为135 mV,不仅可提高效率,而且能使器件在很宽的输入电压范围内工作。ADP151采用新颖的电路拓扑结构,实现了超低噪声性能,而无需旁路电容,使该器件非常适合对噪声敏感的模拟和RF应用。ADP151在提供超低噪声性能的同时,并不影响其电源电压抑制比(PSRR)或线路与负载瞬态响应性能。200 mA负载时工作电源电流低至265 μA,因此ADP151适合电池供电的便携式设备。
3.关键性代码及说明
MAX30102的初始化代码
IIC_Init();
max30102_reset();
max30102_Bus_Write(REG_INTR_ENABLE_1,0xc0); // INTR setting 开启
max30102_Bus_Write(REG_INTR_ENABLE_2,0x00); //原来是0x00
max30102_Bus_Write(REG_FIFO_WR_PTR,0x00); //FIFO_WR_PTR[4:0]
max30102_Bus_Write(REG_OVF_COUNTER,0x00); //OVF_COUNTER[4:0]
max30102_Bus_Write(REG_FIFO_RD_PTR,0x00); //FIFO_RD_PTR[4:0]
max30102_Bus_Write(REG_FIFO_CONFIG,0x0f); //sample avg = 1, fifo rollover=false, fifo almost full = 17
max30102_Bus_Write(REG_MODE_CONFIG,0x03); //0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
max30102_Bus_Write(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), LED pulseWidth (400uS)
max30102_Bus_Write(REG_LED1_PA,0x24); //Choose value for ~ 7mA for LED1
max30102_Bus_Write(REG_LED2_PA,0x24); // Choose value for ~ 7mA for LED2
max30102_Bus_Write(REG_PILOT_PA,0x7f); // Choose value for ~ 25mA for Pilot LED
OLED的初始化代码
OLED_SCLK_Clr();
OLED_SDIN_Clr();
OLED_RST_Clr();
OLED_DC_Clr();
OLED_CS_Clr();
OLED_RST_Set();
delay_ms(100);
OLED_RST_Clr();
delay_ms(200);
OLED_RST_Set();
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
4.功能演示结果及说明
设备开机为工作状态
测量手指时的状态
测量结果稳定性比较差,稍微有一点干扰就跳动很严重,不知道怎么优化好一些。
5.对本活动的心得体会
很高兴能参加这一次FastBond活动,这一次也是我同事强力安利我来参加的。实现的时候也遇到了很多问题,最终的实现结果也不是特别满意,因为对心率血氧算法的研究不深入,最终得到的测试数据稳定性很差,不知道怎么去解决。希望有懂行的大佬多多指导一下。
建议:感觉群里交流太少了。可能大佬们都是各自做各自的不喜欢交流吧,希望下一次群里的气氛能够热闹一点,