darts/User/device/ADS1115.c
2026-02-15 23:43:19 +08:00

223 lines
5.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ADS1115.h"
#ifdef ADS1115
static ADS1115_InitTypeDefine ADS1115_InitType;
int16_t ADS1115_RawData[4] = {0};
/**
* @brief Configuration of ADS1115, single-shot
*/
void ADS1115_UserConfig_Single(void)
{
ADS1115_InitType.COMP_LAT = ADS1115_COMP_LAT_0;
ADS1115_InitType.COMP_MODE = ADS1115_COMP_MODE_0;
ADS1115_InitType.COMP_POL = ADS1115_COMP_POL_0;
ADS1115_InitType.DataRate = ADS1115_DataRate_475;
ADS1115_InitType.MODE = ADS1115_MODE_SingleConver;
ADS1115_InitType.MUX = ADS1115_MUX_Channel_0;
ADS1115_InitType.OS = ADS1115_OS_SingleConverStart;
ADS1115_InitType.PGA = ADS1115_PGA_4096;
ADS1115_InitType.COMP_QUE = ADS1115_COMP_QUE_3;
ADS1115_Config(&ADS1115_InitType);
}
/**
* @brief Configuration of ADS1115, continuous conversion
*/
void ADS1115_UserConfig_Continue(void)
{
ADS1115_InitType.COMP_LAT = ADS1115_COMP_LAT_0;
ADS1115_InitType.COMP_MODE = ADS1115_COMP_MODE_0;
ADS1115_InitType.COMP_POL = ADS1115_COMP_POL_0;
ADS1115_InitType.DataRate = ADS1115_DataRate_475;
ADS1115_InitType.MODE = ADS1115_MODE_ContinuConver;
ADS1115_InitType.MUX = ADS1115_MUX_Channel_0;
ADS1115_InitType.OS = ADS1115_OS_OperationalStatus;
ADS1115_InitType.PGA = ADS1115_PGA_4096;
ADS1115_InitType.COMP_QUE = ADS1115_COMP_QUE_3;
ADS1115_Config(&ADS1115_InitType);
}
/**
* @brief 配置ADS1115
*/
u8 ADS1115_Config(ADS1115_InitTypeDefine *ADS1115_InitStruct)
{
u16 Config;
uint8_t Writebuff[3];
Config = ADS1115_InitStruct->OS + ADS1115_InitStruct->MUX + ADS1115_InitStruct->PGA + ADS1115_InitStruct->MODE
+ ADS1115_InitStruct->DataRate + ADS1115_InitStruct->COMP_MODE + ADS1115_InitStruct->COMP_POL
+ ADS1115_InitStruct->COMP_LAT + ADS1115_InitStruct->COMP_QUE;
Writebuff[0] = ADS1115_Pointer_ConfigReg; // 配置寄存器地址
Writebuff[1] = (uint8_t)((Config >> 8) & 0xFF); // 配置高字节
Writebuff[2] = (uint8_t)(Config & 0xFF); // 配置低字节
// 使用硬件I2C写入配置
int8_t result = BSP_I2C_Transmit(BSP_I2C_FORCE, ADS1115_ADDRESS_W, Writebuff, 3, false);
return (result == HAL_OK) ? 1 : 0;
}
/**
* @brief 读取ADS1115当前通道下的原始数据
*/
u8 ADS1115_ReadRawData(int16_t *rawData)
{
uint8_t reg_addr = ADS1115_Pointer_ConverReg;
uint8_t read_data[2];
// 先写入要读取的寄存器地址
int8_t result = BSP_I2C_Transmit(BSP_I2C_FORCE, ADS1115_ADDRESS_W, &reg_addr, 1, false);
if (result != HAL_OK) {
return 0;
}
// 然后读取数据
result = BSP_I2C_Receive(BSP_I2C_FORCE, ADS1115_ADDRESS_R, read_data, 2, false);
if (result != HAL_OK) {
return 0;
}
*rawData = (int16_t)((read_data[0] << 8) | read_data[1]);
return 1;
}
/**
* @brief Switch the channel of ADS1115
*/
void ADS1115_ScanChannel(uint8_t channel)
{
switch (channel)
{
case 0:
ADS1115_InitType.MUX = ADS1115_MUX_Channel_0;
break;
case 1:
ADS1115_InitType.MUX = ADS1115_MUX_Channel_1;
break;
case 2:
ADS1115_InitType.MUX = ADS1115_MUX_Channel_2;
break;
case 3:
ADS1115_InitType.MUX = ADS1115_MUX_Channel_3;
break;
default:
break;
}
//单次模式下必须启动转换,连续模式下 OS 位无效
if (ADS1115_InitType.MODE == ADS1115_MODE_SingleConver) {
ADS1115_InitType.OS = ADS1115_OS_SingleConverStart;
}
ADS1115_Config(&ADS1115_InitType);
}
/**
* @brief 将传感器的原始采样数据转化为电压数据
*/
float ADS1115_RawDataToVoltage(int16_t rawData)
{
float voltage;
switch (ADS1115_InitType.PGA)
{
case ADS1115_PGA_0256:
voltage = rawData * 0.0078125f;
break;
case ADS1115_PGA_0512:
voltage = rawData * 0.015625f;
break;
case ADS1115_PGA_1024:
voltage = rawData * 0.03125f;
break;
case ADS1115_PGA_2048:
voltage = rawData * 0.0625f;
break;
case ADS1115_PGA_4096:
voltage = rawData * 0.125f;
break;
case ADS1115_PGA_6144:
voltage = rawData * 0.1875f;
break;
default:
voltage = 0;
break;
}
return voltage;
}
/**
* @brief 直接获取ADS1115当前通道的电压采样值
*/
float ADS1115_GetVoltage(void)
{
int16_t rawData;
if (ADS1115_ReadRawData(&rawData)) {
return ADS1115_RawDataToVoltage(rawData);
}
return 0.0f;
}
/**
* @brief 获取并计算ADC采样的平均电压值
*/
float ADS1115_GetAverageVoltage(uint16_t num)
{
int32_t sum = 0;
int16_t rawData;
if(num == 0)
{
return ADS1115_GetVoltage();
}
for(uint16_t i = 0; i < num; i++)
{
if(ADS1115_ReadRawData(&rawData)) {
sum += rawData;
}
}
return ADS1115_RawDataToVoltage(sum / num);
}
/**
* @brief 刷新ADS1115全部通道的采样数据
*/
void ADS1115_RefreshAllChannel(void)
{
static uint8_t channel = 0;
int16_t adcDataTemp = 0;
// 读取数据返回正确则将读到的数据写入ADS1115_RawData数组中
if(ADS1115_ReadRawData(&adcDataTemp))
{
ADS1115_RawData[channel] = adcDataTemp;
}
// ADS1115总共4个通道
channel++;
if(channel > ADS1115_MAX_CHANNEL - 1)
channel = 0;
// 结束采样后切换至下一通道
ADS1115_ScanChannel(channel);
}
#endif