打印
[其他ST产品]

STM32驱动ADS1256串口输出-AD转换

[复制链接]
1580|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ADS1256



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 | 只看该作者
引脚说明
这个引脚说明关联本文开头的图片里的两个模块

使用特权

评论回复
板凳
怎么总是重复啊|  楼主 | 2023-7-31 12:57 | 只看该作者
模块相关寄存器与命令
ADS1256一共有11个寄存器,可以通过配置相应的寄存器实现数据输出位的顺序、是否自校准、是适用缓冲器、单端/差分、采样率等的配置。每一个寄存器具体的作用这里不展开详细说明,可自行参考ADS1256的数据手册

使用特权

评论回复
地板
怎么总是重复啊|  楼主 | 2023-7-31 12:58 | 只看该作者
命令表,其中包含了读/写数据、校准、复位等指令。

使用特权

评论回复
5
怎么总是重复啊|  楼主 | 2023-7-31 12:58 | 只看该作者
芯片的SPI通讯时序可参考这个这个时序图和下面的时序特性说明。

使用特权

评论回复
6
怎么总是重复啊|  楼主 | 2023-7-31 12:58 | 只看该作者
注意通信时, CS 必须保持为低电平。

使用特权

评论回复
7
怎么总是重复啊|  楼主 | 2023-7-31 13:20 | 只看该作者
相关程序
初始化
SPI初始化
void SPI2_Init(void)
{
SPI_InitTypeDef  SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/****Initial SPI2******************/

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

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

  /* SPI2 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI1设置为两线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                    //设置SPI2为主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                   //串行时钟在不操作时,时钟为低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                 //第一个时钟沿开始采样数据
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                  //NSS信号由软件(使用SSI位)管理
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为8
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7;         //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure);
/* Enable SPI2  */
SPI_Cmd(SPI2, ENABLE);  
}

使用特权

评论回复
8
怎么总是重复啊|  楼主 | 2023-7-31 13:20 | 只看该作者
ADS1256初始化,给芯片做自校准并且设置芯片的参数(采样率、数据位顺序、放大倍数等)
void ADS1256_Init(void)
{

        ADS1256WREG(ADS1256_STATUS,0x06);               // 高位在前、使用缓冲
        ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1);                // 放大倍数1
        ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS);  // 数据10sps
        ADS1256WREG(ADS1256_IO,0x00);  
                     
        //**自校准**//
        while(ADS1256_DRDY);
        CS_0();
        SPI_WriteByte(ADS1256_CMD_SELFCAL);
        while(ADS1256_DRDY);
        CS_1();
       
}

使用特权

评论回复
9
怎么总是重复啊|  楼主 | 2023-7-31 13:21 | 只看该作者
读取某个通道的AD值
signed int ADS1256ReadData(unsigned char channel)  
{

    unsigned int sum=0;
       
        while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器
        ADS1256WREG(ADS1256_MUX,channel);                //设置通道
        CS_0();
        SPI_WriteByte(ADS1256_CMD_SYNC);
        SPI_WriteByte(ADS1256_CMD_WAKEUP);                      
        SPI_WriteByte(ADS1256_CMD_RDATA);
           sum |= (SPI_WriteByte(0xff) << 16);
        sum |= (SPI_WriteByte(0xff) << 8);
        sum |= SPI_WriteByte(0xff);
        CS_1();

        if (sum>0x7FFFFF)         
        {
                sum -= 0x1000000;      
        }
    return sum;
}

使用特权

评论回复
10
怎么总是重复啊|  楼主 | 2023-7-31 13:21 | 只看该作者
主函数,单端输入,读取每一个通道的AD值并且转换后从串口打印输出
int main(void)
{       

        u8 i=0;
        int Adc;
        float Volts;

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

        while(1)
        {       
                for(i = 0;i < 8;i++)
                {
                        Adc = ADS1256ReadData( (i << 4) | ADS1256_MUXN_AINCOM);
                        Volts = Adc*0.000000598;
                        printf(" %.4fV  ",Volts);
                }
                printf("\r\n");
        }
}

使用特权

评论回复
11
怎么总是重复啊|  楼主 | 2023-7-31 13:21 | 只看该作者
实验效果
接线

使用特权

评论回复
12
怎么总是重复啊|  楼主 | 2023-7-31 13:26 | 只看该作者
实验现象

使用特权

评论回复
13
怎么总是重复啊|  楼主 | 2023-7-31 13:26 | 只看该作者
AIN0通道接到GND,输出读数为0.0012V,其他通道悬空,输出的是浮空电压。

使用特权

评论回复
14
怎么总是重复啊|  楼主 | 2023-7-31 13:26 | 只看该作者

使用特权

评论回复
15
tifmill| | 2023-8-4 13:33 | 只看该作者
用STM32F103RCT6怎样接收上位机发来的数据?

使用特权

评论回复
16
averyleigh| | 2023-8-4 18:00 | 只看该作者
,对从ADS1256读取的原始数据进行进一步的处理和格式化。

使用特权

评论回复
17
robertesth| | 2023-8-4 18:08 | 只看该作者
怎样读取ads1256采集的数据

使用特权

评论回复
18
claretttt| | 2023-8-4 18:32 | 只看该作者
可以根据ADS1256模块和STM32芯片的引脚映射表或者芯片手册来确定正确的引脚连接。

使用特权

评论回复
19
loutin| | 2023-8-4 21:17 | 只看该作者
通过SPI接口从ADS1256模块读取数据。

使用特权

评论回复
20
bestwell| | 2023-8-4 21:42 | 只看该作者
使用SPI接口与ADS1256进行通信,发送读取数据的命令,并接收返回的数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

197

帖子

1

粉丝