223 lines
5.4 KiB
C
223 lines
5.4 KiB
C
#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, ®_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
|