This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADS 1292R 模拟前端电路测试

Other Parts Discussed in Thread: ADS1292R

我根据ADS1292R Data sheet 自己组了一个前端电路,请问要如何测试电路的正确性?

  • 请楼主上传一下前端电路的电路图,谢谢!

  • 基本上是根据ADS1292R 的Datasheet所组成,尚未连结至Microcontroller。请问如何测试前端的讯号正确性?  谢谢

  • 楼主的前端电路设计和datasheet中完全一样,datasheet中电路是经过验证的成熟电路,所以基本不会出现问题。

  • 对前端电路的测试,由于心电信号非常微弱,如果实验设备不够精密,建议采用心电信号模拟器作为信号源,和MCU进行联调,直接读ADC的输出会更加方便些。

  • 是的,但是我是用自己买来的元件所组成,不晓得组成后的正确性如何?能否有进一步验证信号的方法?
  • 另外,建议您在电路中增加右腿驱动电路,这样可以更好的抑制共模干扰,具体请参考datasheet55页右腿驱动电路的设置。希望可以帮到您!

  • 如果您只是验证电路的正确性的话,可以采取输入大信号测输出信号的波形的方式,但是这和微弱信号测试会有不同,微弱信号要考虑到各种干扰和噪声。所以我认为如果只是验证电路正确性的话,测试的意义不大,还是建议与MCU进行联调。

  • 好的! 非常感谢,我再试试连结MCU的方式,
    另外有两点:
    1. 我有看到Datasheet中有提到chip第1、2、7、8 Pin有PGA( programmable gain amplifiers) out,也对其量测,但是量到的信号都是噪音,不晓得从这几个点来量测信号是否正确?

    2. 右腿驱动电路如果不使用的话(希望减少输入端),有没有其他方法可以抑制干扰?

  • PGA是需要MCU来配置相应的寄存器调整增益的,如果无MCU的话初始增益为1,所以输出仍旧是非常微弱。一般建议PGA增益设置为6.

  • 对于右腿驱动,请楼主仔细阅读以下datasheet第55页,右腿驱动输出端有专门的pin脚不需要占用输入端。右腿驱动电路是心电信号处理中最为简便有效的抑制共模干扰的方式,其次可以在输入端增加低通滤波器也可以有效的抑制干扰。希望能够帮到您!

  • 好的,研究了一下55页,大概知道如何作法,非常感谢

  • 您好,我现在是可以读写寄存器,但是就是读不出来数据,这是为什么,1到11位的配置如下:{0x02,0Xab,0x10,0x05,0x05,0x00,0x00,0x1f,0x01,0x01,0x03};

  • 能不能帮我看一下怎么回事,我现在想返回测试信号,有信号返回但是错误的。


    #include <msp430x14x.h>
    char MST_Data = 0xAA,SLV_Data = 0xff;
    unsigned char a[12];
    unsigned char b[12];
    #define SPI_ENABLE      P2OUT &=~0x08;
    #define  SPI_DISABLE    P2OUT |=0x08;
    unsigned char regdata[11]={0x02,0Xeb,0x10,0x05,0x05,0x00,0x00,0x00,0x03,0x01,0x03};//二通道心电测试信号,无呼吸0x02,0xeb,0x18,0x00,0x00,0x30,0x0f,0x40,0x02,0x01,0x03fCLK = 512 kHz

    void Delay_ms(unsigned int n)
    {
      unsigned int l,m;
      for(l=0;l<n;l++)
        for(m=0;m<1000;m++);
    }
    void Stop_Read_Data_Continuous (void)
    {
        unsigned int i=0;
        SPI_ENABLE;                            // /CS enable
        for(i=0;i<10;i++);
        while (!(IFG2&UTXIFG1));                 // Wait for TXBUF ready
        TXBUF1 =0x11;                              // Send SDATAC
        SPI_DISABLE;         // /CS disable
        for(i=0;i<10;i++);
    }

    void Start_Read_Data_Continuous (void)
    {
        unsigned int i=0;
        SPI_ENABLE;
         for(i=0;i<10;i++);
        while (!(IFG2&UTXIFG1));                  // Wait for TXBUF ready
        TXBUF1 =0x10;                              // Send RDATAC
        SPI_DISABLE;
        for(i=0;i<10;i++);
    }

    void SPI_RegRead(unsigned char addr, unsigned char *buffer, unsigned char count)  
    {  
      unsigned int i=0,j=0;
      Stop_Read_Data_Continuous ();     //When in RDATAC mode, the RREG command is ignored.Send SDATAC MUST BE SENT
       for(i=0;i<10;i++);
      SPI_ENABLE;                         // /CS enable
      for(j=0;j<10;j++);
      while (!(IFG2&UTXIFG1));                 // Wait for TXBUF ready
      TXBUF1 =addr|0x20;                         // Send address               
      while (!(IFG2&UTXIFG1));                 // Wait for TXBUF ready
      TXBUF1  = 0x00|(count-1);                        //  regedit count 
     
      for (i = 0; i<count;i++)  
      {
      
        while (!(IFG2&UTXIFG1));                  // Wait for TXBUF ready   
        TXBUF1  = 0x00;                            //Initiate next data RX, meanwhile..
        Delay_ms(10);
        while (!(IFG2&URXIFG1));                  // Wait for TXBUF ready 
        buffer[i] =  RXBUF1;                    // Store data from last data RX
        TXBUF0= buffer[i];
        for(j=0;j<10;j++);
       
       
      }

      SPI_DISABLE;         // /CS disable
      for(i=0;i<10;i++);
      Start_Read_Data_Continuous ();
      for(i=0;i<10;i++);
     
    }  
    void SPI_Regwrite(unsigned char addr,unsigned char *data,unsigned char count)  
    {
      unsigned int i=0,j=0;
      Stop_Read_Data_Continuous ();
      SPI_ENABLE;                            // /CS enable
      while (!(IFG2&UTXIFG1));                 // Wait for TXBUF ready
      TXBUF1 =addr+0x40;   //发送地址信息;  首地址是0x01;(zhao)
      while (!(IFG2&UTXIFG1));                 // Wait for TXBUF ready
      TXBUF1 =count-1;  //发送header;              //发送的寄存器数量为10个(zhao)
      for (i = 0; i<count;i++)  
      {
        while (!(IFG2&UTXIFG1));                 // Wait for TXBUF ready
        TXBUF1 =data[i];  
        for(j=0;j<30;j++);
      }
     
      SPI_DISABLE;         // /CS disable
      Start_Read_Data_Continuous ();
     
    }

    void intSPI1()
    {
      int i;
      P5SEL |= 0x0E;                            // P5.1,2,3 SPI option select
      P5OUT &= ~0x01;
      P5DIR |= 0x01;   
     
      BCSCTL1 &= ~XT2OFF;                       // XT2on

      do
      {
      IFG1 &= ~OFIFG;                           // Clear OSCFault flag
      for (i = 0xFF; i > 0; i--);               // Time for flag to set
      }
      while ((IFG1 & OFIFG));                   // OSCFault flag still set?

      BCSCTL2 |= SELM_2 + SELS;                 // MCLK = SMCLK = XT2 (safe)
     
      U1CTL = CHAR + SYNC + MM + SWRST;         // 8-bit, SPI, Master
      U1TCTL = CKPL + SSEL1 + STC;              // Polarity, SMCLK, 3-wire
      U1BR0 = 0x00;                             // SPICLK = SMCLK/2
      U1BR1 = 0x03;
      U1MCTL = 0x00;
      ME2 |= USPIE1;                            // Module enable
      U1CTL &= ~SWRST;                          // SPI enable
     
      IE2 |= URXIE1 ;                   // RX and TX interrupt enable
    }

    void intUART0()
    {
      P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
      ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
      UCTL0 |= CHAR;                            // 8-bit character
      UTCTL0 |= SSEL0;                          // UCLK = ACLK
      UBR00 = 0x03;                             // 32k/9600 - 3.41
      UBR10 = 0x00;                             //
      UMCTL0 = 0x4A;                            // Modulation
      UCTL0 &= ~SWRST;                          // Initialize USART state machine
      IE1 |= URXIE0;                            // Enable USART0 RX interrupt
    }

    void main( void )
    {
     
      WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
      P1OUT = 0x00;
      P1IE  |=0xff;                  //P1模块中断允许
      P1IES |= 0xff;                 //下降沿触发
      P1IFG = 0x00;                  //中断标志位清零
      P2DIR |= 0x00f;                   //0,1,2,3输出
      P2OUT |=0x01;                     //START,RST高电平
     // P2OUT |=0x02;                     //START,RST高电平
      P5SEL = 0x020;                  //设置P3端口为SPI模式
     
      intSPI1();
      intUART0();
      Delay_ms(5);
     
     
     
     
      //SPI_RegRead(0x00,a,12); //读取初始寄存器,检验电路连接是否正确
      Delay_ms(5); 
      SPI_Regwrite(0x01,regdata,11);   //写入配置寄存器,
      Delay_ms(5);
      SPI_RegRead(0x00,b,12); // 再次读出寄存器   检验是否写入正确
     // Delay_ms(5);
      SPI_ENABLE;
      Delay_ms(5);
      P2OUT |=0x02;                     //START,RST高电平
       Delay_ms(5);
      _EINT();
      while(1)
      {
      };
        //LPM0;                         //关CPU,进入低功耗模式
     
    }

    #pragma vector=UART0RX_VECTOR
    __interrupt void usart0_rx (void)
    {
       while (!(IFG1 & UTXIFG0));                // USART0 TX buffer ready?
                            // RXBUF0 to TXBUF0
      _BIC_SR_IRQ(LPM3_bits);                   // Clear LPM3 bits from 0(SR)
    }

    #pragma vector = PORT1_VECTOR      //P1中断服务子程序
    __interrupt void P1_Interrupt(void)
    {
      unsigned char i=0;
      if(P1IFG==0x01)
      {
        P1IFG=0;                    //清除标志位
         for(i=0;i<9;i++)
              {
                 while (!(IFG2&UTXIFG1));                  // Wait for TXBUF ready   
                 TXBUF1  = 0x00;                            //Initiate next data RX, meanwhile..
                 Delay_ms(5);
                 while (!(IFG2&URXIFG1));                  // Wait for TXBUF ready 
                 TXBUF0 = RXBUF1;
                 Delay_ms(5);
              
              }
       
      }
      else
        P1IFG=0;                    //清除标志位
    }

  • 你最终是怎么解决的?