sggt/App/ADS1220/ads1220.c

333 lines
10 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 "FreeRTOS.h"
#include "task.h"
#include "gpio.h"
#include "spi.h"
#include "stm32f407xx.h"
#include "utils.h"
#include "ads1220.h"
#include "dac7811.h"
uint8_t RcvData[8];
long ADS1220RTDGainCorrection = 1;
long ADS1220TCGainCorrection = 1;
BOOL ads1220_spi_init_flag = FALSE;
static void ads1220_cs(cs_state_type state)
{
if (state == CS_L)
{
ADS1220_CS(GPIO_PIN_RESET);
}
else
{
ADS1220_CS(GPIO_PIN_SET);
}
}
static void fun_ads1220_spi1_init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
ADS1220_CS(GPIO_PIN_RESET);
//DAC7811_CS(GPIO_PIN_SET);
}
// static void spi_write_byte(uint8_t data)
// {
// HAL_SPI_Transmit(&hspi1, &data, 1, 1000);
// }
// static void spi_write_read_byte(uint8_t *pTxData, uint8_t *pRxData)
// {
// HAL_SPI_TransmitReceive(&hspi1, pTxData, pRxData, 1, 1000);
// }
static void spi_write_read(uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
{
HAL_SPI_TransmitReceive(&hspi1, pTxData, pRxData, Size, 1000);
}
static void ads1220_write_regs(uint8_t *writeValues, uint8_t startReg, uint8_t length)
{
uint8_t outData[5];
uint8_t i;
outData[0] = ADS1220_WRITE_CMD(startReg, length); // 该命令为告诉芯片写入寄存器,并且告知长度和初始寄存器位置
for (i = 0; i < length; i++)
{
outData[i + 1] = writeValues[i];
}
spi_write_read(outData, RcvData, length + 1); // Add 1 to length for command byte
}
/*
static void ads1220_read_regs(uint8_t *readValues, uint8_t startReg, uint8_t length)
{
uint8_t outData[5] = {0x55, 0x55, 0x55, 0x55, 0x55};
outData[0] = ADS1220_READ_CMD(startReg, length);
spi_write_read(outData, readValues, length + 1); // 第一位作为命令数据
}
*/
//static void ads1220_send_read_data_command(void)
//{
// uint8_t cmd = ADS1220_RDATA_CMD;
// spi_write_read(&cmd, RcvData, 1);
//}
static void setup_ads1220(uint8_t inputMux, uint8_t opMode,
uint8_t conversionMode, uint8_t dataRate, uint8_t gainLevel, uint8_t pgaBypass,
uint8_t routeIDAC1, uint8_t routeIDAC2, uint8_t idacCurrent, uint8_t selectVref, uint8_t intTempSensor)
{
uint8_t config[4];
config[0] = inputMux + gainLevel + pgaBypass;
config[1] = dataRate + opMode + conversionMode + intTempSensor + ADS1220_BURN_OUT_CURRENT_OFF;
config[2] = ADS1220_FIR_50_60 + selectVref + ADS1220_LOW_SIDE_POWER_OPEN + idacCurrent;
config[3] = routeIDAC1 + routeIDAC2 + ADS1220_DRDY_ON_DRDY_ONLY;
ads1220_write_regs(config, ADS1220_CONFIG_0_REG, 4);
}
/*一般单次转换时候采集时候使用的代码
if(!Read_DRDY){//当检测到数据可读时
ads1220_get_conversion_data(ADC1220.DigitValue);//启动读取函数
ADS1220_Start();//及时发送一个下一次转换的信号
ADC1220.AllDigit = (ADC1220.DigitValue[1]<<16)+(ADC1220.DigitValue[2]<<8)+ADC1220.DigitValue[3];//合并分开的24位数据
if(ADC1220.DigitValue[1] < 0x80){//正负号判断
ADC1220.AnalogValue = ((ADC1220.AllDigit)*VRef/0x800000);
}
else{
ADC1220.AnalogValue = (-1)*((0xffffff-ADC1220.AllDigit)*VRef/0x800000);
}
*/
/*ADS1220配置*/
/*输入:
inputMux :输入多路复用器配置对于AINn=AVSS的设置PGA必须PGA_BYPASS=1,并且仅可使用增益124
ADS1220_MUX_AIN0_AIN1
ADS1220_MUX_AIN0_AIN2
ADS1220_MUX_AIN0_AIN3
ADS1220_MUX_AIN1_AIN2
ADS1220_MUX_AIN1_AIN3
ADS1220_MUX_AIN2_AIN3
ADS1220_MUX_AIN1_AIN0
ADS1220_MUX_AIN3_AIN2
ADS1220_MUX_AIN0_AVSS
ADS1220_MUX_AIN1_AVSS
ADS1220_MUX_AIN2_AVSS
ADS1220_MUX_AIN3_AVSS
ADS1220_MUX_REFP-REFN
ADS1220_MUX_AVDD-AVSS
ADS1220_MUX_SHORTED
opMode 工作模式选择
ADS1220_OP_MODE_NORMAL 正常模式256kHz 调制时钟 默认设置)
ADS1220_OP_MODE_DUTY 占空比模式内部占空比14
ADS1220_OP_MODE_TURBO Turbo模式 512kHz调制时钟
conversionMode: 转换模式
ADS1220_CONVERSION_SINGLE_SHOT 单次
ADS1220_CONVERSION_CONTINUOUS 连续
dateRate数据速率详见说明书表18
ADS1220_DATA_RATE_20SPS
ADS1220_DATA_RATE_45SPS
ADS1220_DATA_RATE_90SPS
ADS1220_DATA_RATE_175SPS
ADS1220_DATA_RATE_330SPS
ADS1220_DATA_RATE_600SPS
ADS1220_DATA_RATE_1000SPS
gainLevel:增益配置在不使用PGA的情况下可使用增益124.在这种情况下,通过开关电容结构获得增益)
ADS1220_GAIN_1
ADS1220_GAIN_2
ADS1220_GAIN_4
ADS1220_GAIN_8
ADS1220_GAIN_16
ADS1220_GAIN_32
ADS1220_GAIN_64
ADS1220_GAIN_128
pgaBypass:禁止/启用可编程增益放大器PGA
ADS1220_USE_PGA 启用
ADS1220_PGA_BYPASS 禁用
routeIDAC1:选择IDAC1将路由到的通道
ADS1220_IDAC1_DISABLED
ADS1220_IDAC1_AIN0
ADS1220_IDAC1_AIN1
ADS1220_IDAC1_AIN2
ADS1220_IDAC1_AIN3
ADS1220_IDAC1_REFP
ADS1220_IDAC1_REFN
routeIDAC2:选择IDAC2将路由到的通道
ADS1220_IDAC2_DISABLED
ADS1220_IDAC2_AIN0
ADS1220_IDAC2_AIN1
ADS1220_IDAC2_AIN2
ADS1220_IDAC2_AIN3
ADS1220_IDAC2_REFP
ADS1220_IDAC2_REFN
idacCurrent:IDAC电流设置
ADS1220_IDAC_CURRENT_OFF
ADS1220_IDAC_CURRENT_10_UA
ADS1220_IDAC_CURRENT_50_UA
ADS1220_IDAC_CURRENT_100_UA
ADS1220_IDAC_CURRENT_250_UA
ADS1220_IDAC_CURRENT_500_UA
ADS1220_IDAC_CURRENT_1000_UA
ADS1220_IDAC_CURRENT_1500_UA
selectVref:基准电压选择
ADS1220_VREF_INTERNAL 选择2.048V的内部基准电压(默认)
ADS1220_VREF_EXT_REF0_PINS 使用专用REFP0和REFN0输入选择的外部基准电压
ADS1220_VREF_EXT_REF1_PINS 使用AIN0/REFP1和AIN3/REFN1输入选择的外部基准电压
ADS1220_VREF_AVDD 做基准的模拟电源AVDD-AVSS
intTempSensor:温度传感器模式
0禁用 1启用
*/
//static void ads1220_init(void)
//{
// setup_ads1220(
// ADS1220_MUX_AIN0_AIN1, // 输入多路复用器配置
// ADS1220_OP_MODE_NORMAL, // 工作模式选择
// ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式
// ADS1220_DATA_RATE_45SPS, // 数据速率
// ADS1220_GAIN_1, // 增益配置
// ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器
// ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道
// ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道
// ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置
// ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择
// ADS1220_TEMP_SENSOR_OFF); // 温度传感器
//}
static void ads1220_reset(void)
{
uint8_t cmd = ADS1220_RESET_CMD;
spi_write_read(&cmd, RcvData, 1);
}
static void ads1220_start(void)
{
uint8_t cmd = ADS1220_START_CMD;
spi_write_read(&cmd, RcvData, 1);
}
//static void ads1220_powerdown(void)
//{
// uint8_t cmd = ADS1220_POWERDOWN_CMD;
// spi_write_read(&cmd, RcvData, 1);
//}
static void ads1220_get_conversion_data(float32 *conversionData)
{
uint8_t out_data[3] = {0xff, 0xff, 0xff};
uint8_t in_data[3] = {0};
long data = 0;
spi_write_read(out_data, in_data, 3);
data = (((long)in_data[0] << 16) + ((long)in_data[1] << 8) + (long)in_data[2]);
if (data & 0x800000)
{
data ^= 0x00FFFFFF;
data += 1;
}
*conversionData = (float32)data * 2.5f / 8388608;
}
//static void ads1220_get_rtd_conversion_data_calibrated(volatile long *code)
//{
// uint8_t outData[3] = {0xff, 0xff, 0xff};
// uint8_t tempData[3];
// spi_write_read(outData, tempData, 3);
// *code = (((long)tempData[0] << 16) + ((long)tempData[1] << 8) + (long)tempData[2]); // combine 3 Bytes of Conversion Data to 24 bit value
// if (*code & 0x800000) // check if result is negative
// {
// *code ^= 0x00FFFFFF; // invert and make
// *code += 1; // two's complement
// }
// *code = (long)((long long)(*code) * ADS1220RTDGainCorrection / 100000); // ADS1220 Gain correction
//}
void ads1220_operation(uint8_t channel, float32 *data_pv)
{
if (ads1220_spi_init_flag == FALSE)
{
ads1220_spi_init_flag = TRUE;
dac7811_spi_init_flag = FALSE;
fun_ads1220_spi1_init();
}
ads1220_cs(CS_L);
vTaskDelay(10);
if (channel == CH2_OUT_CUR)
{
ads1220_reset();
vTaskDelay(5);
setup_ads1220(
ADS1220_MUX_AIN2_AVSS, // 输入多路复用器配置
ADS1220_OP_MODE_NORMAL, // 工作模式选择
ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式
ADS1220_DATA_RATE_45SPS, // 数据速率
ADS1220_GAIN_1, // 增益配置
ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器
ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道
ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道
ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置
ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择
ADS1220_TEMP_SENSOR_OFF); // 温度传感器
vTaskDelay(5);
ads1220_start();
vTaskDelay(30);
ads1220_get_conversion_data(data_pv);
}
else if (channel == CH10_IN_TC)
{
ads1220_reset();
vTaskDelay(5);
setup_ads1220(
ADS1220_MUX_AIN0_AIN1, // 输入多路复用器配置
ADS1220_OP_MODE_NORMAL, // 工作模式选择
ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式
ADS1220_DATA_RATE_45SPS, // 数据速率
ADS1220_GAIN_1, // 增益配置
ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器
ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道
ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道
ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置
ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择
ADS1220_TEMP_SENSOR_OFF); // 温度传感器
vTaskDelay(5);
ads1220_start();
vTaskDelay(30);
ads1220_get_conversion_data(data_pv);
}
ads1220_cs(CS_H);
vTaskDelay(5);
}