ADS1256tb.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "ADS1256tb.h"
  2. #include "main.h"
  3. #include "cmsis_os.h"
  4. /**
  5. ******************************************************************************
  6. * @file ADS1256.c
  7. ******************************************************************************
  8. * @attention
  9. * ADS1256模块
  10. * +5V <------ 5.0V 5V供电
  11. * GND ------- GND 地
  12. * DRDY ------> PA11 准备就绪 低准备好 高未准备好
  13. * CS <------ PB12 SPI_CS 低有效,操作完拉高
  14. * DIN <------ PB15 SPI_MOSI
  15. * DOUT ------> PB14 SPI_MISO
  16. * SCLK <------ PB13 SPI时钟
  17. * GND ------- GND 地
  18. * PDWN <------ VDD 掉电控制 常高
  19. * RST <------ PA8 复位信号 常高,拉低再拉高生效复位
  20. *
  21. * ADS1256基本特性:
  22. * 1、模拟部分供电5V;
  23. * 2、SPI数字接口电平:3.3V
  24. * 3、PGA设置范围: 1、2、4、8、16、32、64、
  25. * 4、参考电压2.5V (推荐缺省的,外置的)
  26. * 5、输入电压范围:PGA = 1 时, 可输入正负5V
  27. * 6. 自动校准 (当设置了PGA,BUF使能、数据采样率时,会启动自校准)
  28. * 7. 输入的缓冲器可设置启用和关闭(一般选启用)
  29. * 外部晶振频率 = 7.68MHz,
  30. * 时钟频率 tCLK = 1/7.68M = 0.13uS
  31. * 输出数据周期 tDATA = 1 / 30K = 0.033mS (按30Ksps计算)
  32. * 对SPI的时钟速度要求: (ads1256.pdf page 6)
  33. * 最快 4个tCLK = 0.52uS
  34. * 最慢 10个tDATA = 0.3mS (按 30Ksps 计算)
  35. * SCL高电平和低电平持续时间最小 200ns
  36. * RREG, WREG, RDATA 命令之后,需要延迟 4 * tCLK = 0.52uS;
  37. * RDATAC, RESET, SYNC 命令之后,需要延迟 24 * tCLK = 3.12uS;
  38. * 实际测试,在3.3V上电后, 及时不做任何配置,ADS125的DRDY 口线即开始输出脉冲信号(2.6us高,33.4低,频率30KHz)
  39. * (AVSS + 0.05V) ~ (AVDD – 1.5V) 如果AVSS = 0V,AVDD = 5.0V,则最大输入电压 = 5.0 - 1.5 = 3.5V,所以输入范围为0.05-3.5V
  40. * 可尝试关闭输入缓冲器,
  41. ******************************************************************************
  42. */
  43. static SPI_HandleTypeDef *ads_spi;
  44. static void ADS_Delay_us(uint16_t us)
  45. {
  46. uint32_t delay = us * (SystemCoreClock / 1000000 / 5);
  47. while (delay--) __NOP();
  48. }
  49. static void ADS1256_SendCmd(uint8_t cmd)
  50. {
  51. ADS1256_CS_LOW();
  52. HAL_SPI_Transmit(ads_spi, &cmd, 1, 10);
  53. ADS_Delay_us(5);
  54. ADS1256_CS_HIGH();
  55. ADS_Delay_us(2);
  56. }
  57. static void ADS1256_WriteReg(uint8_t reg, uint8_t val)
  58. {
  59. uint8_t buf[3] = { CMD_WREG | (reg & 0x0F), 0x00, val };
  60. ADS1256_CS_LOW();
  61. HAL_SPI_Transmit(ads_spi, buf, 3, 10);
  62. ADS_Delay_us(5);
  63. ADS1256_CS_HIGH();
  64. }
  65. //static uint8_t ADS1256_ReadReg(uint8_t reg)
  66. //{
  67. // uint8_t cmd[2] = { CMD_RREG | (reg & 0x0F), 0x00 };
  68. // uint8_t val;
  69. // ADS1256_CS_LOW();
  70. // HAL_SPI_Transmit(ads_spi, cmd, 2, 10);
  71. // ADS_Delay_us(2);
  72. // HAL_SPI_Receive(ads_spi, &val, 1, 10);
  73. // ADS1256_CS_HIGH();
  74. // return val;
  75. //}
  76. void ADS1256_Init(SPI_HandleTypeDef *hspi)
  77. {
  78. ads_spi = hspi;
  79. ADS1256_CS_HIGH();
  80. osDelay(5);
  81. ADS1256_SendCmd(CMD_RESET);
  82. osDelay(5);
  83. ADS1256_SendCmd(CMD_SDATAC); // Stop continuous mode
  84. ADS1256_WriteReg(REG_STATUS, 0x06); // Auto-cal, MSB first 开启缓冲器
  85. // 启用缓冲器的好处是输入阻抗更高、稳定性更强,但代价是 可输入范围缩窄(不能接近 AVDD)
  86. // ADS1256_WriteReg(REG_STATUS, 0x02); // 关闭输入缓冲器 ,缺少了滤波 输出偏差变大
  87. ADS1256_WriteReg(REG_ADCON, 0x00 | GAIN_1);
  88. ADS1256_WriteReg(REG_DRATE, DRATE_1000SPS); // 数据率
  89. ADS1256_SendCmd(CMD_SELFCAL); // Self-calibrate
  90. osDelay(10);
  91. }
  92. void ADS1256_SetChannel(uint8_t mux_pos)
  93. {
  94. while (ADS1256_DRDY_Read() == GPIO_PIN_SET);
  95. ADS1256_WriteReg(REG_MUX, mux_pos | MUX_AINCOM);
  96. // ADS1256_WriteReg(REG_MUX, mux_pos);
  97. ADS1256_SendCmd(CMD_SYNC);
  98. ADS1256_SendCmd(CMD_WAKEUP);
  99. }
  100. int32_t ADS1256_ReadChannel(uint8_t channel)
  101. {
  102. ADS1256_SetChannel(channel << 4); // AINx = channel
  103. while (ADS1256_DRDY_Read() == GPIO_PIN_SET); // 等待DRDY拉低
  104. ADS1256_CS_LOW();
  105. uint8_t cmd = CMD_RDATA;
  106. HAL_SPI_Transmit(ads_spi, &cmd, 1, 10);
  107. ADS_Delay_us(10);
  108. ADS_Delay_us(10);
  109. uint8_t buf[3];
  110. HAL_SPI_Receive(ads_spi, buf, 3, 10);
  111. ADS1256_CS_HIGH();
  112. int32_t raw = (buf[0] << 16) | (buf[1] << 8) | buf[2];
  113. if (raw & 0x800000) raw |= 0xFF000000; // 符号扩展
  114. return raw;
  115. }
  116. int32_t ADS1256_Readdata(void)
  117. {
  118. while (ADS1256_DRDY_Read() == GPIO_PIN_SET); // 等待DRDY拉低
  119. ADS1256_CS_LOW();
  120. uint8_t cmd = CMD_RDATA;
  121. HAL_SPI_Transmit(ads_spi, &cmd, 1, 10);
  122. ADS_Delay_us(10);
  123. ADS_Delay_us(10);
  124. uint8_t buf[3];
  125. HAL_SPI_Receive(ads_spi, buf, 3, 10);
  126. ADS1256_CS_HIGH();
  127. int32_t raw = (buf[0] << 16) | (buf[1] << 8) | buf[2];
  128. if (raw & 0x800000) raw |= 0xFF000000; // 符号扩展
  129. return raw;
  130. }
  131. float ADS1256_ConvertToVoltage(int32_t adc_val, float vref, uint8_t gain)
  132. {
  133. // return ((float)adc_val / 0x7FFFFF) * vref / gain *2;
  134. return ((float)adc_val / 0x400000) * vref / gain;
  135. }