首頁(yè) > 評(píng)測(cè) > 【AT-START-F437測(cè)評(píng)】+I2C采集max30102血氧數(shù)據(jù)

【AT-START-F437測(cè)評(píng)】+I2C采集max30102血氧數(shù)據(jù)

  
  • 作者:
  • 來(lái)源:
  • [導(dǎo)讀]
  • 本帖最后由 skylove1233 于 2023-2-2 14:22 編輯 #申請(qǐng)?jiān)瓌?chuàng)# @21小跑堂 前言 收到開(kāi)發(fā)板有一段時(shí)間了,前段時(shí)間由于年底工作忙+陽(yáng)了等原因,一直沒(méi)來(lái)的及評(píng)測(cè)。正好前段時(shí)間血氧儀漲價(jià),就參照網(wǎng)上的血氧儀制

本帖最后由 skylove1233 于 2023-2-2 14:22 編輯

#申請(qǐng)?jiān)瓌?chuàng)# @21小跑堂 前言
收到開(kāi)發(fā)板有一段時(shí)間了,前段時(shí)間由于年底工作忙+陽(yáng)了等原因,一直沒(méi)來(lái)的及評(píng)測(cè)。正好前段時(shí)間血氧儀漲價(jià),就參照網(wǎng)上的血氧儀制作教程,寫了個(gè)血氧和心率采集的系統(tǒng)。
血氧心率采集系統(tǒng)組成
系統(tǒng)框圖和接線方式如下所示:


此系統(tǒng)中,AT32F437通過(guò)I2C接口與MAX30102連接,MAX30102配置后,開(kāi)始采集數(shù)據(jù),出發(fā)MAX30102的中斷,AT32F437判斷中斷引腳IM的GPIO值,為0時(shí),則對(duì)數(shù)據(jù)以SPO2的算法進(jìn)行計(jì)算,計(jì)算出血氧濃度和心率后,將結(jié)果通過(guò)USART1傳到串口調(diào)試助手。

MAX30102
MAX30102是一個(gè)集成的脈搏血氧儀和心率監(jiān)測(cè)儀生物傳感器的模塊。它集成了一個(gè)紅光LED和一個(gè)紅外光LED、光電檢測(cè)器、光器件,以及帶環(huán)境光抑制的低噪聲電子電路。MAX30102采用一個(gè)1.8V電源和一個(gè)獨(dú)立的5.0V用于內(nèi)部LED的電源。從某寶買大概7塊錢左右,長(zhǎng)這樣:

MAX30102本身自帶18位高精度ADC,使用I2C接口與外接MCU通信。而且自身還有FIFO,可以減輕MCU負(fù)擔(dān),降低功耗。
MAX30102的發(fā)光部分包括兩個(gè)LED,一個(gè)是紅光LED(660nm),另一個(gè)是紅外光LED(880nm),這個(gè)是測(cè)量血氧飽和度SPO2最常見(jiàn)的配置。接收部分是一個(gè)對(duì)可見(jiàn)光和紅外光都敏感的光電二極管,其接收的光強(qiáng)度信號(hào)轉(zhuǎn)換為電流信號(hào),經(jīng)過(guò)環(huán)境光消除電路后,最后被自帶的18位ADC進(jìn)行采樣轉(zhuǎn)化,至此模擬部分完成。AD轉(zhuǎn)化后的數(shù)字經(jīng)過(guò)數(shù)字濾波后儲(chǔ)存在數(shù)據(jù)寄存器中,最后可通過(guò)I2C總線被外接MCU讀取。
在使用MAX30102時(shí),我們主要做的事情有:
(1)MAX30102 I2C驅(qū)動(dòng)編寫
其中,驅(qū)動(dòng)編寫時(shí)參考MAX30102的標(biāo)準(zhǔn),通過(guò)i2c總線對(duì)MAX30102進(jìn)行一些寄存器的配置。因此,需要知道MAX30102的讀地址和寫地址。通過(guò)閱讀MAX30102的官方文檔,可查到,讀地址為0XAE,寫地址為0xAF。如下所示:

寫MAX30102寄存器時(shí),我們使用了AT官方固件庫(kù)中的i2c_memory_write函數(shù),讀寄存器時(shí),使用i2c_memory_read。使用固件庫(kù)的好處就在于,官方幫我們屏蔽了I2C協(xié)議的實(shí)現(xiàn)細(xì)節(jié),我們只要知道I2C怎么使用即可。而且,雅特力官方的文檔真的是我用過(guò)的開(kāi)發(fā)板中,最詳細(xì)的了,沒(méi)有之一,所以開(kāi)發(fā)起來(lái)很快樂(lè)。
(2)MAX30102 血氧算法編寫
驅(qū)動(dòng)編寫完,實(shí)現(xiàn)了對(duì)MAX30102的初始化,就要從MAX30102讀FIFO數(shù)據(jù)了,這時(shí)就要編寫算法了。

MAX30102傳感器上具有紅光(660nm)和紅外光(880nm)兩個(gè)LED,人體氧合血氧蛋白和非氧合血氧蛋白對(duì)這兩個(gè)不同波長(zhǎng)的光吸收率的差異較為明顯?梢該(jù)此得出血氧飽和度。

官方提供的方法如下:

 


參照此算法,進(jìn)行一些濾波即可得出最終結(jié)果。

具體代碼
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)  //當(dāng)采集到數(shù)據(jù)
  51.         {        
  52.                 at32_led_toggle(LED4);   //LED4翻轉(zhuǎn)
  53.                 max30102_cal();  //計(jì)算血氧濃度
  54.                 uint8_t spo2 = max30102_getSpO2();
  55.                 uint8_t heartReat = max30102_getHeartRate();
  56.                 printf("spos2= : [%d] heartReat = [%d] \n",spo2,heartReat);//上傳數(shù)據(jù)到串口
  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.  
復(fù)制代碼

max30102驅(qū)動(dòng)代碼如下:

  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.     /*新數(shù)據(jù)中斷*/
  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.  
復(fù)制代碼



硬件實(shí)際連接如下:



最終上位機(jī)數(shù)據(jù)如下:


結(jié)語(yǔ)
從最終結(jié)果來(lái)看,還存在數(shù)據(jù)不太準(zhǔn)的情況,可能算法還需要再優(yōu)化下,我再研究研究,優(yōu)化下代碼。

完整工程文件見(jiàn)附件
%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原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評(píng)論

  • 聯(lián)系人:巧克力娃娃
  • 郵箱:board@21ic.com
  • 我要投稿
  • 歡迎入駐,開(kāi)放投稿

熱門標(biāo)簽
項(xiàng)目外包 more+