#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