ADS1256.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #ifndef __ADS1256_H__
  2. #define __ADS1256_H__
  3. #include "stm32l4xx_hal.h"
  4. #include <stdint.h>
  5. #include <stdbool.h>
  6. // ========== 用户配置宏 ==========
  7. #define ADS1256_SPI_HANDLE hspi2
  8. extern SPI_HandleTypeDef ADS1256_SPI_HANDLE;
  9. #define SPI_TIMEOUT 200 // ms
  10. // 引脚配置
  11. #define ADS1256_CS_GPIO_PORT GPIOB
  12. #define ADS1256_CS_PIN GPIO_PIN_12
  13. #define ADS1256_DRDY_GPIO_PORT GPIOA
  14. #define ADS1256_DRDY_PIN GPIO_PIN_11
  15. #define ADS1256_RST_GPIO_PORT GPIOA
  16. #define ADS1256_RST_PIN GPIO_PIN_8
  17. // ========== 控制宏 ==========
  18. #define ADS1256_CS_LOW() HAL_GPIO_WritePin(ADS1256_CS_GPIO_PORT, ADS1256_CS_PIN, GPIO_PIN_RESET)
  19. #define ADS1256_CS_HIGH() HAL_GPIO_WritePin(ADS1256_CS_GPIO_PORT, ADS1256_CS_PIN, GPIO_PIN_SET)
  20. #define ADS1256_RST_LOW() HAL_GPIO_WritePin(ADS1256_RST_GPIO_PORT, ADS1256_RST_PIN, GPIO_PIN_RESET)
  21. #define ADS1256_RST_HIGH() HAL_GPIO_WritePin(ADS1256_RST_GPIO_PORT, ADS1256_RST_PIN, GPIO_PIN_SET)
  22. #define ADS1256_DRDY_READ() HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11)
  23. #define ADS1256_READ_DRDY ADS1256_DRDY_READ()
  24. // ========== 命令定义 ==========
  25. #define ADS1256_CMD_WAKEUP 0x00 // 从休眠模式唤醒(必须在 SYNC 后使用)退出待机模式
  26. #define ADS1256_CMD_RDATA 0x01 // 读取数据(一次性读取当前结果)
  27. #define ADS1256_CMD_RDATAC 0x03 // 启动连续数据读取模式
  28. #define ADS1256_CMD_SDATAC 0x0F // 停止连续数据读取模式
  29. #define ADS1256_CMD_RREG 0x10 // 读取寄存器命令(后跟寄存器地址和数量)
  30. #define ADS1256_CMD_WREG 0x50 // 写寄存器命令(后跟寄存器地址和数量)
  31. #define ADS1256_CMD_SELFCAL 0xF0 // 启动偏移和增益自动校准
  32. #define ADS1256_CMD_SELFOCAL 0xF1 // 偏移自校准(接 GND)
  33. #define ADS1256_CMD_SELFGCAL 0xF2 // 增益自校准(接参考电压)
  34. #define ADS1256_CMD_SYSOCAL 0xF3 // 系统偏移校准
  35. #define ADS1256_CMD_SYSGCAL 0xF4 // 系统增益校准
  36. #define ADS1256_CMD_SYNC 0xFC // 同步命令(等待转换)
  37. #define ADS1256_CMD_STANDBY 0xFD // 进入低功耗待机模式
  38. #define ADS1256_CMD_RESET 0xFE // 复位芯片
  39. // ========== 寄存器定义 ==========
  40. #define ADS1256_REG_STATUS 0x00 // 状态寄存器:时钟选择、自动校准、缓冲使能等
  41. #define ADS1256_REG_MUX 0x01 // 多路复用器设置:选择输入通道 AINp 和 AINn
  42. #define ADS1256_REG_ADCON 0x02 // A/D 控制寄存器:增益选择、时钟配置
  43. #define ADS1256_REG_DRATE 0x03 // 数据速率设置寄存器
  44. #define ADS1256_REG_IO 0x04 // 数字 I/O 控制寄存器
  45. #define ADS1256_REG_OFC0 0x05 // 偏移校准寄存器 OFC0(低字节)
  46. #define ADS1256_REG_OFC1 0x06 // 偏移校准寄存器 OFC1
  47. #define ADS1256_REG_OFC2 0x07 // 偏移校准寄存器 OFC2(高字节)
  48. #define ADS1256_REG_FSC0 0x08 // 全量程校准寄存器 FSC0(低字节)
  49. #define ADS1256_REG_FSC1 0x09 // 全量程校准寄存器 FSC1
  50. #define ADS1256_REG_FSC2 0x0A // 全量程校准寄存器 FSC2(高字节)
  51. // ========== 单端输入通道配置 (AINx - AINCOM) ==========
  52. #define ADS1256_MUX_AIN0_AINCOM 0x08 // AIN0 - AINCOM
  53. #define ADS1256_MUX_AIN1_AINCOM 0x18 // AIN1 - AINCOM
  54. #define ADS1256_MUX_AIN2_AINCOM 0x28 // AIN2 - AINCOM
  55. #define ADS1256_MUX_AIN3_AINCOM 0x38 // AIN3 - AINCOM
  56. #define ADS1256_MUX_AIN4_AINCOM 0x48 // AIN4 - AINCOM
  57. #define ADS1256_MUX_AIN5_AINCOM 0x58 // AIN5 - AINCOM
  58. #define ADS1256_MUX_AIN6_AINCOM 0x68 // AIN6 - AINCOM
  59. #define ADS1256_MUX_AIN7_AINCOM 0x78 // AIN7 - AINCOM
  60. // ========== 差分输入通道配置 (AINp - AINn) ==========
  61. #define ADS1256_MUX_AIN0_AIN1 0x01 // AIN0 - AIN1
  62. #define ADS1256_MUX_AIN2_AIN3 0x23 // AIN2 - AIN3
  63. #define ADS1256_MUX_AIN4_AIN5 0x45 // AIN4 - AIN5
  64. #define ADS1256_MUX_AIN6_AIN7 0x67 // AIN6 - AIN7
  65. // ========== 增益配置 ==========
  66. typedef enum {
  67. ADS1256_GAIN_1 = 0, // 增益 x1(默认)
  68. ADS1256_GAIN_2 = 1, // 增益 x2
  69. ADS1256_GAIN_4 = 2, // 增益 x4
  70. ADS1256_GAIN_8 = 3, // 增益 x8
  71. ADS1256_GAIN_16 = 4, // 增益 x16
  72. ADS1256_GAIN_32 = 5, // 增益 x32
  73. ADS1256_GAIN_64 = 6 // 增益 x64(最大)
  74. } ADS1256_Gain_t;
  75. /*
  76. ADCON 寄存器值
  77. 位 名称 描述
  78. 7 0 保留位,必须写 0
  79. 6-5 CLKOUT 时钟输出频率
  80. 00: 禁用
  81. 01: fCLKIN / 2
  82. 10: fCLKIN / 4
  83. 11: fCLKIN
  84. 4-3 SDCS Sensor Detect Current Source
  85. 建议默认写 0
  86. 2-0 PGA 增益设置:
  87. 000: 1x
  88. 001: 2x
  89. 010: 4x
  90. 011: 8x
  91. 100: 16x
  92. 101: 32x
  93. 110: 64x
  94. 111: 64x
  95. */
  96. // ========== 数据速率 ==========
  97. typedef enum {
  98. ADS1256_DR_30000SPS = 0xF0, // 30000 采样/秒
  99. ADS1256_DR_15000SPS = 0xE0, // 15000
  100. ADS1256_DR_7500SPS = 0xD0, // 7500
  101. ADS1256_DR_3750SPS = 0xC0, // 3750
  102. ADS1256_DR_2000SPS = 0xB0, // 2000
  103. ADS1256_DR_1000SPS = 0xA1, // 1000(推荐默认)
  104. ADS1256_DR_500SPS = 0x92, // 500
  105. ADS1256_DR_100SPS = 0x82, // 100
  106. ADS1256_DR_60SPS = 0x72, // 60
  107. ADS1256_DR_50SPS = 0x63, // 50
  108. ADS1256_DR_30SPS = 0x53, // 30
  109. ADS1256_DR_25SPS = 0x43, // 25
  110. ADS1256_DR_15SPS = 0x33, // 15
  111. ADS1256_DR_10SPS = 0x23, // 10
  112. ADS1256_DR_5SPS = 0x13, // 5
  113. ADS1256_DR_2_5SPS = 0x03 // 2.5(最低速)
  114. } ADS1256_DataRate_t;
  115. // ========== 函数声明 ==========
  116. // 初始化 ADS1256
  117. void ADS1256_Init(void);
  118. // 复位
  119. void ADS1256_Reset(void);
  120. // 读取芯片 ID(高 4 位)
  121. uint8_t ADS1256_ReadID(void);
  122. // 设置输入通道(MUX 寄存器值)
  123. void ADS1256_SetChannel(uint8_t mux);
  124. // 设置增益
  125. void ADS1256_SetGain(ADS1256_Gain_t gain);
  126. // 设置采样率
  127. void ADS1256_SetDataRate(ADS1256_DataRate_t dr);
  128. // 启动一次转换
  129. void ADS1256_StartConversion(void);
  130. // 读取数据(需判断 DRDY 是否为低)
  131. bool ADS1256_ReadData(int32_t* out);
  132. // 寄存器读取出来的整数转为浮点数电压值
  133. float ADS1256_ConvertToVoltage(int32_t raw, float vref, int gain);
  134. // 寄存器操作
  135. uint8_t ADS1256_ReadRegister(uint8_t reg);
  136. void ADS1256_WriteRegister(uint8_t reg, uint8_t value);
  137. void ADS1256_SendCommand(uint8_t cmd);
  138. void ADS1256_SetClockSource(uint8_t useInternal);
  139. bool ADS1256_IsUsingExternalClock(void);
  140. #endif // __ADS1256_H__