stm32f103 ads1115驱动程序
时间: 2023-08-23 13:04:41 浏览: 200
STM32F103 ADS1115驱动
以下是基于STM32F103和ADS1115的驱动程序示例:
```c
#include "stm32f10x.h"
#include "delay.h"
#include "ads1115.h"
#define ADS1115_ADDRESS 0x90 // ADS1115的地址为0x90
void ADS1115_Init(void)
{
I2C1_Init(); // 初始化I2C总线
I2C1_Start(); // 启动I2C总线
I2C1_SendByte(ADS1115_ADDRESS); // 发送从设备地址
I2C1_SendByte(0x01); // 发送配置寄存器的地址
I2C1_SendByte(0xC5); // 发送配置字节MSB
I2C1_SendByte(0x83); // 发送配置字节LSB
I2C1_Stop(); // 停止I2C总线
}
int16_t ADS1115_GetValue(uint8_t channel)
{
uint8_t data[2];
int16_t value;
I2C1_Start(); // 启动I2C总线
I2C1_SendByte(ADS1115_ADDRESS); // 发送从设备地址
I2C1_SendByte(0x00); // 发送转换寄存器地址
I2C1_Stop(); // 停止I2C总线
delay_ms(1); // 延时等待转换完成
I2C1_Start(); // 启动I2C总线
I2C1_SendByte(ADS1115_ADDRESS | 0x01); // 发送读取命令
data[0] = I2C1_ReadByte(1); // 读取数据字节MSB并发送NACK
data[1] = I2C1_ReadByte(0); // 读取数据字节LSB并发送ACK
I2C1_Stop(); // 停止I2C总线
value = (int16_t)(data[0] << 8) | data[1]; // 合并数据字节
if (value < 0) // 如果是负数
{
value = ~value + 1; // 取反加一
}
switch (channel) // 根据通道号计算转换后的值
{
case 0:
value *= 6.144 / 32768;
break;
case 1:
value *= 4.096 / 32768;
break;
case 2:
value *= 2.048 / 32768;
break;
case 3:
value *= 1.024 / 32768;
break;
}
return value;
}
```
在上面的示例代码中,我们使用了ADS1115的单次转换模式,配置字节为0xC583,通道0-3的增益分别为6.144、4.096、2.048和1.024。函数`ADS1115_Init()`用于初始化ADS1115,函数`ADS1115_GetValue()`用于获取指定通道的转换值。在读取转换值之前需要延时一段时间等待转换完成。转换完成后,读取数据字节MSB和LSB,并根据通道号计算转换后的值。
阅读全文