《STM32单片机的ADS1115通过模拟I2C驱动.doc》由会员分享,可在线阅读,更多相关《STM32单片机的ADS1115通过模拟I2C驱动.doc(5页珍藏版)》请在三一文库上搜索。
1、STM32单片机的ADS1115通过模拟I2C驱动注意:本部分代码需要只是ADS1115的部分程序(一些用到的数组在此没有写),模拟II2C的各程序并未给出,大家根据需要进行裁剪,代码完全开源,希望能帮到大家,也希望大家乐于分享。调试时需特别注意I2C的通信问题,特别是应答信号的使用需要特别关注,本人的程序之前出错全是因为从机的应答信号的未使用造成。收获:对于I2C通信协议的理解更加深刻,对ADS1115也能进行单通道的使用。I2C的开始、发送/读写、应答、结束等一定要严格按照时序操作,ADS的操作还有所欠缺,仅仅会配置单通道,对于其他配置并没有关注,最近要把多通道的和阈值的配置也写好,到时再
2、更新附录代码:#define CMD_Write 0x90 /写入命令 1001 0000 前7位表示ADS1115地址,最后1位0表示写#define CMD_Read 0x91 /读取命令 1001 001 前7位表示ADS1115地址,最后1位1表示读#define CMD_POINT_REG 0x00 /指向寄存器配置#define CMD_CONF_REG 0x01 /配置寄存器配置#define CONF_L 0xe3 /低8位#define ADS1115_ADDR 0x90 /* ADS1115的设备地址,需配置 */* Function Name : Confige1115*
3、 参数 : 通道0/1/2/3* AttenTIon :配置ADS1115,根据需要的通道进行配置*/staTIc void Confige1115 (unsigned char port)staTIc unsigned char chnel, i;switch (port)case 0: /0通道chnel=0xC2;break;case 1: /1通道chnel=0xD2;break;case 2: /2通道chnel=0xE2;break;case 3: /3通道chnel=0xF2;break;default:break;WriteIntBuf0 = CMD_Write; /0x90W
4、riteIntBuf1 = CMD_CONF_REG; /0x01WriteIntBuf2 = chnel; / 写入要配置的通道WriteIntBuf3 = CONF_L; /0xe3i2c_Start(); /开启I2Cfor(i=0;i4;i+)i2c_SendByte(WriteIntBufi); /发送寄存器配置信息ads1115_delay(20);i2c_WaitAck(); /注意,此处在最初调试时没有,读出数据一直不变,加上后正常i2c_Stop(); /停止I2C/* FuncTIon Name : PointRegister* Attention : 指向ADS1115指
5、针寄存器用于准备读取数据*/static void PointRegister (void)unsigned char i;WritepointBuf0 = CMD_Write; /90WritepointBuf1 = CMD_POINT_REG; /00i2c_Start(); /开启I2Cfor(i=0;i2;i+)i2c_SendByte(WritepointBufi); /发送寄存器配置信息i2c_WaitAck();ads1115_delay(20);i2c_Stop(); /停止I2C/* 读取ADS1115的16位数据*/static uint16_t ReadData (uns
6、igned char chnnal1)uint16_t data;i2c_Start(); /开启I2Ci2c_SendByte(CMD_Read); /发送读命令ads1115_delay(20);i2c_WaitAck(); /注意,加上此句后程序正常,不加时我测试的读错数据,大家可能没事ReadBuffer0 = i2c_ReadByte(); /读取数据高位i2c_Ack(); /主机向ADS1115发送应答信号ads1115_delay(200);ReadBuffer1 = i2c_ReadByte();/读取数据低位i2c_Ack(); /主机向ADS1115发送应答信号ads11
7、15_delay(200);i2c_Stop(); /发送停止信号data = ReadBuffer0*256+ReadBuffer1; /数据处理return data;/* Function Name : Get_ATOD* Attention :获取ADS1115模拟转换结果*/float Get_ATOD (unsigned char channel)static unsigned char chn;chn = channel;Confige1115(channel); /配置ADS1115转换通道ads1115_delay(1000);PointRegister(); /指向ADS1115指针寄存器用于准备读取数据ads1115_delay(1000);data_get = ReadData(chn); /从通道中读数据ads1115_delay(1000);/*用于测量负电压,负电压从8000ffff,负电压与正关于0有类似对称关系,按位取反后+1相同*/if(data_get=0x8000)dianya=(float)(0xffff-data_get)/32768.0)*4.096;elsedianya=(float)data_get/32768.0)*4.096;return dianya;
链接地址:https://www.31doc.com/p-3273673.html