通讯
ADS1256作为从机,使用主机进行双向通讯。CubeMX配置SPI如下:
除此之外,还需要将DRDY引脚接入单片机一个支持外部中断的引脚,配置为下降沿触发即可。在本例中,为了便于展示,是在主循环中轮询DRDY引脚来实现的,在实际应用中建议利用外部中断进行。
输入引脚
ADS1256虽然有AIN0~AIN7、AINCOM九个模拟输入引脚,但它实际上是一个单通道ADC,只不过可以在9个引脚中,任意配置一个输入引脚为P,任意配置一个输入引脚为N,作为一组差分输入。
有两种典型用法:
- AIN0~AIN7作为八个输入端,AINCOM作为公共输入端,构成8通道ADC
- 将AINCOM接模拟地,AIN0~AIN7八个引脚两两配对,构成4通道ADC
因此,ADS1256像是一个单刀多置开关,每次只能接入一路差分信号进行AD转换,如果要切换到其他路差分信号,则需要通过配置MUX寄存器将单刀多置开关“扳”到下一个通道上。如何“扳”,参考数据手册:
当一个DRDY下降沿到来时,表示ADS1256已经完成一次转换,此时需要做:
- 写MUX寄存器,将其配置成你下一个需要读的通道;
- 依次发送同步命令(SYNC)、唤醒命令(WAKEUP);
- 发送单次读命令(RDATA);
- 读24位AD采集数据,注意,该数据是你上一次所配置通道的AD值,而不是你刚刚在第(1)条中配置的通道。
输入范围
ADS1256的差分输入(AINP-AINN)范围为2倍的参考电压。如果配置了增益不为1(ADCON寄存器),则是2倍的参考电压/增益。
单端输入(AIN0~AIN7、AINCOM)范围为AGND至AVDD。如果打开了缓冲(STATUS寄存器),单端输入的最大值会损失2V,即范围为AGND至AVDD-2V。
示例代码
本示例代码基于CubeMX@Hal库
ads1256.h
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#ifndef __ADS1256_H_ #define __ADS1256_H_ #include "stm32f1xx_hal.h" #define AD2_DRDY HAL_GPIO_ReadPin(AD2_DRDY_GPIO_Port, AD2_DRDY_Pin) // 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 long double ADS1256ReadData(uint8_t channel); void ADS1256_Init(void); #endif
ads1256.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#include "ADS1256.h" #include "spi.h" unsigned int sum; long ulResult; long double ldVolutage; void delay_us(uint32_t udelay) { uint32_t Delay = udelay * 72/4; do { __NOP(); } while (Delay --); } //写ADS1256的寄存器 void ADS1256WREG(unsigned char regaddr,unsigned char databyte) { unsigned char cmd; while(AD2_DRDY);//当AD2_DRDY为低时才能写寄存器 //向寄存器写入数据地址 cmd = ADS1256_CMD_WREG|(regaddr & 0x0F); HAL_SPI_Transmit(&hspi1, &cmd, 1, 10); //写入数据的个数n-1 cmd = 0x00; HAL_SPI_Transmit(&hspi1, &cmd, 1, 10); //向regaddr地址指向的寄存器写入数据databyte HAL_SPI_Transmit(&hspi1, &databyte, 1, 10); } //初始化ADS1256 void ADS1256_Init(void) { ADS1256WREG(ADS1256_STATUS,0x00);//高位在前、禁用自校准、禁用缓冲 ADS1256WREG(ADS1256_ADCON,0x00);// 放大倍数1 ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_5SPS);// 数据5sps ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);// 初始化端口A0为‘+’,AINCOM位‘-’ } //读取AD值 long double ADS1256ReadData(uint8_t channel) { unsigned char data1,data2,data3; unsigned char cmd; while(AD2_DRDY); //切换通道 //注意:本次写入的新通道在下次读取时才会生效,本次读到的是上一次的值 switch(channel) { case 0: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM); break; case 1: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN1 | ADS1256_MUXN_AINCOM); break; case 2: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN2 | ADS1256_MUXN_AINCOM); break; case 3: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN3 | ADS1256_MUXN_AINCOM); break; case 4: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN4 | ADS1256_MUXN_AINCOM); break; case 5: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN5 | ADS1256_MUXN_AINCOM); break; case 6: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN6 | ADS1256_MUXN_AINCOM); break; case 7: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN7 | ADS1256_MUXN_AINCOM); break; } cmd = ADS1256_CMD_SYNC; HAL_SPI_Transmit(&hspi1, &cmd, 1, 10); cmd = ADS1256_CMD_WAKEUP; HAL_SPI_Transmit(&hspi1, &cmd, 1, 10); //发送单次读命令 cmd = ADS1256_CMD_RDATA; HAL_SPI_Transmit(&hspi1, &cmd, 1, 10); //读24位数据 HAL_SPI_Receive(&hspi1, &data1, 1, 10); HAL_SPI_Receive(&hspi1, &data2, 1, 10); HAL_SPI_Receive(&hspi1, &data3, 1, 10); sum = (unsigned int)(data1<<16)|(data2<<8)|data3; //单位转换为mV (VREF=2.5V) ulResult = sum; if(ulResult & 0x800000) { ulResult = ~(unsigned long)ulResult; ulResult &= 0x7fffff; ulResult += 1; ulResult = -ulResult; ldVolutage = (long double)ulResult*0.000596046518808; } else ldVolutage = (long double)ulResult*0.000596046518808; return ldVolutage; }
main.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
32void main() { /* * 其他代码略 */ ADS1256_Init(); while (1) { /* * 其他代码略 */ AD_value0 = ADS1256ReadData(1); AD_value1 = ADS1256ReadData(2); AD_value2 = ADS1256ReadData(3); AD_value3 = ADS1256ReadData(4); AD_value4 = ADS1256ReadData(5); AD_value5 = ADS1256ReadData(6); AD_value6 = ADS1256ReadData(7); AD_value7 = ADS1256ReadData(0); } } AD_value1 = ADS1256ReadData(1); AD_value1 = ADS1256ReadData(2); AD_value2 = ADS1256ReadData(3); AD_value3 = ADS1256ReadData(4); AD_value4 = ADS1256ReadData(5); AD_value5 = ADS1256ReadData(6); AD_value6 = ADS1256ReadData(7); AD_value7 = ADS1256ReadData(0); } }
本文配套完整工程下载链接:https://download.csdn.net/download/yul13579/53380890
最后
以上就是单纯冷风最近收集整理的关于ads1256 + STM32 + CubeMX 软件开发备忘通讯输入引脚输入范围示例代码的全部内容,更多相关ads1256内容请搜索靠谱客的其他文章。
发表评论 取消回复