使用STM32驱动ADS1256实现AD转换并串口输出

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

  • ADS1256
  • ADS1256简介
  • 芯片特点
  • 引脚说明
  • 模块相关寄存器与命令
  • 相关程序
  • 初始化
  • 实验效果
  • 接线
  • 实验现象
  • ADS1256


    ADS1256简介

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

    芯片特点

    1. 8通道输入
    2. 可采集单端信号与差分信号
    3. 最高30KSPS的采样率
    4. 4个可编程I/O
    5. 0-5V信号输入

    引脚说明

    这个引脚说明关联本文开头的图片里的两个模块

    引脚名称 引脚说明
    VIN/5V 模块供电正极
    GND 模块供电负极
    D0 数字IO口0,时钟输出
    D1-D3 数字IO口1-3
    SCLK SPI时钟输入
    DIN SPI数据输入
    DOUT SPI数据输出
    DRDY 数据输出就绪
    CS 片选
    RESET 复位
    SYNC/PDWN 同步/关闭电源
    AIN0-AIN7 信号输入,(8路单端/4路差分)

    模块相关寄存器与命令

    ADS1256一共有11个寄存器,可以通过配置相应的寄存器实现数据输出位的顺序、是否自校准、是适用缓冲器、单端/差分、采样率等的配置。每一个寄存器具体的作用这里不展开详细说明,可自行参考ADS1256的数据手册

    命令表,其中包含了读/写数据、校准、复位等指令。

    芯片的SPI通讯时序可参考这个这个时序图和下面的时序特性说明。

    注意通信时, CS 必须保持为低电平。

    相关程序

    初始化

    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);  
    } 
    

    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(); 
    	
    }
    

    读取某个通道的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;
    }
    

    主函数,单端输入,读取每一个通道的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"); 
    	}
    }
    

    实验效果

    接线

    STM32 ADS1256
    5V VIN/5V
    GND GND
    SCLK PB13
    DIN PB15
    DOUT PB14
    DRDY PB11
    CS PB12

    实验现象


    AIN0通道接到GND,输出读数为0.0012V,其他通道悬空,输出的是浮空电压。


    AIN0通道接入单片机的3.3V,串口输出显示AIN0的读数为3.3185V

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用STM32驱动ADS1256实现AD转换并串口输出

    发表评论