333 lines
10 KiB
C
333 lines
10 KiB
C
#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),并且仅可使用增益1,2,4)
|
||
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 占空比模式(内部占空比1:4)
|
||
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的情况下,可使用增益1,2,4.在这种情况下,通过开关电容结构获得增益)
|
||
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);
|
||
}
|