通过ADS1256ReadVoltage或ADS1256ReadData函数读取ads1256的adc采样值

c
1
2
3
4
5
ADS1256_Init(ADS1256_GAIN_4);
ADS1256ReadVoltage(ADS1256_MUXP_AIN0|ADS1256_MUXN_AIN1); // 获取AIN0/AIN1构成的差分通道的差分电压数据

ADS1256ReadVoltage(ADS1256_MUXN_AIN2); // 获取AIN2通道的电压数据
ADS1256ReadVoltage(ADS1256_MUXN_AIN3); // 获取AIN3通道的电压数据

注意:如果使用ADS1256ReadData函数,请注意初始化时的增益值ADS1256_GAIN_x

你需要对ADS1256ReadData获取到的数据进行处理:
具体处理方式可以参考ADS1256ReadVoltage函数:

c
1
2
3
4
5
double ADS1256ReadVoltage(unsigned char channel) {
double voltage = ADS1256ReadData(channel)*(double)0.000000598;
voltage /= ADS1256_GAIN;
return voltage;
}

你可以调整采样率来获取更精准的电压值:

SPS越低,滤波越多,噪声越低,精度越高

SPS越高,数据更新越快,系统响应更及时

c
1
2
3
4
5
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_1000SPS);  // 数据1000sps
// 调整SPS后你需要调整SPI_WriteByte函数中的超时时间(下面的10):
// HAL_SPI_TransmitReceive(&hspi1, &TxData, &RxData, 1, 10);
// 你可以参考以下表格(表格数据来源于ADS1256数据手册第20页、第21页)

DATA RATE (SPS) CYCLING THROUGHPUT (1/t19) (Hz) SETTLING TIME (t18) (ms)
30,000 4374 0.21
15,000 3817 0.25
7500 3043 0.31
3750 2156 0.44
2000 1438 0.68
1000 837 1.1
500 456 2.18
100 98 10.18
60 59 16.84
50 50 20.18
30 30 33.51
25 25 40.18
15 15 66.84
10 10 100.18
5 5 200.18
2.5 2.5 400.18

ads1256.h

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#ifndef __ADS1256_H__
#define __ADS1256_H__

#include "stm32f4xx_hal.h"
#include <stdio.h>

#define ADC2V 0.000000598

// define commands
#define ADS1256_CMD_WAKEUP 0x00
#define ADS1256_CMD_RDATA 0x01
#define ADS1256_CMD_RDATAC 0x03
#define ADS1256_CMD_SDATAC 0x0f
#define ADS1256_CMD_RREG 0x10
#define ADS1256_CMD_WREG 0x50
#define ADS1256_CMD_SELFCAL 0xf0
#define ADS1256_CMD_SELFOCAL 0xf1
#define ADS1256_CMD_SELFGCAL 0xf2
#define ADS1256_CMD_SYSOCAL 0xf3
#define ADS1256_CMD_SYSGCAL 0xf4
#define ADS1256_CMD_SYNC 0xfc
#define ADS1256_CMD_STANDBY 0xfd
#define ADS1256_CMD_REST 0xfe

// define the ADS1256 register values
#define ADS1256_STATUS 0x00
#define ADS1256_MUX 0x01
#define ADS1256_ADCON 0x02
#define ADS1256_DRATE 0x03
#define ADS1256_IO 0x04
#define ADS1256_OFC0 0x05
#define ADS1256_OFC1 0x06
#define ADS1256_OFC2 0x07
#define ADS1256_FSC0 0x08
#define ADS1256_FSC1 0x09
#define ADS1256_FSC2 0x0A


// define multiplexer codes
#define ADS1256_MUXP_AIN0 0x00
#define ADS1256_MUXP_AIN1 0x10
#define ADS1256_MUXP_AIN2 0x20
#define ADS1256_MUXP_AIN3 0x30
#define ADS1256_MUXP_AIN4 0x40
#define ADS1256_MUXP_AIN5 0x50
#define ADS1256_MUXP_AIN6 0x60
#define ADS1256_MUXP_AIN7 0x70
#define ADS1256_MUXP_AINCOM 0x80

#define ADS1256_MUXN_AIN0 0x00
#define ADS1256_MUXN_AIN1 0x01
#define ADS1256_MUXN_AIN2 0x02
#define ADS1256_MUXN_AIN3 0x03
#define ADS1256_MUXN_AIN4 0x04
#define ADS1256_MUXN_AIN5 0x05
#define ADS1256_MUXN_AIN6 0x06
#define ADS1256_MUXN_AIN7 0x07
#define ADS1256_MUXN_AINCOM 0x08


// define gain codes
#define ADS1256_GAIN_1 0x00
#define ADS1256_GAIN_2 0x01
#define ADS1256_GAIN_4 0x02
#define ADS1256_GAIN_8 0x03
#define ADS1256_GAIN_16 0x04
#define ADS1256_GAIN_32 0x05
#define ADS1256_GAIN_64 0x06
//#define ADS1256_GAIN_64 0x07

//define drate codes
#define ADS1256_DRATE_30000SPS 0xF0
#define ADS1256_DRATE_15000SPS 0xE0
#define ADS1256_DRATE_7500SPS 0xD0
#define ADS1256_DRATE_3750SPS 0xC0
#define ADS1256_DRATE_2000SPS 0xB0
#define ADS1256_DRATE_1000SPS 0xA1
#define ADS1256_DRATE_500SPS 0x92
#define ADS1256_DRATE_100SPS 0x82
#define ADS1256_DRATE_60SPS 0x72
#define ADS1256_DRATE_50SPS 0x63
#define ADS1256_DRATE_30SPS 0x53
#define ADS1256_DRATE_25SPS 0x43
#define ADS1256_DRATE_15SPS 0x33
#define ADS1256_DRATE_10SPS 0x23
#define ADS1256_DRATE_5SPS 0x13
#define ADS1256_DRATE_2_5SPS 0x03

extern float ADS1256_GAIN;

void ADS1256_Init(uint8_t gain); //初始化ADS1256
int ADS1256ReadData(unsigned char channel);
double ADS1256ReadVoltage(unsigned char channel);

#endif

ads1256.C

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//***************************
// Pin assign
// STM32f407 ADS1256
// GPIOA_Pin_3 <--- DRDY
// GPIOA_Pin_1 ---> CS
// GPIOA_Pin_5 ---> SCK
// GPIOA_Pin_6(MISO) <--- DOUT
// GPIOA_Pin_7(MOSI) ---> DIN
//***************************

#include "ads1256.h"
#define ADS1256_GPIO GPIOA
#define ADS1256_DRDY GPIO_PIN_3
#define ADS1256_CS GPIO_PIN_1

extern SPI_HandleTypeDef hspi1;

//-----------------------------------------------------------------//
// 功 能: SPI通信
// 入口参数: / 发送的SPI数据
// 出口参数: / 接收的SPI数据
// 全局变量: /
// 备 注: 发送接收函数
//-----------------------------------------------------------------//
unsigned char SPI_WriteByte(unsigned char TxData)
{
unsigned char RxData=0;
HAL_SPI_TransmitReceive(&hspi1, &TxData, &RxData, 1, 10);
return RxData;
}

//-----------------------------------------------------------------//
// 功 能:ADS1256 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte) //ADS1256WREG(ADS1256_MUX,channel); //设置通道
{
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
// CS_0();
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1) {}
//当ADS1256_DRDY为低时才能写寄存器
//向寄存器写入数据地址
SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
//写入数据的个数n-1
SPI_WriteByte(0x00);
//向regaddr地址指向的寄存器写入数据databyte
SPI_WriteByte(databyte);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
}


//初始化ADS1256
float ADS1256_GAIN = 1.0f;
void ADS1256_Init(uint8_t gain) {
//*************自校准****************
// while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
// HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
// SPI_WriteByte(ADS1256_CMD_SELFCAL);
// while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
// HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
//**********************************

// ADS1256WREG(ADS1256_STATUS,0x06); // 高位在前、使用缓冲
ADS1256WREG(ADS1256_STATUS,0x04); // 高位在前、不使用缓冲

ADS1256WREG(ADS1256_MUX,0x08); // 初始化端口A0为‘+’,AINCOM位‘-’
if(gain == ADS1256_GAIN_1) ADS1256_GAIN = 1.0f; // 放大倍数1 ±5V
if(gain == ADS1256_GAIN_2) ADS1256_GAIN = 2.0f; // 放大倍数2 ±2.5V
if(gain == ADS1256_GAIN_4) ADS1256_GAIN = 4.0f; // 放大倍数4 ±1.25V
if(gain == ADS1256_GAIN_8) ADS1256_GAIN = 8.0f; // 放大倍数8 ±0.625V
if(gain == ADS1256_GAIN_16) ADS1256_GAIN = 16.0f; // 放大倍数16 ±0.3125V
if(gain == ADS1256_GAIN_32) ADS1256_GAIN = 32.0f; // 放大倍数32 ±0.15625V
if(gain == ADS1256_GAIN_64) ADS1256_GAIN = 64.0f; // 放大倍数64 ±0.078125V

ADS1256WREG(ADS1256_ADCON, gain); // 放大倍数8 ±0.625V


// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1); // 放大倍数1 ±5V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_4); // 放大倍数4 ±1.25V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_8); // 放大倍数8 ±0.625V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_16); // 放大倍数8 ±0.3125V
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_1000SPS); // 数据10sps
ADS1256WREG(ADS1256_IO,0x00);

//*************自校准****************
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_SELFCAL);
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
//**********************************
}

// 微秒级延迟(纯循环)
void delay_us(uint32_t us) {
us *= 40; // 校准值(需根据实际测试调整)
while (us--) {
__asm__ volatile ("nop"); // 插入空指令确保循环不被优化
}
}

// 毫秒级延迟(基于delay_us)
void delay_ms(uint32_t ms) {
while (ms--) {
delay_us(1000);
}
}
//读取AD值
unsigned char pre_channel = 0;
int ADS1256ReadData(unsigned char channel) {
unsigned int sum=0;
while(HAL_GPIO_ReadPin(ADS1256_GPIO,ADS1256_DRDY)==1);//当ADS1256_DRDY为低时才能写寄存器
if (pre_channel != channel) {
pre_channel = channel;
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
ADS1256WREG(ADS1256_MUX,channel); //设置通道
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);

HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_SYNC);
SPI_WriteByte(ADS1256_CMD_WAKEUP);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
while (HAL_GPIO_ReadPin(ADS1256_GPIO, ADS1256_DRDY) == 1);
}


HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_RDATA);
// HAL_Delay(1);
delay_us(10);

sum |= (SPI_WriteByte(0xff) << 16);
sum |= (SPI_WriteByte(0xff) << 8);
sum |= SPI_WriteByte(0xff);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);

if (sum>0x7FFFFF) // if MSB=1,
{
sum -= 0x1000000; // do 2's complement

}
return sum;
}


double ADS1256ReadVoltage(unsigned char channel) {
double voltage = ADS1256ReadData(channel)*(double)0.000000598;
voltage /= ADS1256_GAIN;
return voltage;
}