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

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

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初始化

c 复制代码
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初始化,给芯片做自校准并且设置芯片的参数(采样率、数据位顺序、放大倍数等)

c 复制代码
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值

c 复制代码
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值并且转换后从串口打印输出

c 复制代码
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

相关推荐
代码游侠1 天前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg20051 天前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT1 天前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen1 天前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠1 天前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_1 天前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技1 天前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计1 天前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦1 天前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报1 天前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机