历史上的今天
今天是:2025年04月15日(星期二)
2020年04月15日 | 基于MSP430F5529单片机的ADS1115
2020-04-15 来源:eefocus
今天给大家带来还是TI公司出品的芯片——ads1115。
再看本篇之前最好先备好ads1115的datasheet。
(一)、芯片简介
ADS1115是具有内部基准、振荡器和可编程比较器且兼容 I2C 的ADS111x、超小型、低功耗 860SPS、16 位 ADC 。
在操作之前,你需要一块ads1115,一块单片机,CCS,还要会一点I2C协议的内容。
(二)、电路图

在这里先说明一下,为什么要接三个上拉电阻,因为在datasheet里面有明确的要求。
(三)、核心代码
1、ads1115通讯
首先来说说ads1115与430单片机之间的通讯,该通讯是采用I2C协议。
/******************************
* 2 start i2c 启动
****************************/
void start()
{
SCL_H;
SDA_H;
delay();
SDA_L;
delay();
SCL_L;
}
/********************************
* 3 结束 I2c
********************************/
void stop() //////////和例程不太一样!
{
SCL_L;
SDA_L;
delay();
SCL_H;
delay();
SDA_H;
}
/******************
* 4 i2c主机应答操作
*******************/
void mack(void)
{
SDA_L;
_NOP();
_NOP();
SCL_H;
delay();
SCL_L;
_NOP();
_NOP();
SDA_H;
delay();
}
/**********************
* 5 i2c 主机无应答操作
*******************/
void mnack()
{
SDA_H;
_NOP();
_NOP();
SCL_H;
delay();
SCL_L;
_NOP();
_NOP();
SDA_L;
delay();
}
/*************
* 6
*/
void ack()
{
uchar i=0;
SDA_in;
SCL_H;
delay();
while((P3IN&BIT5)&&(i<250))
i++;
SDA_out;
SCL_L;
delay();
}
/************************
* 7 写1
*************************/
void write1()
{
SDA_H;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/********************8
* 8 写0
*/
void write0()
{
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/*************
* 9 写字节
*/
void write1byte(uchar data)
{
uchar i;
for(i=8;i>0;i--)
{
if(data&0x80)
write1();
else
write0();
data<<=1;
}
SDA_H;
_NOP();
}
/**************
* 读字节
*/
uchar read1byte(void)
{
uchar rdata = 0x00,i;
uchar flag;
for(i = 0;i < 8;i++)
{
SDA_H;
SCL_H;
SDA_in;
flag = SDA_val;
rdata <<= 1;
if(flag)
rdata |= 0x01;
SDA_out;
SCL_L;
}
return rdata;
}
2、ads1115写指令与得到数值
接下来我们介绍ads1115的核心代码。
/*
* 1115写寄存器
*/
void Confige1115(uchar channel)
{
uchar a_channel;
switch(channel)
{
case 0:
a_channel=0xC0; //单通道输入
break;
case 1:
a_channel=0xD0;
break;
case 2:
a_channel=0xE0;
break;
case 3:
a_channel=0xF0;
break;
case 4:
a_channel=0x84; //差分输入 的指令
default :
break;
}
start();
write1byte(address);
ack();
write1byte(config);
ack();
write1byte(a_channel);
ack();
write1byte(Li);
ack();
stop();
}
/*
* 读取数值
*/
uint read1115(void)
{
uchar result_l,result_h;
uint result;
start();
write1byte(address);
ack();
write1byte(conversion);
ack();
stop();
start();
write1byte(address+1);
ack();
result_h=read1byte();
mack();
result_l=read1byte();
ack();
stop();
result=result_h*256+result_l;
return result;
}
uint Start_1115(uchar temp)
{
uint result_gd;
Confige1115(temp);
//delay_ms(5);
_NOP();
result_gd=read1115();
//delay_ms(5);
_NOP();
return result_gd;
}
/*
* 1115初始化
*/
void ads1115_init()
{
P1DIR|=BIT4; //SCL
P1DIR|=BIT5; //SDA
SCL_H;
SDA_H;
}
3、main函数介绍
#include #include"ads1115.h" #include"LCD12864.h" #include"stdio.h" #include"math.h" unsigned int valuex[]; unsigned int value_0; unsigned long temp; unsigned char result[6]; void float_to_result(int value_temp) { temp = (float)value_temp*0.6250190741; //将AD值转化为数组 6.144/32767*10000 result[0] = (temp/10000)+'0'; result[1] = '.'; result[1] = (temp/1000%10)+'0'; result[2] = (temp/100%10)+'0'; result[3] = (temp/10%10)+'0'; result[4] = (temp%10)+'0'; } void main() { WDTCTL=WDTPW+WDTHOLD; LCD_Ioinit(); //12864显示初始化 LCD_Init(); LCD_Clean(); LCD_Write(0,0,"电压:"); ads1115_init(); while(1) { value_0=Start_1115(0); //得到数值 float_to_result(value_0); //数值转化为数组以便输出 LCD_Setpos(1,0); LCD_Writestring(result,6); } } (四)、结语 以上就是本次给大家带来的内容,介于博主能力有限,如有错误,请及时指出。如有疑问,可以在评论区提出。 最后,如果有小伙伴想要完整的源代码,包含以上全部内容(main,ads1115c文件和头文件,12864c文件和头文件),可以下载。 https://download.csdn.net/download/qq_40890957/11584116
史海拾趣




