STM32 ADS1263高精度采集

1.简介

ads1263是一款32位高精度,高分辨数模转换器,还能达到38.4ksps。此外还有一个24位的辅助 Δ- Σ ADC , 适用于后台测量。

2.进行cubemx配置,最大速率为8MHz,SPI模式为1

3.驱动代码

ADS1263.c

void ADS1263_Write_Register(uint8_t Register_Address, uint8_t Data_Byte)

{

HAL_StatusTypeDef ret;

ADS1220_SPI_NSS_ENABLE();


uint8_t SPI_Transmit_Data[3];

SPI_Transmit_Data[0] = 0x40 | (Register_Address); //发送寄存器地址

SPI_Transmit_Data[1] = 0x00; //发送需要更改的寄存器数量

SPI_Transmit_Data[2] = Data_Byte; //发送要写入寄存器的值

ret = HAL_SPI_Transmit(&hspi2, SPI_Transmit_Data, 3, HAL_MAX_DELAY);

ADS1220_SPI_NSS_DISABLE();



}

/*************************************************************************************************

* 函 数 名: ADS1263_RREG

* 入口参数: Register_Address寄存器地址

* 返回值:读取到的寄存器的值

* 函数功能: 对寄存器读出数据

* 说 明: 无

*************************************************************************************************/

uint8_t ADS1263_Read_Register(uint8_t Register_Address)

{

HAL_StatusTypeDef ret;

ADS1220_SPI_NSS_ENABLE();

uint8_t SPI_Transmit_Data[3] = { 0 };

uint8_t SPI_Receive_Data[3] = { 0xff };

SPI_Transmit_Data[0] = 0x20 | (Register_Address);

SPI_Transmit_Data[1] = 0x00;

ret = HAL_SPI_Transmit(&ADS_SPI_HANDLE, SPI_Transmit_Data, 2, 0xffff);

ret = HAL_SPI_Receive(&ADS_SPI_HANDLE, SPI_Receive_Data, 3, 2000);

ADS1220_SPI_NSS_DISABLE();

return SPI_Receive_Data[0]; //返回读出的数据

}

/*************************************************************************************************

* 函 数 名: ADS1263_Conveision_Start_ADC1

* 入口参数: 无

* 返回值:无

* 函数功能: 启动ADC1的转换

* 说 明: 无

*************************************************************************************************/

void ADS1263_Conveision_Start_ADC1()

{

ADS1220_SPI_NSS_ENABLE();

uint8_t SPI_Transmit_Data[1];

SPI_Transmit_Data[0] = ADS1263_CMD_START_ADC1; //发送ADC1开始转换数据命令

HAL_SPI_Transmit(&hspi2, SPI_Transmit_Data, 1, HAL_MAX_DELAY);

ADS1220_SPI_NSS_DISABLE();

}

/*************************************************************************************************

* 函 数 名: ADS1263_Conveision_Start_ADC2

* 入口参数: 无

* 返回值:无

* 函数功能: 启动ADC2的转换

* 说 明: 无

*************************************************************************************************/

void ADS1263_Conveision_Start_ADC2()

{

ADS1220_SPI_NSS_ENABLE();

uint8_t SPI_Transmit_Data[1];

SPI_Transmit_Data[0] = ADS1263_CMD_START_ADC2; //发送ADC2开始转换数据命令

HAL_SPI_Transmit(&hspi2, SPI_Transmit_Data, 1, HAL_MAX_DELAY);

ADS1220_SPI_NSS_DISABLE();

}



void ADS1263_Conveision_Stop_ADC1()

{

ADS1220_SPI_NSS_ENABLE();

uint8_t SPI_Transmit_Data[1];

SPI_Transmit_Data[0] = ADS1263_CMD_STOP_ADC1; //发送ADC2开始转换数据命令

HAL_SPI_Transmit(&hspi2, SPI_Transmit_Data, 1, HAL_MAX_DELAY);

ADS1220_SPI_NSS_DISABLE();

}

/*************************************************************************************************

* 函 数 名: ADS1263_Config_Init

* 入口参数: 无

* 返回值:无

* 函数功能: ADS1263寄存器配置初始化

* 说 明: 请根据不同的应用场景更改函数内容

*************************************************************************************************/

uint8_t ADS1263_Init()

{

uint8_t write[11];

uint8_t id = 0;

uint8_t ret1 = 1;

uint8_t a = 0;

#if 1

// //通用配置

ADS1263_Write_Register(0x01, 0x11); //

ADS1263_Write_Register(ADS1263_INTERFACE, 0x05); //打开状态字节,关闭冗余校验

ADS1263_Write_Register(ADS1263_Mode_0, 0x10);//00 //开启输入切割模式(采集精度更高),进入连续转换模式 //10

ADS1263_Write_Register(ADS1263_Mode_1, 0x60);//60 //使用SINC4滤波器,不同滤波器下的采样噪声会不同

ADS1263_Write_Register(ADS1263_Mode_2, 0x51); //PGA被旁路(否则转换数据值会偏小),数据速率5SPS 0x50 20sps

#endif

ADS1263_Write_Register(0x0d, 0x11); //

ADS1263_Write_Register(0x0e, 0x06); //idac2 idac2

//ADC1配置

ADS1263_Write_Register(0x0f, 0x1b); //0x00使用内部基准0x1b

ADS1263_Write_Register(0x06, 0x23); //AIN2正极输入,AIN3负极输入23 bb

//ADC2配置

ADS1263_Write_Register(ADS1263_ADC2_CONFIGURATION, 0x00); //ADC2数据速率10SPS,使用内部基准,PGA=1

ADS1263_Write_Register(ADS1263_MUX_ADC2, 0xff); //AIN1正极输入,AINCOM负极输入



write[0] = ADS1263_Read_Register(ADS1263_INTERFACE);

write[1] = ADS1263_Read_Register(ADS1263_Mode_0);

write[2] = ADS1263_Read_Register(ADS1263_Mode_1);

write[3] = ADS1263_Read_Register(ADS1263_Mode_2);

write[4] = ADS1263_Read_Register(0x0d);

write[5] = ADS1263_Read_Register(0x0e);

write[6] = ADS1263_Read_Register(ADS1263_REFMUX);

write[7] = ADS1263_Read_Register(0x06);

write[8] = ADS1263_Read_Register(ADS1263_ADC2_CONFIGURATION);

write[9] = ADS1263_Read_Register(ADS1263_MUX_ADC2);

id = ADS1263_Read_Register(0x00); //read id

if (id == 0x23)

{

ret1 = 0;

}


// //启动转换

ADS1263_Conveision_Start_ADC1(); //启动ADC(连续转换模式下,只启动一次)

return ret1;

}

/*************************************************************************************************

* 函 数 名: ADS1263_ReadData_ADC1

* 入口参数: 无

* 返回值:无

* 函数功能: 读取ADC1的转换数据

* 说 明:以阻塞方式读取一个通道的数据,读取通道在ADS1263_Config_Init函数内部更改

*************************************************************************************************/

uint32_t ADS1263_ReadData_ADC1(float *res, double *res1)

{

HAL_StatusTypeDef ret;

uint32_t Conveision_Data;

uint8_t write[10] = { 0 };

uint8_t read[12] = { 0 };

uint8_t sumcrc = 0;

write[0] = ADS1263_CMD_RDATA_ADC1;

ADS1220_SPI_NSS_ENABLE();

ret = HAL_SPI_Transmit(&ADS_SPI_HANDLE, write, 1, 0xffff);

ret = HAL_SPI_Receive(&ADS_SPI_HANDLE, read, 6, 0xffff);

if (ret != HAL_OK)

{

return HAL_ERROR;

}

ADS1220_SPI_NSS_DISABLE();

// HAL_UART_Transmit(&huart2, read, 8, 0xffff);

sumcrc = read[1] + read[2] + read[3] + read[4] + 0x9b;

if (sumcrc != read[5])

{

return HAL_ERROR;

}

if ((read[0] & 0x40) >> 6 == 1)//

{

if (read[0] & 0x1e)

{

return HAL_ERROR;

}

Conveision_Data = (read[1] << 24) | (read[2] << 16) | (read[3] << 8)

| (read[4] << 0); //读取到的6字节数据的低4位拼凑成转换数据

}

else

{

if ((read[0] == 0x01)&&(sumcrc!=0x9b)) //un_update

{

return 0;

}

else

{

return HAL_ERROR;

}
}

return HAL_OK;

}

ADS1263.h


#include <stdbool.h>
#include "main.h"
#include "stm32l1xx_hal.h"



/*******寄存器地址列表************/
#define ADS1263_MUX_ADC1       0x06
#define ADS1263_MUX_ADC2       0x16
#define ADS1263_INTERFACE 0x02
#define ADS1263_Mode_0     0x03
#define ADS1263_Mode_1     0x04
#define ADS1263_Mode_2  0x05
#define ADS1263_REFMUX  0x0F
#define ADS1263_GPIO_Connection 0x12
#define ADS1263_GPIO_Direction  0x13
#define ADS1263_GPIO_Data       0x14
#define ADS1263_TDACP_CONTROL 0x10
#define ADS1263_TDACN_CONTROL 0x11
#define ADS1263_ADC2_CONFIGURATION 0x15
#define ADS1263_IDACMUX    0x0D
#define ADS1263_IDACMAG    0x0E

/************************指令************************/
#define ADS1263_CMD_NOP         0x00
#define ADS1263_CMD_RESET       0x06
#define ADS1263_CMD_RDATA_ADC1  0x12
#define ADS1263_CMD_RDATA_ADC2  0x14
#define ADS1263_CMD_START_ADC1  0x08
#define ADS1263_CMD_START_ADC2  0x0C
#define ADS1263_CMD_STOP_ADC1   0x0A
#define ADS1263_CMD_STOP_ADC2   0x0E
#define ADS1263_CMD_SYOCAL_ADC1 0x16
#define ADS1263_CMD_SYGCAL_ADC1 0x17
#define ADS1263_CMD_SFOCAL_ADC1 0x19
#define ADS1263_CMD_SYOCAL_ADC2 0x1B
#define ADS1263_CMD_SYGCAL_ADC2 0x1C
#define ADS1263_CMD_SFOCAL_ADC2 0x1E

void ADS1263_Conveision_Start_ADC1();
void ADS1263_Conveision_Stop_ADC1();
uint8_t ADS1263_Init();
uint32_t ADS1263_ReadData_ADC1(float *res,double *res1);
float ads1263_getValue(float data);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值