stm32 HAL ADS1115驱动

之前写了一篇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)icon-default.png?t=O83Ahttps://gitee.com/zxys8/generic-component软件i2c需要实现对sda,scl 的读写,并且初始化延时时间和微妙级延时函数,整体设计思路是使用的接口函数,我对这个设计还是比较满意的,ads1115的驱动我本想也遮掩设计,但是最后发现对于这个设备来说,这样设计过于繁杂,所以算是偷个小懒,目前的写法也有缺陷,最大的缺陷就是和软件i2c强关联,没做好解耦,希望能和各位多多交流吧,感谢看到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值