一:电源输入设计
TPS5430DDAR特点
设计的电路原理图如下所示:
二:传感器供电设计:
为了节约成本和电路板上不使用负电压,这里采用TL431基准芯片。
电路板当初设计的时候没有设计负电压电路;所以不能使用类似TLE2072的运放芯片,由于设计的压力传感器和位移传感器内部的阻值比较小,所以使用TL431芯片依然可以满足电路需要。
三:AD采样芯片ADS1256周围电路设计
ADS1256芯片概述:
ADS1256是TI(TexasInstruments)公司推出的一款低噪声高分辨率的24位Sigma-Delta(E-v)模数转换器(ADC)。E-vADC与传统的逐次逼近型和积分型ADC相比有转换误差小而价格低廉的优点,但由于受带宽和有效采样率的限制,E-vADC不适用于高频数据采集的场合。该款ADS1256可适合于采集最高频率只有几千赫兹的模拟数据的系统中,数据输出速率最高可为30K采样点/秒(SPS),4路差分与8路伪差分输入,有完善的自校正和系统校正系统,SPI串行数据传输接口。本文结合笔者自己的应用经验,对该ADC的基本原理以及应用做简要介绍。
ADS1256性价比很高,是TI公司24位ADC中出货最大的几款ADC之一,用量很大,网上资料以相对齐全,供货很稳定,非常适用于中底速高精度的测试,如应变计、气体分析、仪器仪表、压力传感器、血液分析、工业过程控制、医疗科学仪器等应用。对ADS1256做了一次比较测试,分享下测试的结果
ADS1256时序介绍:
ADS1256 个人使用心得:
作为一款中低速高精度的ADC,ADS1256有着30kHz的转换频率,4路差分输入或8路伪差分输入,相比AD7190虽然价格略高一些,但是性能相比ADI公司的AD7190的性能提高不少,有8路伪差分的输入通道,特别是采样速率,在本次测试看,拥有不错的性价比和出色的性能会让它在同级别的ADC中也有非常强的竞争能力
四:W25Q64FVSSIQ存储芯片介绍
芯片硬件设计:
芯片介绍:W25Q64存储容量共64M-bit/ 8M-byte,32768页(pages)、每页256-bytes。最大一次可编程256-bytes。W25Q128JV存储容量共128M-bit/ 16M-byte
一次擦除大小可以为16页(4KB)、128页(32KB)、256页(64KB)或者全擦除。
W25Q64JV有2048个可擦除扇区(sectors),或者可以说有128个可擦除块(blocks)。关系 1 Block = 16 sectors;1 sector = 4KB,所以算起来能达到8M-byte。
编程即写数据,由于Flash的特性,只能从1编程0,所以写数据之前Flash里面的数据不是0xFF就必须先擦除,然后才能写数据。擦除即将Flash里面的数据恢复为0xFF的过程。
上电后设备自动处于写禁用状态(Write Enable Latch, WEL为0,WEL是只读位)。在Page Program, Sector Erase, Block Erase, Chip Erase or Write Status Register instruction(页编程、区擦除、块擦除、芯片擦除或者写状态寄存器指令)之前必须先进行写使能指令。在编程、擦除、写状态寄存器指令完成后,WEL自动变成0。
BUSY位是状态寄存器0的第0位,并且是只读位。当执行页编程、区擦除、块擦除、芯片擦除、写状态寄存器、擦除/编程安全寄存器指令时,其值为1,并且在此期间不再接收新的指令,但是可以接收读状态寄存器指令和擦除编程挂起指令。
芯片读取操作部分:读取数据指令允许从存储器中顺序读取一个或多个数据字节。通过将 /CS 引脚驱动为低电平来启动指令,然后将指令代码“03h”和一个 24 位地址 (A23-A0) 移入DI引脚。代码和地址位在CLK引脚的上升沿锁存。接收到地址后,寻址存储器位置的数据字节将在CLK的下降沿移出DO引脚,最高有效位(MSB)在前。在移出每个数据字节后,地址会自动递增到下一个更高的地址,从而实现连续的数据流。这意味着只要时钟继续,就可以用一条指令访问整个内存。该指令通过驱动 /CS 为高电平来完成。
如果在擦除、编程或写周期正在进行(BUSY=1)时发出读数据指令,该指令将被忽略并且不会有任何对当前周期的影响。
读取数据 (03h) 指令仅在标准 SPI 模式下受支持。
五:ADS1256通用驱动代码,移植在其他平台也是兼容的。
//写一个字节 void ADS1256_write_bit(u8 temp) { u8 i; for(i=0;i<8;i++) { ADS1256_Write_SCLK_H; if(temp&0x80) ADS1256_Write_DIN_H; else ADS1256_Write_DIN_L; temp=temp<<1; ADS1256_delayus(1); ADS1256_Write_SCLK_L; ADS1256_delayus(1); } } //读一个字节 u8 ADS1256_read_bit(void) { u8 i; u8 date; for(i=0;i<8;i++) { ADS1256_Write_SCLK_H; date=date<<1; ADS1256_delayus(1); ADS1256_Write_SCLK_L; date= date | ADS1256_Read_DOUT; ADS1256_delayus(1); } return date; } //初始化: u8 ADS1256_Init(void) { u8 ReturnData = 0; u8 ADS1256_reg_Init[5]={ 0x02, //状态寄存器初始化值 0x01, //模拟多路选择器初始化值 0x00, //AD控制寄存器初始化值 0x03, //数据速度寄存器初始化值 0x00, //I/O控制寄存器初始化值 }; ADS1256_Write_CS_H; ADS1256_Write_SYNC_H; ADS1256_Write_SCLK_L; ADS1256_Write_RST_L; ADS1256_delayms(1); ADS1256_Write_RST_H; ADS1256_delayms(1); ADS1256_Write_CS_L; ADS1256_delayms(1); ADS1256_write_reg(0x00,ADS1256_reg_Init[0]);//状态寄存器初始化 ADS1256_delayus(1); ADS1256_write_reg(0x01,ADS1256_reg_Init[1]);//模拟多路选择器初始化 ADS1256_delayus(1); ADS1256_write_reg(0x02,ADS1256_reg_Init[2]);//AD控制寄存器初始化 ADS1256_delayus(1); ADS1256_write_reg(0x03,ADS1256_reg_Init[3]);//数据速度寄存器初始化 ADS1256_delayus(1); ADS1256_write_reg(0x04,ADS1256_reg_Init[4]);//I/O控制寄存器初始化 ADS1256_delayus(1); if(ADS1256_reg_Init[1] != ADS1256_read_reg(0x01)) ReturnData = 1; if(ADS1256_reg_Init[2] != ADS1256_read_reg(0x02)) ReturnData = 1; ADS1256_delayus(1); if(ADS1256_reg_Init[3] != ADS1256_read_reg(0x03)) ReturnData = 1; ADS1256_delayus(1); if(ADS1256_reg_Init[4] != ADS1256_read_reg(0x04)) ReturnData = 1; ADS1256_delayus(1); while(ADS1256_Read_DRDY); return(ReturnData); } //读数程序: u32 ADS1256_Read_a_Data(void) { u32 Data,Data1,Data2,Data3; Data1 = ADS1256_read_bit(); Data2 = ADS1256_read_bit(); Data3 = ADS1256_read_bit(); Data = (Data1<<16) | (Data2<<8) | Data3; return (Data); }
六:PCB图片和3D仿真图