ADS1115通道之间轮流转换采样时,出来的都是其中一路的结果,但是单独使用一个通道时工作都正常,采样的模式是单端连续采样模式,是不是自己设置ADS1115有问题?
Wayne Xu:
能否上传原理图和代码以便分析
kai liu1:
回复 Wayne Xu:
注明:在实际使用中只使用SCL和SDA引脚与MSP430连接,未使用ALERT引脚。
下面程序为IIC程序和ADS1115程序
********************************************************IIC程序************************************************************************************
#include <msp430f149.h>#include"ADS1115.h"#include "I2C.h"typedef unsigned char uchar;typedef unsigned int uint;unsigned int Initdata[4]={0};/**************起始信号***************/void start(){ SDA_Out; SDA_L; SCL_Out; SCL_H; SDA_H; SDA_L; SCL_L;}/*************终止信号*************/void stop(){ SDA_Out; SDA_L; SCL_H; SDA_H;}/*************向I2C总线发送一个字节************/void Send1byte(uint byte){ uint i; SDA_Out; for(i=0;i<8;i++) { if((byte<<i) & 0x80) SDA_H; else SDA_L; SCL_H; SCL_L; } SDA_H; SCL_H; SCL_L;}/**************读取一个字节**************/uint Read1byte(){ uint temp=0,i; SDA_In; for(i=0;i<8;i++) { temp=temp<<1; SCL_L; SCL_H; if(P2IN&0x02) { temp|=0x01; }
} SDA_Out; SCL_L; SDA_L; SCL_H; SCL_L; SDA_H; return temp;}
*****************************************************************************************************************************************************
****************************************************************ADS1115程序**********************************************************************
#include <msp430f149.h>#include "I2C.h"typedef unsigned char uchar;typedef unsigned int uint;extern unsigned int Initdata[4];uint result_gd=0;/*******************Config寄存器*********************/void Confige_1115(uchar channel ){ uchar i=0; switch(channel) //通道选择 { case 0: Initdata[2] = 0x42; break; case 1: Initdata[2] = 0x52; break; case 2: Initdata[2] = 0x62; break; case 3: Initdata[2] = 0x72; break; } Initdata[0] =0x90; // 启动配置命令 Initdata[1] =0x01; // 指向配置寄存器 Initdata[3] =0x83; // 配置字低字节 SCL_H; start(); for(i=0;i<4;i++) { Send1byte(Initdata[i]); _NOP(); } stop();}/************指向转换结果寄存器***************/void Point_reg(void){ uchar i=0; Initdata[0] =0x90; // 地址 + 写命令 Initdata[1] =0x00; // 指向转换结果寄存器 SDA_Out; SCL_H; start(); for(i=0;i<2;i++) { Send1byte(Initdata[i]); } stop();}/**************读取转换结果***************/uint Read_1115(void){ uchar ResultL,ResultH; uint Result; SCL_H; start(); Send1byte(0x91); ResultH=Read1byte(); _NOP(); ResultL=Read1byte(); stop(); Result=ResultH*256+ResultL; return Result;}
uint Get_AD(uchar channel){ Confige_1115(channel); Point_reg(); return Read_1115();}
*********************************************************************************************************************************************************
在主函数中使用Get_AD(uchar channel)连续调用两个通道,使用仿真器单步执行两通道的结果都正确,液晶显示也正确,但是全速执行后发现两通道的值互相有影响,两通道采样出来的结果是其中一通道的值,这是否跟ADS1115内部只是使用同一个数据转换寄存器有关?
kai liu1:
回复 Wayne Xu:
是不是多通道轮流采样只能使用单次转换模式而不能使用连续转换模式?
kai liu1:
回复 Wayne Xu:
急需解决这一问题,请问能否提供邮箱进行交流 我的邮箱liukaimark@163.com
Wanda WANG:
如果单步执行,每个通道都正常的话,那有可能是你轮流采样时,通道间的时间间隔留的不够。
ADS1115的最高采样率只有860. 建议你尝试把通道间切换的延时加长。
long qi:
回复 kai liu1:
你好,你的问题解决了吗 ?你能 把你的程序发一份给我吗 太需要了 真的非常感谢你 416908607@qq.com 谢谢
long qi:
回复 kai liu1:
你好 ,我急需这个ADS1115的程序,请你发一份给我好吗?谢谢你 416908607@qq.com
switch11:
回复 kai liu1:
您好,仁兄。最近我也打算多通道进行测试,还没遇到您说的问题,不知您解决的怎么样?
Qilai Zhao:
回复 Wanda WANG:
您好!我也遇到了这个问题,两个通道交替采样时出来的数据是一样的,我也尝试加了比较大的延时,结果还是一样,请问怎么解决,谢谢!
if(i==7)//ADS1115的1#ADC值 { ads1115_start_convert(0xC4); //##### ads1115_read_adc_val(7); }if(i==8)//ADS1115的2#ADC值 { ads1115_start_convert(0xE4); ads1115_read_adc_val(8); }/****************************** 往ADS1115写入一个字节 *******************************/void write_ads1115(unsigned char configreg) {TwiStart();//产生启动信号TwiWriteByte(ADS1115_WRITE);// #define ADS1115_WRITE 0x90 =10010000地址寄存器最后那个0标识 写TwiWriteByte(0x01);//0x01=00000001写入指针寄存器指向配置寄存器TwiWriteByte(configreg);//Config reg的前8位,改变AD通道1#0xC52#0xE5TwiWriteByte(0x83);//Config reg的后8位,不变TwiStop();//产生停止信号twi_delay_bus();twi_delay_bus();twi_delay_bus();TwiStart();//产生启动信号TwiWriteByte(ADS1115_WRITE);// #define ADS1115_WRITE 0x90 =10010000地址寄存器最后那个0标识 写TwiWriteByte(0x00);//0x00=00000000写入指针寄存器指向转换寄存器TwiStop();//产生停止信号twi_delay_bus();twi_delay_bus();twi_delay_bus();}/****************************** 从ADS1115读取ADC值 *******************************/void ads1115_read_adc_val(int k) {unsigned char DH,DL;TwiStart();//产生启动信号TwiWriteByte(ADS1115_READ);//#define ADS1115_READ 0x91=10010001 最后那个1标识 读DH=TwiReadByte(1);//读一字节数据 ack: 1时应答,0时不应答DL=TwiReadByte(1);//读一字节数据TwiStop();//产生停止信号twi_delay_bus();ADCResult[k][1]=DL;ADCResult[k][0]=DH;DH=0;DL=0;twi_delay_bus();twi_delay_bus();twi_delay_bus();twi_delay_bus();twi_delay_bus();twi_delay_bus();twi_delay_bus();//////////////////////////////}//开始一次转换void ads1115_start_convert(unsigned char configreg) {TwiInit();SPI_MasterInit();write_ads1115(configreg);//SDA写入 指针寄存器指向配置寄存器 }