发 帖  

Max30003驱动

2018 心电检测
2019-11-18 15:33:20   评论 分享淘帖 邀请回答 举报
2个回答
2019-11-18 17:41:48 1 评论

举报

1 条评论
  • 2019-11-18 23:09

    Github上 下载的arduino程序:

    void setup()
    {
        Serial.begin(115200); //Serial begin
       
        pinMode(MAX30003_CS_PIN,OUTPUT);
        digitalWrite(MAX30003_CS_PIN,HIGH); //disable device

        SPI.begin();
        SPI.setBitOrder(MSBFIRST);
        SPI.setDataMode(SPI_MODE0);
      
      //please enable the below lines if you are using older version of Protocentral_max30003 board without 32k f-clock generator
        /*SPI.setClockDivider(SPI_CLOCK_DIV4);
        pinMode(CLK_PIN,OUTPUT);
         
         //Start CLK timer
        Timer1.initialize(16);              // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
        Timer1.attachInterrupt( timerIsr ); // attach the service routine here
    */
        MAX30003_begin();   // initialize MAX30003
    }

    void loop()
    {
        MAX30003_Reg_Read(ECG_FIFO);

        unsigned long data0 = (unsigned long) (SPI_temp_32b[0]);
        data0 = data0 <<24;
        unsigned long data1 = (unsigned long) (SPI_temp_32b[1]);
        data1 = data1 <<16;
        unsigned long data2 = (unsigned long) (SPI_temp_32b[2]);
        data2 = data2 >>6;
        data2 = data2 & 0x03;
       
        data = (unsigned long) (data0 | data1 | data2);
        ecgdata = (signed long) (data);

        MAX30003_Reg_Read(RTOR);
        unsigned long RTOR_msb = (unsigned long) (SPI_temp_32b[0]);
       // RTOR_msb = RTOR_msb <<8;
        unsigned char RTOR_lsb = (unsigned char) (SPI_temp_32b[1]);

        unsigned long rtor = (RTOR_msb<<8 | RTOR_lsb);
        rtor = ((rtor >>2) & 0x3fff) ;
      
        float hr =  60 /((float)rtor*0.008);
        unsigned int HR = (unsigned int)hr;  // type cast to int

        unsigned int RR = (unsigned int)rtor*8 ;  //8ms

         /*Serial.print(RTOR_msb);
         Serial.print(",");
         Serial.print(RTOR_lsb);
         Serial.print(",");
         Serial.print(rtor);
         Serial.print(",");
         Serial.print(rr);
         Serial.print(",");
         Serial.println(hr);      */

          DataPacketHeader[0] = 0x0A;
          DataPacketHeader[1] = 0xFA;
          DataPacketHeader[2] = 0x0C;
          DataPacketHeader[3] = 0;
          DataPacketHeader[4] = 0x02;
       
          DataPacketHeader[5] = ecgdata;
          DataPacketHeader[6] = ecgdata>>8;
          DataPacketHeader[7] = ecgdata>>16;
          DataPacketHeader[8] = ecgdata>>24;
       
          DataPacketHeader[9] =  RR ;
          DataPacketHeader[10] = RR >>8;
          DataPacketHeader[11] = 0x00;
          DataPacketHeader[12] = 0x00;

          DataPacketHeader[13] = HR ;
          DataPacketHeader[14] = HR >>8;
          DataPacketHeader[15] = 0x00;
          DataPacketHeader[16] = 0x00;
            
          DataPacketHeader[17] = 0x00;
          DataPacketHeader[18] = 0x0b;
      
          for(i=0; i<19; i++) // transmit the data
          {
            Serial.write(DataPacketHeader);
      
           }   

        delay(8);      
    }

    void MAX30003_Reg_Write (unsigned char WRITE_ADDRESS, unsigned long data)
    {

        // now combine the register address and the command into one byte:
         byte dataToSend = (WRITE_ADDRESS<<1) | WREG;
      
         // take the chip select low to select the device:
         digitalWrite(MAX30003_CS_PIN, LOW);
         
         delay(2);
         SPI.transfer(dataToSend);   //Send register location
         SPI.transfer(data>>16);     //number of register to wr
         SPI.transfer(data>>8);      //number of register to wr
         SPI.transfer(data);      //Send value to record into register
         delay(2);
         
         // take the chip select high to de-select:
         digitalWrite(MAX30003_CS_PIN, HIGH);
    }

    void max30003_sw_reset(void)
    {
        MAX30003_Reg_Write(SW_RST,0x000000);     
        delay(100);
    }

    void max30003_synch(void)
    {
        MAX30003_Reg_Write(SYNCH,0x000000);
    }

    void MAX30003_Reg_Read(uint8_t Reg_address)
    {
        uint8_t SPI_TX_Buff;
       
        digitalWrite(MAX30003_CS_PIN, LOW);
       
        SPI_TX_Buff = (Reg_address<<1 ) | RREG;
        SPI.transfer(SPI_TX_Buff); //Send register location
         
        for ( i = 0; i < 3; i++)
        {
           SPI_temp_32b = SPI.transfer(0xff);
        }
      
        digitalWrite(MAX30003_CS_PIN, HIGH);
    }

    void MAX30003_Read_Data(int num_samples)
    {
        uint8_t SPI_TX_Buff;
      
        digitalWrite(MAX30003_CS_PIN, LOW);   
      
        SPI_TX_Buff = (ECG_FIFO_BURST<<1 ) | RREG;
        SPI.transfer(SPI_TX_Buff); //Send register location
      
        for ( i = 0; i < num_samples*3; ++i)
        {
          SPI_temp_Burst = SPI.transfer(0x00);
        }
       
        digitalWrite(MAX30003_CS_PIN, HIGH);  
    }

    void MAX30003_begin()
    {   
        max30003_sw_reset();
        delay(100);
        MAX30003_Reg_Write(CNFG_GEN, 0x081007);
        delay(100);
        MAX30003_Reg_Write(CNFG_CAL, 0x720000);  // 0x700000  
        delay(100);
        MAX30003_Reg_Write(CNFG_EMUX,0x0B0000);
        delay(100);
        MAX30003_Reg_Write(CNFG_ECG, 0x805000);  // d23 - d22 : 10 for 250sps , 00:500 sps
        delay(100);
      
        MAX30003_Reg_Write(CNFG_RTOR1,0x3fc600);
        max30003_synch();
        delay(100);
    }

2019-11-20 19:47:52 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

您需要登录后才可以回帖 登录/注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
快速回复 返回顶部 返回列表
关注微信公众号

电子发烧友网

电子发烧友论坛

社区合作
刘勇
联系电话:15994832713
邮箱地址:liuyong@huaqiu.com
社区管理
elecfans短短
微信:elecfans_666
邮箱:users@hauqiu.com
关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表