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.

大家好,请教一个问题,ADS1242芯片一直输出65535???

Other Parts Discussed in Thread: ADS1242

我们公司用ADS1242芯片,现在做了一个实验板,ADS1242芯片5V供电,参考电压是2.5V,遇到一个问题,AD输出值一直是65535,不会变,不知道是怎么回事,请大家帮忙指导一下!!!

  •  这个是电路图

     

  • 请详述你的测试条件还有是否可以正常读写ADS1242的寄存器?

  • 你好! Van Yang  

    我试验了,可以正确的读写寄存器,我用的51单片机,AIN0接的可调电阻,最大电压5V,MUX设置为0x08,按我的理解这样是单通道通道0,我调试了一周了,一直没出来,希望能帮帮我,下面是我的程序。

    ADS1242.h

    #ifndef __ADS1242_H__
    #define __ADS1242_H__ 
                 
    #include <reg52.h>               //头文件的包含
    #include <intrins.h>
    #define uchar unsigned char
    #define uint  unsigned int
    #define ulong unsigned long
    #define  _Nop()  _nop_()        //定义空指令

    /*定义ADS1242的寄存器地址   */
    #define ADS1242_SETUP     0x00
    #define ADS1242_MUX       0x01
    #define ADS1242_ACR       0x02
    #define ADS1242_ODAC      0x03
    #define ADS1242_DIO       0x04
    #define ADS1242_DIR       0x05
    #define ADS1242_IOCON     0x06
    #define ADS1242_OCR0      0x07
    #define ADS1242_OCR1      0x08
    #define ADS1242_OCR2      0x09
    #define ADS1242_FSR0      0x0a
    #define ADS1242_FSR1      0x0b
    #define ADS1242_FSR2      0x0c
    #define ADS1242_DOR2      0x0d
    #define ADS1242_DOR1      0x0e
    #define ADS1242_DOR0      0x0f


    /*定义ADS1242的寄存器地址   */
    #define ADS1242_CMD_RDATA    0x01
    #define ADS1242_CMD_RDATAC   0x03
    #define ADS1242_CMD_STOPC    0x0f
    #define ADS1242_CMD_RREG     0x10
    #define ADS1242_CMD_WREG     0x50
    #define ADS1242_CMD_SELFCAL  0xf0
    #define ADS1242_CMD_SELFOCAL 0xf1
    #define ADS1242_CMD_SELFGCAL 0xf2
    #define ADS1242_CMD_SYSOCAL  0xf3
    #define ADS1242_CMD_SYSGCAL  0xf4
    #define ADS1242_CMD_WAKEUP   0xfb
    #define ADS1242_CMD_DSYNC    0xfc
    #define ADS1242_CMD_SLEEP    0xfd
    #define ADS1242_CMD_RESET    0xfe


    /*配置寄存器位*/
    #define BUFFER_ON     (1<<4)          /*ACR寄存器BUFFER启用*/
    #define BUFFER_OFF    (0<<4)          /*ACR寄存器BUFFER不用*/

    #define RANGE_0    (0<<2)                /*配置ACR寄存器的RANGE位为0*/
    #define RANGE_1    (1<<2)    /*配置ACR寄存器的RANGE位为1*/

    #define SPEED_0       (0<<5)    /**/
    #define SPEED_1       (1<<5)

    #define DATARATE_3_75 (0x02)       /*配置ACR寄存器的Data Rate为3.75HZ*/
    #define DATARATE_7_5  (0x01)    /*配置ACR寄存器的Data Rate为7.5HZ*/
    #define DATARATE_15   (0x00)    /*配置ACR寄存器的Data Rate为15HZ*/

    #define PGA_1         (0x00)    /*配置SETUP寄存器的PGA为1   */
    #define PGA_2         (0x01)    /*配置SETUP寄存器的PGA为2   */
    #define PGA_4         (0x02)    /*配置SETUP寄存器的PGA为4   */
    #define PGA_8         (0x03)    /*配置SETUP寄存器的PGA为8   */
    #define PGA_16        (0x04)    /*配置SETUP寄存器的PGA为16  */
    #define PGA_32        (0x05)    /*配置SETUP寄存器的PGA为32  */
    #define PGA_64        (0x06)    /*配置SETUP寄存器的PGA为64  */
    #define PGA_128       (0x07)    /*配置SETUP寄存器的PGA为128 */


    /*定义IO口*/
    sbit IO_PDWN=                P1^0;
    sbit IO_DRDY=                P1^1;
    sbit IO_SCLK=                P1^2;
    sbit IO_DOUT=                P1^3;
    sbit IO_DIN=                 P1^4;
    sbit IO_CS=                  P1^5;

     

    void ADS1242Init();
    /*写一个字节的数据            */
    void WriteByte(uchar Dat);
    /*读一个字节的数据            */
    uchar ReadByte();

    /*写寄存器            */
    void WriteReg(uchar RegAdd,uchar RegDat);


    /*读寄存器            */
    uchar ReadReg(uchar RegAdd);
    /*选择AD通道  */
    void SelectChannel(uchar PosChannel,uchar NegChannel);
    /*等待AD转换完成  */
    void WaitADConComplete();
    /*从DOR寄存器读取转换结果  */
    ulong ReadDataFromDOR(uchar PosChannel,uchar NegChannel);
    /*上电自校正*/
    void SelfCalibrate();
    /*供主程序调用*/
    ulong ADS1242Convert(uchar PosChannel,uchar NegChannel);

    #endif


    ADS1242.C

    #include "ads1242.h"
    #include "delay.h"


    void ADS1242Init()
    {
      IO_PDWN = 1;
      IO_DOUT = 0;
    }
    /*写一个字节的数据            */
    void WriteByte(uchar Dat)
    {
      uchar i;
      IO_CS = 0;
      IO_SCLK = 0;
      _nop_();
      for(i=0;i<8;i++)
       {
        Dat = Dat<<1;
        IO_DIN = CY;
        IO_SCLK = 1;
        _nop_();
        _nop_();
        IO_SCLK = 0;
        _nop_(); 
       }
      IO_CS = 1;
    }
    /*读一个字节的数据            */
    uchar ReadByte()
    {
      uchar i,RDat;
      RDat = 0;
      IO_CS = 0;
      IO_SCLK = 0;
      _nop_();
      for(i=0;i<8;i++)
       {
        
        IO_SCLK = 1;
        _nop_();
        RDat = (RDat<<1)|IO_DOUT;
        IO_SCLK = 0;
        _nop_();
        _nop_();
     //   DelayUs2x(2);
       }
      IO_CS = 1;
      return RDat;
    }
    /*写寄存器            */
    void WriteReg(uchar RegAdd,uchar RegDat)                              /*寄存器地址,写入数据*/
    {
      WriteByte(ADS1242_CMD_WREG + RegAdd);                         /*写寄存器命令+寄存器地址*/
      WriteByte(0x00);
      WriteByte(RegDat);
    }


    /*读寄存器            */
    uchar ReadReg(uchar RegAdd)                                           /*寄存器地址  */
    {
      WriteByte(ADS1242_CMD_RREG + RegAdd);                         /*读寄存器命令+寄存器地址*/
      WriteByte(0x00);
      return (ReadByte());
    }
    /*选择AD通道  */
    void SelectChannel(uchar PosChannel,uchar NegChannel)                 /*正向通道,负向通道*/
    {
      WriteReg(ADS1242_MUX,((PosChannel<<4)+NegChannel));
    }
    /*等待AD转换完成  */
    void WaitADConComplete()
    {
     IO_CS = 0;
     while(!IO_DRDY);                                                   /*DRDY为0表示转换完成*/
     while(IO_DRDY);
     IO_CS = 1;
    }
    /*从DOR寄存器读取转换结果  */
    ulong ReadDataFromDOR(uchar PosChannel,uchar NegChannel)              /*正负通道号*/
    {
      ulong temp;
      uchar i;
      IO_CS = 0;
      SelectChannel(PosChannel,NegChannel);                         /*选择通道*/
      WriteByte(0x01);                                         /*发送读数据命令*/
      IO_CS = 0;
      DelayMs(1);                                              /*发送读数据命令*/
      temp = ReadByte();
        temp = (temp << 8) | ReadByte();
        temp = (temp << 8) | ReadByte();
      IO_CS = 1;
      return temp;
    }
    /*上电自校正*/
    void SelfCalibrate()
    {
      IO_PDWN = 1;
      WriteByte(ADS1242_CMD_RESET);
      WriteReg(ADS1242_SETUP,PGA_1);
      WriteReg(ADS1242_ACR,BUFFER_OFF + RANGE_0 + DATARATE_3_75);   /*配置ACR寄存器*/
            WriteReg(ADS1242_SETUP,PGA_1);
      WriteReg(ADS1242_ODAC,0x00);                                  /*上电自校正*/
      IO_CS = 0;
      while(IO_DRDY);                                               /*等待校正完成*/
      IO_CS = 1;
      WriteReg(ADS1242_ACR,BUFFER_ON + RANGE_0 + DATARATE_3_75);    /*配置ACR寄存器*/
                   
    }
    /*供主程序调用*/
    ulong ADS1242Convert(uchar PosChannel,uchar NegChannel)
    {
      ulong temp;
      ADS1242Init();
      SelfCalibrate();
      temp = ReadDataFromDOR(PosChannel,NegChannel);
      temp = ReadDataFromDOR(PosChannel,NegChannel);                /*取第二个数据*/
      return temp;
    }

     

  • 现在一直输出23个1,调节变阻器,这个值也不会变,我是用数码管显示的

  • 我的电源是输入9V经过7805稳压,然后给单片机和ADS1242供电,参考电压是用LM385接VREF+,另一端接地,所有地都连在了一起,不知道硬件这样搭是不是有问题