[其他ST产品] STM32驱动ADS1256串口输出-AD转换

[复制链接]
2944|34
 楼主| 怎么总是重复啊 发表于 2023-7-31 12:56 | 显示全部楼层 |阅读模式
ADS1256 2395164c73edee4205.png

7682764c73ee7bd5b4.png

ADS1256简介
ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编程增益放大器等,芯片本身可以测量0-5v的信号,高电压采集可以通过把信号分压成0-5v的范围内再给模块输入,所以ADS1256可以采集市面上大多数的标准电压信号。

芯片特点
  • 8通道输入
  • 可采集单端信号与差分信号
  • 最高30KSPS的采样率
  • 4个可编程I/O
  • 0-5V信号输入


 楼主| 怎么总是重复啊 发表于 2023-7-31 12:57 | 显示全部楼层
引脚说明
这个引脚说明关联本文开头的图片里的两个模块

9836664c73f383788d.png
 楼主| 怎么总是重复啊 发表于 2023-7-31 12:57 | 显示全部楼层
模块相关寄存器与命令
ADS1256一共有11个寄存器,可以通过配置相应的寄存器实现数据输出位的顺序、是否自校准、是适用缓冲器、单端/差分、采样率等的配置。每一个寄存器具体的作用这里不展开详细说明,可自行参考ADS1256的数据手册
1084864c73f5270e1d.png
 楼主| 怎么总是重复啊 发表于 2023-7-31 12:58 | 显示全部楼层
命令表,其中包含了读/写数据、校准、复位等指令。
945664c73f69343c9.png
 楼主| 怎么总是重复啊 发表于 2023-7-31 12:58 | 显示全部楼层
芯片的SPI通讯时序可参考这个这个时序图和下面的时序特性说明。

4492964c73f8230dcb.png
 楼主| 怎么总是重复啊 发表于 2023-7-31 12:58 | 显示全部楼层
注意通信时, CS 必须保持为低电平。

4352664c73f926df82.png
 楼主| 怎么总是重复啊 发表于 2023-7-31 13:20 | 显示全部楼层
相关程序
初始化
SPI初始化
  1. void SPI2_Init(void)
  2. {
  3. SPI_InitTypeDef  SPI_InitStructure;
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. /****Initial SPI2******************/

  6. /* Enable SPI2 and GPIOB clocks */
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  8. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  9. /* Configure SPI2 pins: NSS, SCK, MISO and MOSI */
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  13. GPIO_Init(GPIOB, &GPIO_InitStructure);

  14.   /* SPI2 configuration */
  15. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI1设置为两线全双工
  16. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                    //设置SPI2为主模式
  17. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收8位帧结构
  18. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                   //串行时钟在不操作时,时钟为低电平
  19. SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                 //第一个时钟沿开始采样数据
  20. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                  //NSS信号由软件(使用SSI位)管理
  21. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为8
  22. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       //数据传输从MSB位开始
  23. SPI_InitStructure.SPI_CRCPolynomial = 7;         //CRC值计算的多项式
  24. SPI_Init(SPI2, &SPI_InitStructure);
  25. /* Enable SPI2  */
  26. SPI_Cmd(SPI2, ENABLE);  
  27. }
 楼主| 怎么总是重复啊 发表于 2023-7-31 13:20 | 显示全部楼层
ADS1256初始化,给芯片做自校准并且设置芯片的参数(采样率、数据位顺序、放大倍数等)
  1. void ADS1256_Init(void)
  2. {

  3.         ADS1256WREG(ADS1256_STATUS,0x06);               // 高位在前、使用缓冲
  4.         ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1);                // 放大倍数1
  5.         ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS);  // 数据10sps
  6.         ADS1256WREG(ADS1256_IO,0x00);  
  7.                      
  8.         //**自校准**//
  9.         while(ADS1256_DRDY);
  10.         CS_0();
  11.         SPI_WriteByte(ADS1256_CMD_SELFCAL);
  12.         while(ADS1256_DRDY);
  13.         CS_1();
  14.        
  15. }
 楼主| 怎么总是重复啊 发表于 2023-7-31 13:21 | 显示全部楼层
读取某个通道的AD值
  1. signed int ADS1256ReadData(unsigned char channel)  
  2. {

  3.     unsigned int sum=0;
  4.        
  5.         while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器
  6.         ADS1256WREG(ADS1256_MUX,channel);                //设置通道
  7.         CS_0();
  8.         SPI_WriteByte(ADS1256_CMD_SYNC);
  9.         SPI_WriteByte(ADS1256_CMD_WAKEUP);                      
  10.         SPI_WriteByte(ADS1256_CMD_RDATA);
  11.            sum |= (SPI_WriteByte(0xff) << 16);
  12.         sum |= (SPI_WriteByte(0xff) << 8);
  13.         sum |= SPI_WriteByte(0xff);
  14.         CS_1();

  15.         if (sum>0x7FFFFF)         
  16.         {
  17.                 sum -= 0x1000000;      
  18.         }
  19.     return sum;
  20. }
 楼主| 怎么总是重复啊 发表于 2023-7-31 13:21 | 显示全部楼层
主函数,单端输入,读取每一个通道的AD值并且转换后从串口打印输出
  1. int main(void)
  2. {       

  3.         u8 i=0;
  4.         int Adc;
  5.         float Volts;

  6.         SystemConfiguration();                    //系统初始化
  7.         USART_Config(USART1,115200);    //串口1初始化,波特率 115200
  8.         Init_ADS1256_GPIO(); //初始化ADS1256 GPIO管脚
  9.         Delay_ms(50);
  10.         ADS1256_Init();

  11.         while(1)
  12.         {       
  13.                 for(i = 0;i < 8;i++)
  14.                 {
  15.                         Adc = ADS1256ReadData( (i << 4) | ADS1256_MUXN_AINCOM);
  16.                         Volts = Adc*0.000000598;
  17.                         printf(" %.4fV  ",Volts);
  18.                 }
  19.                 printf("\r\n");
  20.         }
  21. }
 楼主| 怎么总是重复啊 发表于 2023-7-31 13:21 | 显示全部楼层
实验效果
接线 7492864c744e2d810c.png
 楼主| 怎么总是重复啊 发表于 2023-7-31 13:26 | 显示全部楼层
实验现象 7114964c745f1d4987.png
 楼主| 怎么总是重复啊 发表于 2023-7-31 13:26 | 显示全部楼层
AIN0通道接到GND,输出读数为0.0012V,其他通道悬空,输出的是浮空电压。 3883064c74628676ff.png
 楼主| 怎么总是重复啊 发表于 2023-7-31 13:26 | 显示全部楼层
tifmill 发表于 2023-8-4 13:33 | 显示全部楼层
用STM32F103RCT6怎样接收上位机发来的数据?
averyleigh 发表于 2023-8-4 18:00 | 显示全部楼层
,对从ADS1256读取的原始数据进行进一步的处理和格式化。
robertesth 发表于 2023-8-4 18:08 | 显示全部楼层
怎样读取ads1256采集的数据
claretttt 发表于 2023-8-4 18:32 | 显示全部楼层
可以根据ADS1256模块和STM32芯片的引脚映射表或者芯片手册来确定正确的引脚连接。
loutin 发表于 2023-8-4 21:17 | 显示全部楼层
通过SPI接口从ADS1256模块读取数据。
bestwell 发表于 2023-8-4 21:42 | 显示全部楼层
使用SPI接口与ADS1256进行通信,发送读取数据的命令,并接收返回的数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

262

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部