/**
* @file ADS1112_ATY.c
*
* @param Project DEVICE_GENERAL_ATY_LIB
*
* @author ATY
*
* @copyright
* - Copyright 2017 - 2023 MZ-ATY
* - This code follows:
* - MZ-ATY Various Contents Joint Statement -
*
* https://mengze.top/MZ-ATY_VCJS
* - CC 4.0 BY-NC-SA -
*
* https://creativecommons.org/licenses/by-nc-sa/4.0/
* - Your use will be deemed to have accepted the terms of this statement.
*
* @brief Familiar functions of ADS1112 for all embedded device
*
* @version
* - 1_01_230828 > ATY
* -# Preliminary version, first Release
* - 1_02_231229 > ATY
* -# add multy addr and channel
********************************************************************************
*/
#ifndef __ADS1112_ATY_C
#define __ADS1112_ATY_C
#include "ADS1112_ATY.h"
/******************************* For user *************************************/
/******************************************************************************/
/**
* @brief Set ADS1112 paramas
* @param adChannel channel type, default 0 -> C0-C1
* @param conversion conversion, default 0
* @param resolution resolution, higher resolution with lower data rate, default 3
* @param gain gain, default 0
* @param addr chip address
* @param channel chip channel
*/
uint8_t ADS1112_Setting(uint8_t adChannel, uint8_t conversion, uint8_t resolution, uint8_t gain, uint8_t addr, uint8_t channel)
{
/* INP controls which two of the four analog inputs are used to measure data in the ADC.
INP1 INP0 V IN+ V IN-
0 0 AIN0 AIN1
0 1 AIN2 AIN3
1 0 AIN0 AIN3
1 1 AIN1 AIN3
*/
/* Bits DR1 and DR2 control the ADS1112 data rate and resolution
DR1 DR0 DATA RATE RESOLUTION
0 0 240SPS 12 Bits
0 1 60SPS 14 Bits
1 0 30SPS 15 Bits
1 1 15SPS 16 Bits
*/
/* Bits PGA1 and PGA0 control the ADS1112 ADS1112 gain setting
PGA1 PGA0 GAIN
0 0 1
0 1 2
1 0 4
1 1 8
*/
uint8_t tempReg = (1 << 7 |
adChannel << 5 |
conversion << 4 |
resolution << 2 |
gain);
return I2C_Write(addr, &tempReg, 1, channel);
}
/**
* @brief read data from ADS1112
* @param addr chip address
* @param channel chip channel
* @return uint16_t data value
*/
uint16_t ADS1112_Read(uint8_t addr, uint8_t channel)
{
uint8_t errCount = 11;
uint8_t tempRealValue[3] = {0};
I2C_Read(chipAddr, tempRealValue, 3);
while(errCount--){
if((tempRealValue[2] & (uint8_t)0x80) != 0)
I2C_Read(addr, tempRealValue, 3, channel);
}
if(errCount <= 1)
return 0;
return (uint16_t)((uint16_t)((uint16_t)tempRealValue[0] << 8) | (uint16_t)tempRealValue[1]);
}
/**
* @brief
* @param u16Data chip return data
* @return float voltage value
*/
float ADS1112_VoltageConvert(uint16_t u16Data)
{
if(u16Data > 0x7FFF)
return ((((float)(u16Data - 0x8000) / 65536.0f) * 2.048f * 2) + (VREF_COM - 2.048f));
else
return ((((float)(u16Data + 0x8000) / 65536.0f) * 2.048f * 2) + (VREF_COM - 2.048f));
}
// void main()
// {
// while(1)
// {
// float result = 0;
// ADS1112_Setting(CHANNEL_0_3, CONVERSION_CONTINUOUS, RESOLUTION_16BIT, GAIN_1, ADS1112_ADDRESS, ADS1112_I2C);
// result = ADS1112_VoltageConvert(ADS1112_Read(ADS1112_ADDRESS, ADS1112_I2C));
// printf(result);
// DelayMs(1000);
// ADS1112_Setting(CHANNEL_1_3, CONVERSION_CONTINUOUS, RESOLUTION_16BIT, GAIN_1, ADS1112_ADDRESS, ADS1112_I2C);
// result = ADS1112_VoltageConvert(ADS1112_Read(ADS1112_ADDRESS, ADS1112_I2C));
// printf(result);
// DelayMs(1000);
// }
// }
#endif /* __ADS1112_ATY_C */
/******************************** End Of File *********************************/