请选择 进入手机版 | 继续访问电脑版

智凡单片机论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 315|回复: 0

ADS1118驱动代码测试

[复制链接]

80

主题

80

帖子

288

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
288
发表于 2019-4-21 20:56:22 | 显示全部楼层 |阅读模式
首先看一下ADS1118.C文件

#include "ADS1118.H"
extern void  DelayMs(unsigned int i);
unsigned char ADS1118_Read(unsigned char data1);
void ADS1118_Get_Voltage(void);
/*
初始化ADS1118器件
*/
void ADS1118_init(void)
{
u8 i=0;
ADS1118_CS_OUT;        //CS配置为推挽输出
ADS1118_CLK_OUT;        //CLK配置为推挽输出
ADS1118_IN_OUT;        //配置为推挽输出
ADS1118_OUT_IN;        //配置为数字输入模式
SET_ADS1118_CS;
CLR_ADS1118_CLK;
DelayMs(10);
CLR_ADS1118_IN;
i=200;
while(i--);
CLR_ADS1118_CS;
ADS1118_Get_Voltage();
}
/*
SPI为全双工通信方式
*/
unsigned char ADS1118_Read(unsigned char data1)
{
  unsigned char i;
unsigned char temp;
unsigned char Din;
  temp = data1;
  for(i=0;i<8;i++)
  {
Din = Din<<1;
if(0x80&temp)
SET_ADS1118_IN;
else
CLR_ADS1118_IN;
DelayMs(1);
SET_ADS1118_CLK;
DelayMs(1);
if(ADS1118_OUT)
Din |= 0x01;
DelayMs(1);
CLR_ADS1118_CLK;
DelayMs(1);
temp = (temp<<1);
  }
  return Din;
}
/*
ADS1118_Voltage : 用来记录ADS1118采样的电压
*/
float ADS1118_Voltage;
void ADS1118_Get_Voltage(void)
{
unsigned int i=0;
unsigned char Data_REG_H,Data_REG_L;
unsigned int Data_REG,Config_data;
while((ADS1118_OUT)&&(i<200*1000)) i++;//等待转换完成*/
Data_REG_H=ADS1118_Read((unsigned char)((Control_Regist_MSB>>8)));
Data_REG_L=ADS1118_Read((unsigned char)Control_Regist_LSB);       
ADS1118_Read(0x00);
ADS1118_Read(0x00);
Data_REG=(Data_REG_H<<8)+Data_REG_L;
if(Data_REG>=0x8000)
   {
    Data_REG=0xFFFF-Data_REG;//把0xFFFF改成0x10000
    ADS1118_Voltage=(-1.0)*((Data_REG*FS/0x8000));
   }
else
ADS1118_Voltage=(1.0)*((Data_REG*FS/32768));
}
/*
测量温度传感器的值,记录在ADS1118_Temperature中
*/
float ADS1118_Temperature=25.9;
void ADS1118_Get_Temperature(void)
{
unsigned int i=200;
unsigned char Data_REG_H,Data_REG_L;
unsigned int Data_REG;
while((ADS1118_OUT_Val)&&(i<200)) i++;
Data_REG_H=ADS1118_Read(0x83);
Data_REG_L=ADS1118_Read(0xFB);
Data_REG=(Data_REG_H<<8)+Data_REG_L;
ADS1118_Read(0x83);
ADS1118_Read(0xFB);
ADS1118_Temperature=(Data_REG>>2)*0.03125;

}

接着来看一下ADS1118.H文件

#ifndef __ADS1118_H_
#define __ADS1118_H_


#include "c8051f020.h"
#include "intrins.h"


#define u16 unsigned int
#define u8 unsigned char
/*
******************************************************************************************
注意事项,测试使用的是ADS1118的模拟输入三口,AIN3,差分的时候,AIN3作为P,N是设置为GND,
get_Voltgage函数是在这个条件下,可以测试-4.096~+4.096V的电压,实测有零点漂移需要自行校准,
代码关键部位有注释进行相关解释,移植的时候只需要在头文件里面修改P口就行,其他的硬件配置要对,
比如测试AIN3以外的口就没输出了,需要自己更改函数配置部分,spi双工通信模块可以不动,测试温度的
不需要输入,可以直接用
********************************************************************************************
*/




sbit  ADS1118_CS   = P1^0;
sbit  ADS1118_CLK  = P1^1;
sbit  ADS1118_OUT  = P1^2;
sbit  ADS1118_IN   = P1^3;



#define      ADS1118_CS_OUT      (P1MDOUT    |=0X01 )
#define      SET_ADS1118_CS      (ADS1118_CS  =1    )
#define      CLR_ADS1118_CS      (ADS1118_CS  =0    )





#define      ADS1118_CLK_OUT     (P1MDOUT     |=0X02)
#define      SET_ADS1118_CLK     (ADS1118_CLK  =1   )
#define      CLR_ADS1118_CLK     (ADS1118_CLK  =0   )






#define      ADS1118_IN_OUT     (P1MDOUT      |=0X08 )
#define      SET_ADS1118_IN     (ADS1118_IN    =1    )
#define      CLR_ADS1118_IN     (ADS1118_IN    =0    )






#define      ADS1118_OUT_IN     (P1MDIN       |=0X04)
#define      ADS1118_OUT_Val    (ADS1118_OUT)



#define      SS          0X8000      //    1    Start a single conversion
#define      MUX2        0X4000      //    1
#define      MUX1        0X2000      //    1
#define      MUX0        0X1000      //    1    111 = AINP is AIN3 and AINN is GND
#define      PGA2        0X0000      //    0
#define      PGA1        0X0000      //    0
#define      PGA0        0X0200      //    1    001 = FS is ±4.096 V
#define      MODE        0X0100      //    1    1 = single-shot

#define      FS          4.096

#define      DR2         0X0080      //    1
#define      DR1         0X0000      //    0
#define      DR0         0X0000      //    0    100 = 128 SPS (default)
#define      TS_MODE     0X0000      //    0    0 = ADC mode (default)        (1 = Temperature sensor mode)
#define      PULL_UP_EN  0X0008     //     1    1 = Pull-up resistor enabled on DOUT/DRDY pin (default)
#define      NOP1        0X0000      //    0
#define      NOP0        0X0002      //    1    01 = Valid data, update the Config register (default)
#define      NOT_USED    0X0000      //    0    Always reads '1'
#define      Control_Regist      (SS+MUX2+MUX1+MUX0+PGA0+MODE+DR2+PULL_UP_EN+NOP0)
#define      Control_Regist_MSB  (SS+MUX2+MUX1+MUX0+PGA0+MODE)
#define      Control_Regist_LSB  (DR2+PULL_UP_EN+NOP0)
/***********************Internal call**************************/
// unsigned char ADS1118_Read(unsigned char);
/************************External call*************************/
void ADS1118_init(void);
void ADS1118_Get_Voltage(void);
void ADS1118_Get_Temperature(void);

#endif

最后看一下主函数调用部分

}
void  main()
{
unsigned char dat;
EA=0;
WDTCN = 0xde;   // 禁止WDT
WDTCN = 0xad;
EA=1;
SysClkInit();
Port_Init();
DelayMs(300);
ZLG7289_Reset();
DelayMs(1000);
ADS1118_init();//初始化ADS1118
EIE2 |= 0x20;        //EX7=1,允许外部中断 7 输入引脚的中断请求
while(1)
{
dat = Key/10;
ZLG7289_Download(1,0,0,dat);
ADS1118_Get_Voltage();
DelayMs(50);
dat = Key%10;
ZLG7289_Download(1,1,0,dat);
DelayMs(50);
DelayMs(50);
}

}

完了。

最后强调一点ADS1118使用时,ADS1118的DOUT引脚接的限流电阻不应太小,我选择的是1K的电阻。

好了,介绍完毕。


相关帖子

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|智凡单片机论坛

GMT+8, 2019-8-25 15:19 , Processed in 0.078890 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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