TI论坛
直播中

王兰

14年用户 1738经验值
擅长:基础元器件
私信 关注
[问答]

ADS1110的使用例程


    ADS1110的使用

ADS1110 是ti推出的16位AD器件,是为了将低功耗与空间作为首要考虑因素的高精度测量系统设计的
ADS1110采用I2C方式与MCU相连,与MCU的连接图如下

ADS1110的读写时序如下


ADS1110的驱动程序如下
# include# define uch unsigned char# define unint unsigned int# define SDA  RD1# define SCL  RD0uch ACK;unint j;void delay()            //延时{for(j=5535;--j;) continue;}void start (void)       //开始{   TRISD0=0;   TRISD1=0;   SDA=1;   asm("nop");   SCL=1;   asm("nop");   asm("nop");   asm("nop");   SDA=0;   asm("nop");   asm("nop");   asm("nop");   SCL=0;   asm("nop");   asm("nop");}void stop(void)             //结束   {     TRISD0=0;    TRISD1=0;    SDA=0;    asm("nop");    SCL=1;    asm("nop");    asm("nop");    asm("nop");    SDA=1;    asm("nop");    asm("nop");    asm("nop");    SCL=0;    asm("nop");    asm("nop");    }      uch  check(void)    //  检查应答信号     {          TRISD1=1;        SCL=0;        SCL=1;           if (SDA )        {            ACK = 1;        }       else        {            ACK = 0;         }       SCL=0;      return(ACK);     }           void sendBYTE(uch data)   //  发送一个字节{     uch bitcount=8;               //发送8位          do          {             TRISD0=0;            TRISD1=0;            //置输出                       if((data&0x80)==0x80)                   {                 SDA=1;         //写 1                 }            else                  {                 SDA=0;        //写 0                }            SCL=0;              //在时钟大于4u秒期间写数据            SCL=1;           asm("nop");           asm("nop");           asm("nop");           asm("nop");           asm("nop");            SCL=0;           data=data<<1;          bitcount--;          } while(bitcount);           TRISD1=1 ;                  //释放总线等待应答           asm("nop");           asm("nop");           asm("nop");           asm("nop");           asm("nop");         }   uch reciveBYTE(void)             //接受一个字节  {    uch temp1=0;    uch bitcount1=8;    TRISD0=0;    TRISD1=1;               //置输入   do   { SCL=0;              //在时钟大于4u秒期间读数据     SCL=1;     asm("nop");     asm("nop");      if(SDA)                //读 1       {         temp1=temp1|0x01;           }    else                     //读 0      {        temp1=temp1&0xfe;      }     SCL=0;     if(bitcount1-1)      {         temp1=temp1<<1;               }       bitcount1--;        }while(bitcount1);       return(temp1);  }       void ack(void)          //  发送连续读信号{     TRISD0=0;    TRISD1=0;    SDA=0;    SCL=0;    SCL=1;   asm("nop");   asm("nop");   asm("nop");   asm("nop");   asm("nop");    SCL=0;}      void nack(void)        //  发送不连续读信号  {     TRISD0=0;    TRISD1=0;    SDA=1;    SCL=0;    SCL=1;    asm("nop");    asm("nop");    asm("nop");    asm("nop");    asm("nop");    SCL=0;  }       void wrtoIIC(uch data)     //写器件地址和配置字  {          start();               //开始写     sendBYTE(0x90);         //写器件地址(写)              do{          ;        }while(check());       //等待应答         sendBYTE(data);      //写配置字    do{;        }while(check());             stop();            //结束写             }        void rdfromIIC(void)       //从ADS1100中读出数据{         start();                  //开始读     sendBYTE(0x91);           //写器件地址(读)      do{         ;         }while(check());      //等待应答                 TMR1H=reciveBYTE();     // 读高8位       ack();                  //连续读      TMR1L=reciveBYTE();     //读低8位      ack();                  //连续读      TMR2=reciveBYTE();      //读配置字      nack();      stop();                  //结束读  //    delay();   }      main(){         while(1)    {     di();     wrtoIIC( 0x8c);     rdfromIIC();      }}  
                                                               


回帖(2)

杨雪

2025-1-21 16:07:02
使用中要注意,ADS1110的满量程为2.048V,超过就输出0xff了
举报

jjll652

2025-1-21 17:33:52
看起来您正在分享关于ADS1110的代码和信息,但是您的信息不完整。ADS1110是一款16位模数转换器(ADC),广泛用于需要高精度测量的系统中。它通过I2C接口与微控制器(MCU)通信。以下是一些基本的步骤和代码示例,用于初始化和读取ADS1110的数据:

1. **定义宏和变量**:
   ```c
   #include // 根据您的编译器和MCU型号,可能需要更改头文件

   #define uchar unsigned char
   #define uint unsigned int

   #define SDA RD1 // 定义数据线
   #define SCL RD0 // 定义时钟线

   uchar ACK;
   uint j;
   ```

2. **延时函数**:
   ```c
   void delay() {
       for(j=5535; --j;) continue;
   }
   ```

3. **启动I2C通信**:
   ```c
   void start(void) {
       TRISD0 = 0; // 设置SCL为输出
       TRISD1 = 0; // 设置SDA为输出

       SDA = 1;
       SCL = 1;
       delay();
       SDA = 0; // 启动信号
       delay();
       SCL = 0; // 保持时钟线低
   }
   ```

4. **停止I2C通信**:
   ```c
   void stop(void) {
       SDA = 0;
       SCL = 1;
       delay();
       SDA = 1;
       delay();
   }
   ```

5. **发送一个字节**:
   ```c
   void send_byte(uchar dat) {
       uchar i;
       for(i = 0; i < 8; i++) {
           SDA = (dat & 0x80) >> 7;
           dat <<= 1;
           SCL = 1;
           delay();
           SCL = 0;
           delay();
       }
       SDA = 1; // 释放数据线,准备接收应答位
       SCL = 1;
       delay();
       SCL = 0;
       ACK = SDA; // 读取应答位
   }
   ```

6. **读取一个字节**:
   ```c
   uchar read_byte() {
       uchar i, dat = 0;
       for(i = 0; i < 8; i++) {
           SCL = 1;
           delay();
           dat = (dat << 1) | SDA;
           SCL = 0;
           delay();
       }
       SDA = 0; // 发送应答位
       SCL = 1;
       delay();
       SCL = 0;
       return dat;
   }
   ```

7. **读取ADS1110的数据**:
   ```c
   uint read_ads1110() {
       uchar config, low, high;
       uint result;

       start(); // 发送开始信号
       send_byte(0x48 << 1); // 发送设备地址和写命令
       send_byte(0x01); // 配置寄存器地址
       send_byte(0x85); // 配置寄存器值(单次转换,增益1,12位分辨率)
       stop(); // 发送停止信号

       start(); // 再次发送开始信号
       send_byte(0x48 << 1 | 1); // 发送设备地址和读命令
       send_byte(0x00); // 读取数据寄存器地址
       low = read_byte(); // 读取低字节
       high = read_byte(); // 读取高字节
       stop(); // 发送停止信号

       result = (high << 8) | low; // 组合高低字节
       return result;
   }
   ```

请注意,这些代码示例需要根据您的具体硬件配置和编译器进行调整。如果您有更具体的问题或需要进一步的帮助,请提供更多的信息。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分