STM32驱动ADS1256串口输出-AD转换
- ADS1256
- ADS1256简介
- 芯片特点
- 引脚说明
- 模块相关寄存器与命令
- 相关程序
- 初始化
- 实验效果
- 接线
- 实验现象
ADS1256
ADS1256简介
ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编程增益放大器等,芯片本身可以测量0-5v的信号,高电压采集可以通过把信号分压成0-5v的范围内再给模块输入,所以ADS1256可以采集市面上大多数的标准电压信号。
芯片特点
- 8通道输入
- 可采集单端信号与差分信号
- 最高30KSPS的采样率
- 4个可编程I/O
- 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; //定义波特率预分频的值:波特率预分频值为8SPI_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); // 放大倍数1ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS); // 数据10spsADS1256WREG(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初始化,波特率 115200Init_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