ADS1115是高精度的16位AD,号称电赛必备的芯片,可以通过I2C总线与MCU相连,ADS1115的引脚图见附件。
ADS1115和MCU连接图如下
程序如下
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.
void I2CforADS1115_NOACK(void)
{
SDA_OUT;
SCL_OUT;
SDA_H;
_NOP(); _NOP();
SCL_H;
SCL_L;
_NOP(); _NOP();
SDA_L;
}
/**************起始信号***************/
void I2CforADS1115_Start()
{
SDA_L;
SCL_H;
SDA_H;
SDA_L;
SCL_L;
}
/*************终止信号*************/
void I2CforADS1115_Stop()
{
SDA_L;
SCL_H;
SDA_H;
}
/*************向I2C总线发送一个字节************/
void I2CforADS1115_WriteByte(uchar wData)
{
uchar i;
SDA_OUT;
for(i=0;i<8;i++)
{
if((wData<<i) & 0x80)
SDA_H;
else
SDA_L;
SCL_H;
SCL_L;
}
SDA_H;
SCL_H;
SCL_L;
}
/**************读取一个字节**************/
uchar I2CforADS1115_ReadByte()
{
uchar temp=0,i;
SDA_IN;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL_L;
SCL_H;
if(SDA_VAL)
{
temp|=0x01;
}
}
SCL_L;
SDA_L;
SCL_H;
SCL_L;
SDA_H;
return temp;
}
void Configure_ADS1115()
{
uchar i=0;
Init_Data[0] =0x90; // 地址 + 写命令(写地址0x90,读地址0X91)
Init_Data[1] =0x01; // 指向配置寄存器
Init_Data[2] =0xc0; // 配置字高字节,采用-4.096到+4.096,选择AINp0输入,AINPn为GND
Init_Data[3] =0x83; // 配置字低字节,选择转换速率即通信速率
SCL_H;
I2CforADS1115_Start();
for(i=0;i<4;i++)
{
I2CforADS1115_WriteByte(Init_Data[i]);
_NOP();
}
I2CforADS1115_Stop();
}
/************指向转换结果寄存器***************/
void PointRegister_ADS115(void)
{
uchar i=0;
Init_Data[0] =0x90; // 地址 + 写命令
Init_Data[1] =0x00; // 指向转换结果寄存器
SDA_OUT;
SCL_H;
I2CforADS1115_Start();
for(i=0;i<2;i++)
{
I2CforADS1115_WriteByte(Init_Data[i]);
}
I2CforADS1115_Stop();
}
/**************读取转换结果***************/
uint32 ReadData_ADS1115(void)
{
uchar ResultL,ResultH;
uint32 Result;
SCL_H;
I2CforADS1115_Start();
I2CforADS1115_WriteByte(0x91);
ResultH=I2CforADS1115_ReadByte();
I2CforADS1115_NOACK();//非应答一定要,表示我还要数据
ResultL=I2CforADS1115_ReadByte();
I2CforADS1115_NOACK();
I2CforADS1115_Stop();
Result=ResultH*256+ResultL;
return Result;
}
/***********模拟量采集转化为数字量***********/
uint32 GetData_ADS1115()
{
uint32 ResultValue;
Configure_ADS1115();
PointRegister_ADS115();
ResultValue=ReadData_ADS1115(); //结果存储AD转化值
return ResultValue;
}