首页 > 评测 > 【AT-START-F437测评】+I2C采集max30102血氧数据

【AT-START-F437测评】+I2C采集max30102血氧数据

  
  • 作者:
  • 来源:
  • [导读]
  • 本帖最后由 skylove1233 于 2023-2-2 14:22 编辑 #申请原创# @21小跑堂 前言 收到开发板有一段时间了,前段时间由于年底工作忙+阳了等原因,一直没来的及评测。正好前段时间血氧仪涨价,就参照网上的血氧仪制

本帖最后由 skylove1233 于 2023-2-2 14:22 编辑

#申请原创# @21小跑堂 前言
收到开发板有一段时间了,前段时间由于年底工作忙+阳了等原因,一直没来的及评测。正好前段时间血氧仪涨价,就参照网上的血氧仪制作教程,写了个血氧和心率采集的系统。
血氧心率采集系统组成
系统框图和接线方式如下所示:


此系统中,AT32F437通过I2C接口与MAX30102连接,MAX30102配置后,开始采集数据,出发MAX30102的中断,AT32F437判断中断引脚IM的GPIO值,为0时,则对数据以SPO2的算法进行计算,计算出血氧浓度和心率后,将结果通过USART1传到串口调试助手。

MAX30102
MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源。从某宝买大概7块钱左右,长这样:

MAX30102本身自带18位高精度ADC,使用I2C接口与外接MCU通信。而且自身还有FIFO,可以减轻MCU负担,降低功耗。
MAX30102的发光部分包括两个LED,一个是红光LED(660nm),另一个是红外光LED(880nm),这个是测量血氧饱和度SPO2最常见的配置。接收部分是一个对可见光和红外光都敏感的光电二极管,其接收的光强度信号转换为电流信号,经过环境光消除电路后,最后被自带的18位ADC进行采样转化,至此模拟部分完成。AD转化后的数字经过数字滤波后储存在数据寄存器中,最后可通过I2C总线被外接MCU读取。
在使用MAX30102时,我们主要做的事情有:
(1)MAX30102 I2C驱动编写
其中,驱动编写时参考MAX30102的标准,通过i2c总线对MAX30102进行一些寄存器的配置。因此,需要知道MAX30102的读地址和写地址。通过阅读MAX30102的官方文档,可查到,读地址为0XAE,写地址为0xAF。如下所示:

写MAX30102寄存器时,我们使用了AT官方固件库中的i2c_memory_write函数,读寄存器时,使用i2c_memory_read。使用固件库的好处就在于,官方帮我们屏蔽了I2C协议的实现细节,我们只要知道I2C怎么使用即可。而且,雅特力官方的文档真的是我用过的开发板中,最详细的了,没有之一,所以开发起来很快乐。
(2)MAX30102 血氧算法编写
驱动编写完,实现了对MAX30102的初始化,就要从MAX30102读FIFO数据了,这时就要编写算法了。

MAX30102传感器上具有红光(660nm)和红外光(880nm)两个LED,人体氧合血氧蛋白和非氧合血氧蛋白对这两个不同波长的光吸收率的差异较为明显。可以据此得出血氧饱和度。

官方提供的方法如下:

 


参照此算法,进行一些滤波即可得出最终结果。

具体代码
main.c

  1. //各引脚初始化
  2. void gpio_config(void)
  3. {
  4.         gpio_init_type gpio_init_struct;
  5.   /* enable the gpioa clock */
  6.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  7.  
  8.   /* set default parameter */
  9.   gpio_default_para_init(&gpio_init_struct);
  10.         
  11.   /* configure button pin as input with pull-up/pull-down */
  12.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  13.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  14.   gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  15.   gpio_init_struct.gpio_pins = GPIO_PINS_9;  //MAX30102中断引脚
  16.   gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  17.   gpio_init(GPIOB, &gpio_init_struct);
  18.         
  19. }
  20.  
  21. /**
  22.   * [url=home.php?mod=space&uid=247401]@brief[/url]  main function.
  23.   * @param  none
  24.   * @retval none
  25.   */
  26. int main(void)
  27. {
  28.   //i2c_status_type i2c_status;
  29.  
  30.   /* initial system clock */
  31.   system_clock_config();
  32.  
  33.   /* config nvic priority group */
  34.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  35.  
  36.   /* at board initial */
  37.   at32_board_init();//初始化LED
  38.  
  39.   hi2c2.i2cx = I2Cx_PORT;
  40.  
  41.   /* i2c config */
  42.   i2c_config(&hi2c2); //初始化I2C
  43.   gpio_config(); //初始胡GPIO
  44.   uart_print_init(115200);//初始化串口
  45.  
  46.         
  47.   max30102_init();
  48.   while(1)
  49.   {
  50.          if (gpio_input_data_bit_read(GPIOB, GPIO_PINS_9) == 0)  //当采集到数据
  51.         {        
  52.                 at32_led_toggle(LED4);   //LED4翻转
  53.                 max30102_cal();  //计算血氧浓度
  54.                 uint8_t spo2 = max30102_getSpO2();
  55.                 uint8_t heartReat = max30102_getHeartRate();
  56.                 printf("spos2= : [%d] heartReat = [%d] \n",spo2,heartReat);//上传数据到串口
  57.                
  58.          }
  59.          
  60.         
  61. }
  62. }
  63.  
  64. /**
  65.   * [url=home.php?mod=space&uid=247401]@brief[/url]  initializes peripherals used by the i2c.
  66.   * @param  none
  67.   * @retval none
  68.   */
  69. void i2c_lowlevel_init(i2c_handle_type* hi2c)
  70. {
  71.   gpio_init_type gpio_init_structure;
  72.  
  73.   if(hi2c->i2cx == I2Cx_PORT)
  74.   {
  75.     /* i2c periph clock enable */
  76.     crm_periph_clock_enable(I2Cx_CLK, TRUE);
  77.     crm_periph_clock_enable(I2Cx_SCL_GPIO_CLK, TRUE);
  78.     crm_periph_clock_enable(I2Cx_SDA_GPIO_CLK, TRUE);
  79.  
  80.     /* gpio configuration */
  81.     gpio_pin_mux_config(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_GPIO_PinsSource, I2Cx_SCL_GPIO_MUX);
  82.  
  83.     gpio_pin_mux_config(I2Cx_SDA_GPIO_PORT, I2Cx_SDA_GPIO_PinsSource, I2Cx_SDA_GPIO_MUX);
  84.  
  85.     /* configure i2c pins: scl */
  86.     gpio_init_structure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  87.     gpio_init_structure.gpio_mode           = GPIO_MODE_MUX;
  88.     gpio_init_structure.gpio_out_type       = GPIO_OUTPUT_OPEN_DRAIN;
  89.     gpio_init_structure.gpio_pull           = GPIO_PULL_UP;
  90.  
  91.     gpio_init_structure.gpio_pins           = I2Cx_SCL_GPIO_PIN;
  92.     gpio_init(I2Cx_SCL_GPIO_PORT, &gpio_init_structure);
  93.  
  94.     /* configure i2c pins: sda */
  95.     gpio_init_structure.gpio_pins           = I2Cx_SDA_GPIO_PIN;
  96.     gpio_init(I2Cx_SDA_GPIO_PORT, &gpio_init_structure);
  97.  
  98.     /* configure and enable i2c interrupt */
  99.     nvic_irq_enable(I2Cx_EVT_IRQn, 0, 0);
  100.     nvic_irq_enable(I2Cx_ERR_IRQn, 0, 0);
  101.  
  102.     /* config i2c */
  103.     i2c_init(hi2c->i2cx, 0x0F, I2Cx_CLKCTRL);
  104.  
  105.     i2c_own_address1_set(hi2c->i2cx, I2C_ADDRESS_MODE_7BIT, I2Cx_ADDRESS);
  106.   }
  107. }
  108.  
  109.  
复制代码

max30102驱动代码如下:

  1. void max30102_init()
  2. {
  3.     uint8_t data = 0;
  4.     /*reset*/
  5.     data = 0x40;
  6.     i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_MODE_CONFIGURATION, &data, 1, 0xffffff);
  7.     do
  8.     {
  9.                 i2c_memory_read(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_READ, RES_MODE_CONFIGURATION, &data, 1, 0xffffff);
  10.     } while (data & 0x40);
  11.     /*新数据中断*/
  12.     data = 0x40;
  13.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_INTERRUPT_ENABLE_1, &data, 1, 0xffffff);
  14.  
  15.     /*16384量程 50Hz 18位adc分辨率*/
  16.     data = 0x63;
  17.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_SPO2_CONFIGURATION, &data, 1, 0xffffff);
  18.     /*灯的亮度*/
  19.     data = 0x47;
  20.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_LED_PLUSE_AMPLITUDE_1, &data, 1, 0xffffff);
  21.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_LED_PLUSE_AMPLITUDE_2, &data, 1, 0xffffff);
  22.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_PROXIMITY_MODE_LED_PLUSE_AMPLITUDE, &data, 1, 0xffffff);
  23.     /*FIFO clear*/
  24.     data = 0;
  25.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_FIFO_WRITE_POINTER, &data, 1, 0xffffff);
  26.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_OVERFLOW_COUNTER, &data, 1, 0xffffff);
  27.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_FIFO_READ_POINTER, &data, 1, 0xffffff);
  28.  
  29.     /*interrupt status clear*/
  30.     max30102_getStatus();
  31.  
  32.     /*SPO2 Mode*/
  33.     data = 0x03;
  34.         i2c_memory_write(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_WRITE, RES_MODE_CONFIGURATION, &data, 1, 0xffffff);
  35.  
  36. }
  37. uint8_t max30102_getUnreadSampleCount()
  38. {
  39.     uint8_t wr = 0, rd = 0;
  40.         i2c_memory_read(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_READ, RES_FIFO_WRITE_POINTER, &wr, 1, 0xffffff);
  41.         i2c_memory_read(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_READ, RES_FIFO_READ_POINTER, &rd, 1, 0xffffff);
  42.  
  43.     if ((wr - rd) < 0)
  44.         return wr - rd + 32;
  45.     else
  46.         return wr - rd;
  47. }
  48.  
  49. void max30102_getFIFO(SAMPLE *data, uint8_t sampleCount)
  50. {
  51.     uint8_t dataTemp[5 * 6];
  52.     if (sampleCount > 5)
  53.         sampleCount = 5;
  54.         i2c_memory_read(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_READ, RES_FIFO_DATA_REGISTER, dataTemp, 6 * sampleCount, 0xffffff);
  55.  
  56.     uint8_t i;
  57.     for (i = 0; i < sampleCount; i++)
  58.     {
  59.         data[i].red = (((uint32_t)dataTemp[i * 6]) << 16 | ((uint32_t)dataTemp[i * 6 + 1]) << 8 | dataTemp[i * 6 + 2]) & 0x3ffff;
  60.         data[i].iRed = (((uint32_t)dataTemp[i * 6 + 3]) << 16 | ((uint32_t)dataTemp[i * 6 + 4]) << 8 | dataTemp[i * 6 + 5]) & 0x3ffff;
  61.     }
  62. }
  63.  
  64. uint8_t max30102_getStatus()
  65. {
  66.     uint8_t data = 0, dataTemp = 0;
  67.         i2c_memory_read(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_READ, RES_INTERRUPT_STATUS_1, &dataTemp, 1, 0xffffff);
  68.     data = dataTemp;
  69.         i2c_memory_read(&hi2c2, I2C_MEM_ADDR_WIDIH_8, MAX30102_ADDR_READ, RES_INTERRUPT_STATUS_2, &dataTemp, 1, 0xffffff);
  70.     return data | dataTemp;
  71. }
  72.  
复制代码



硬件实际连接如下:



最终上位机数据如下:


结语
从最终结果来看,还存在数据不太准的情况,可能算法还需要再优化下,我再研究研究,优化下代码。

完整工程文件见附件
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22AT32F437%22%20style%3D%22strokeWidth%3D2%3Bdashed%3D0%3Balign%3Dcenter%3BfontSize%3D12%3Bshape%3Drect%3BverticalLabelPosition%3Dbottom%3BverticalAlign%3Dtop%3BfillColor%3D%23c0f5a9%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22610%22%20y%3D%22610%22%20width%3D%22230%22%20height%3D%22330%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%223%22%20value%3D%22max30102%22%20style%3D%22strokeWidth%3D2%3Bdashed%3D0%3Balign%3Dcenter%3BfontSize%3D12%3Bshape%3Drect%3BverticalLabelPosition%3Dbottom%3BverticalAlign%3Dtop%3BfillColor%3D%23c0f5a9%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221110%22%20y%3D%22610%22%20width%3D%22230%22%20height%3D%22330%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%224%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20source%3D%222%22%20target%3D%223%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22870%22%20y%3D%22780%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%22930%22%20y%3D%22740%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%225%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22840.0000000000005%22%20y%3D%22711.3199999999999%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%221107.2399999999998%22%20y%3D%22708.6799999999998%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%226%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22842.7600000000002%22%20y%3D%22776.3200000000002%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%221110%22%20y%3D%22773.6799999999996%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%227%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22842.7600000000002%22%20y%3D%22832.6400000000001%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%221110%22%20y%3D%22830%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%228%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22842.7600000000002%22%20y%3D%22892.6400000000001%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%221110%22%20y%3D%22890%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%229%22%20value%3D%22PB11%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22630%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2210%22%20value%3D%22PB10%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22690%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2211%22%20value%3D%22PB9%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22750%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2212%22%20value%3D%22VCC%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22810%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2213%22%20value%3D%22GND%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22870%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2214%22%20value%3D%22VCC%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221070%22%20y%3D%22810%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2215%22%20value%3D%22GND%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221070%22%20y%3D%22870%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2216%22%20value%3D%22SCL%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221060%22%20y%3D%22690%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2217%22%20value%3D%22SDA%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221060%22%20y%3D%22630%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2218%22%20value%3D%22INT%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221065%22%20y%3D%22750%22%20width%3D%2230%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2219%22%20value%3D%22spo2%E7%AE%97%E6%B3%95%E5%A4%84%E7%90%86%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22665%22%20y%3D%22740%22%20width%3D%22120%22%20height%3D%2260%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2220%22%20value%3D%22PC%22%20style%3D%22strokeWidth%3D2%3Bdashed%3D0%3Balign%3Dcenter%3BfontSize%3D12%3Bshape%3Drect%3BverticalLabelPosition%3Dbottom%3BverticalAlign%3Dtop%3BfillColor%3D%23c0f5a9%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22110%22%20y%3D%22640%22%20width%3D%22230%22%20height%3D%2280%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2221%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22340.00000000000045%22%20y%3D%22682.6399999999999%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%22607.2400000000002%22%20y%3D%22680%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2222%22%20value%3D%22PA9%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22560%22%20y%3D%22650%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2223%22%20value%3D%22RX%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22345%22%20y%3D%22650%22%20width%3D%2230%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22AT32F437%22%20style%3D%22strokeWidth%3D2%3Bdashed%3D0%3Balign%3Dcenter%3BfontSize%3D12%3Bshape%3Drect%3BverticalLabelPosition%3Dbottom%3BverticalAlign%3Dtop%3BfillColor%3D%23c0f5a9%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22610%22%20y%3D%22610%22%20width%3D%22230%22%20height%3D%22330%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%223%22%20value%3D%22max30102%22%20style%3D%22strokeWidth%3D2%3Bdashed%3D0%3Balign%3Dcenter%3BfontSize%3D12%3Bshape%3Drect%3BverticalLabelPosition%3Dbottom%3BverticalAlign%3Dtop%3BfillColor%3D%23c0f5a9%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221110%22%20y%3D%22610%22%20width%3D%22230%22%20height%3D%22330%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%224%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20source%3D%222%22%20target%3D%223%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22870%22%20y%3D%22780%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%22930%22%20y%3D%22740%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%225%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22840.0000000000005%22%20y%3D%22711.3199999999999%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%221107.2399999999998%22%20y%3D%22708.6799999999998%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%226%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22842.7600000000002%22%20y%3D%22776.3200000000002%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%221110%22%20y%3D%22773.6799999999996%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%227%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22842.7600000000002%22%20y%3D%22832.6400000000001%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%221110%22%20y%3D%22830%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%228%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22842.7600000000002%22%20y%3D%22892.6400000000001%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%221110%22%20y%3D%22890%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%229%22%20value%3D%22PB11%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22630%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2210%22%20value%3D%22PB10%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22690%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2211%22%20value%3D%22PB9%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22750%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2212%22%20value%3D%22VCC%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22810%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2213%22%20value%3D%22GND%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22840%22%20y%3D%22870%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2214%22%20value%3D%22VCC%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221070%22%20y%3D%22810%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2215%22%20value%3D%22GND%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221070%22%20y%3D%22870%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2216%22%20value%3D%22SCL%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221060%22%20y%3D%22690%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2217%22%20value%3D%22SDA%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221060%22%20y%3D%22630%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2218%22%20value%3D%22INT%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221065%22%20y%3D%22750%22%20width%3D%2230%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2219%22%20value%3D%22spo2%E7%AE%97%E6%B3%95%E5%A4%84%E7%90%86%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22665%22%20y%3D%22740%22%20width%3D%22120%22%20height%3D%2260%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2220%22%20value%3D%22PC%22%20style%3D%22strokeWidth%3D2%3Bdashed%3D0%3Balign%3Dcenter%3BfontSize%3D12%3Bshape%3Drect%3BverticalLabelPosition%3Dbottom%3BverticalAlign%3Dtop%3BfillColor%3D%23c0f5a9%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22110%22%20y%3D%22640%22%20width%3D%22230%22%20height%3D%2280%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2221%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BexitX%3D1.016%3BexitY%3D0.134%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3BentryX%3D0.004%3BentryY%3D0.126%3BentryDx%3D0%3BentryDy%3D0%3BentryPerimeter%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22340.00000000000045%22%20y%3D%22682.6399999999999%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%22607.2400000000002%22%20y%3D%22680%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2222%22%20value%3D%22PA9%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22560%22%20y%3D%22650%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2223%22%20value%3D%22RX%22%20style%3D%22text%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3Bautosize%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22345%22%20y%3D%22650%22%20width%3D%2230%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E

  • 本文系21ic原创,未经许可禁止转载!

网友评论