之前写了一篇AD7606的驱动,这两天又调了个ADS1115驱动,也给大家分享一下
先看这个芯片的原理图,其实很简单,一个i2c通信,一个RDY就绪线,需要注意的是ADDR引脚可以用来配置i2c从机地址
这个从机地址是七位的,实际使用的时候需要注意左移1位,最后补一个读写位。
接下来我们看一下寄存器
转换寄存器便宜地址0x0000,16位用于存储转换后的电压值
配置寄存器,这个是关键
OS,状态位不用管
MUX,这个是重点,实际转换的值是AINp - AINn的数值,因此我们设置的时候一般是设置100 - 111之间
PGA,基准电压,转换是用于比较的基准电压
MODE,单词转换模式,或者连续转换模式
DR,采样速率,速率越高误差越大
上面四个都是默认配置不做介绍
知道了寄存器流程就很简单了,基本流程就是1.将要转换的通道写入寄存器,2.等待转换3.读取转换寄存器
代码如下,结尾我会提供源码
void ADS1115_config(soft_i2c_driver *soft_i2c_driver, uint8_t channel)
{
soft_i2c_WriteReg(soft_i2c_driver, ADS1115_REG_Config, ADS1115_Config_MSB | (channel << 4), ADS1115_Config_LSB);
}
uint16_t ADS1115_ReadADC(soft_i2c_driver *soft_i2c_driver)
{
return soft_i2c_ReadReg(soft_i2c_driver,ADS1115_REG_Conversion);
}
void ADS1115_ReadAllChannel(soft_i2c_driver *soft_i2c_driver, uint16_t data[])
{
for(uint8_t i=0; i<4; i++)
{
ADS1115_config(soft_i2c_driver,i);
HAL_Delay(10);
data[i] = ADS1115_ReadADC(soft_i2c_driver);
}
}
void ADS1115_VolConversion(float *vol_value,int16_t data[4],float base_vol)
{
for(int i=0; i<4; i++)
{
vol_value[i] = 1.0 * data[i] / 32768 * base_vol;
}
}
在以上代码中,我使用的是模拟i2c,读者也可以自己换成其他读写i2c的函数
ADS1115_config 配置要读写的通道,并且开始转换
ADS1115_ReadADC 读取转换寄存器的值
ADS1115_ReadAllChannel 读取四个通道的值,并且放到数组中
ads1115_volconversion 电压转换,将读取的数值转换成真是的电压
代码仓库
zxy/Generic Component (gitee.com)https://gitee.com/zxys8/generic-component软件i2c需要实现对sda,scl 的读写,并且初始化延时时间和微妙级延时函数,整体设计思路是使用的接口函数,我对这个设计还是比较满意的,ads1115的驱动我本想也遮掩设计,但是最后发现对于这个设备来说,这样设计过于繁杂,所以算是偷个小懒,目前的写法也有缺陷,最大的缺陷就是和软件i2c强关联,没做好解耦,希望能和各位多多交流吧,感谢看到这里。