AD1256之STM32程序——STM32测试高精度ADC篇(四)

发布者:电子艺术大师最新更新时间:2022-06-06 来源: eefocus关键字:STM32  高精度ADC 手机看文章 扫描二维码
随时随地手机看文章

1.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做了一次比较测试,分享下测试的结果

 

2.硬件设计分析

从结构图可以看出来,AD1256是模拟区域与数字区域完全独立的ADC,即AVDD给模拟区域供电,DVDD给数字区域供电,在原理图设计方面按照官方指导文档,需要对两个区域做独立的布线与隔离处理,才能让信噪比最佳。另可靠的基准电压是高精度ADC命根,本次试验选择TI公司推出的REF5025作基准参考,REF5025可低于3µVpp/V 噪声、3ppm/°C 漂移,性能是十分出色的。

 

由于经常做高频类项目,十分讨厌杜邦线/飞线测试方式,在高精度的领域,24位ADC梯度值2的2416777216,如果接入基准电压是2.5v,理论分辨率可达到0.149μV,做过高频的工程师深知杜邦线的罪恶,根据上面的技术分析,哪怕线路被引入1μV的干扰,也可以让精度打上一定折扣。为了让ADS1232性能得以充分体现,特意做了一个测试载板,载板的设计也是很关键,分割模拟数字区域同时,连接地方大量使用钽电容做旁路电路,以把波纹抑制到最小,合理的布局与布线也很重要,敷铜区域也需要模数分离,以磁珠或者0-5R/电感隔开。

3.时序图解说

 

 

由时序图看出来,ADS1256读写是简单的3线串行读数方式,属于Microwire串行接口,STM32的SPI接口可以完美的与之匹配,当然也可以采用软仿SPI替代STM32的硬件SPI,这样的程序更具移植性。SPI时序实现也相对简单,ADS1256的CS线仅仅只是做片选使用(上图所示)在数据输出结束的T10阶段需要,需要发送一次脉冲。在SCLK第一脉冲DIN开始接受数据输入,数据输入完毕的T6内SCLK需要保持低电平,然后调制一个周期的脉冲信号,数据即可全部到达DOUT总线,一次读写完毕。


4.核心源码

  1. //写一个字节

  2. void ADS1256_write_bit(u8 temp)

  3. {

  4. u8 i;

  5. for(i=0;i<8;i++)

  6. {

  7. ADS1256_Write_SCLK_H;

  8. if(temp&0x80)

  9. ADS1256_Write_DIN_H;

  10. else

  11. ADS1256_Write_DIN_L;

  12. temp=temp<<1;

  13. ADS1256_delayus(1);

  14. ADS1256_Write_SCLK_L;

  15. ADS1256_delayus(1);

  16. }

  17. }


  1. //读一个字节

  2. u8 ADS1256_read_bit(void)

  3. {

  4. u8 i;

  5. u8 date;

  6. for(i=0;i<8;i++)

  7. {

  8. ADS1256_Write_SCLK_H;

  9. date=date<<1;

  10. ADS1256_delayus(1);

  11. ADS1256_Write_SCLK_L;

  12. date= date | ADS1256_Read_DOUT;

  13. ADS1256_delayus(1);

  14. }

  15. return date;

  16. }


  1. //初始化:

  2. u8 ADS1256_Init(void)

  3. {

  4. u8 ReturnData = 0;

  5. u8 ADS1256_reg_Init[5]={

  6. 0x02, //状态寄存器初始化值

  7. 0x01, //模拟多路选择器初始化值

  8. 0x00, //AD控制寄存器初始化值

  9. 0x03, //数据速度寄存器初始化值

  10. 0x00, //I/O控制寄存器初始化值

  11. };

  12. ADS1256_Write_CS_H;

  13. ADS1256_Write_SYNC_H;

  14. ADS1256_Write_SCLK_L;

  15. ADS1256_Write_RST_L;

  16. ADS1256_delayms(1);

  17. ADS1256_Write_RST_H;

  18. ADS1256_delayms(1);

  19. ADS1256_Write_CS_L;

  20. ADS1256_delayms(1);

  21.  

  22. ADS1256_write_reg(0x00,ADS1256_reg_Init[0]);//状态寄存器初始化

  23. ADS1256_delayus(1);

  24.  

  25. ADS1256_write_reg(0x01,ADS1256_reg_Init[1]);//模拟多路选择器初始化

  26. ADS1256_delayus(1);

  27.  

  28. ADS1256_write_reg(0x02,ADS1256_reg_Init[2]);//AD控制寄存器初始化

  29. ADS1256_delayus(1);

  30.  

  31. ADS1256_write_reg(0x03,ADS1256_reg_Init[3]);//数据速度寄存器初始化

  32. ADS1256_delayus(1);

  33.  

  34. ADS1256_write_reg(0x04,ADS1256_reg_Init[4]);//I/O控制寄存器初始化

  35. ADS1256_delayus(1);

  36.  

  37. if(ADS1256_reg_Init[1] != ADS1256_read_reg(0x01)) ReturnData = 1;

  38.  

  39. if(ADS1256_reg_Init[2] != ADS1256_read_reg(0x02)) ReturnData = 1;

  40. ADS1256_delayus(1);

  41.  

  42. if(ADS1256_reg_Init[3] != ADS1256_read_reg(0x03)) ReturnData = 1;

  43. ADS1256_delayus(1);

  44.  

  45. if(ADS1256_reg_Init[4] != ADS1256_read_reg(0x04)) ReturnData = 1;

  46. ADS1256_delayus(1);

  47.  

  48. while(ADS1256_Read_DRDY);

  49.  

  50. return(ReturnData);

  51. }


  1. //读数程序:

  2. u32 ADS1256_Read_a_Data(void)

  3. {

  4. u32 Data,Data1,Data2,Data3;

  5. Data1 = ADS1256_read_bit();

  6. Data2 = ADS1256_read_bit();

  7. Data3 = ADS1256_read_bit();

  8. Data = (Data1<<16) | (Data2<<8) | Data3;

  9. return (Data);

  10. }

 

5.测试结果

测试源是2.50v基准输出电压值,实际加入电压是:2.50000000v(8位半表实测),通过误差曲线的分析,摆幅稳定在-2- -8µV,效果还是很理想的。官方测试条件Gain=128,VREF=5V,下图是手册提供的有效位与测试电压关系图,在1ksps采样时候可以达到近22位的有效值,但是在全速30kHz采样时候只有20位的有效值,频率采集快了,会有一定失真,这是所有AD转换芯片的通病,当然阻抗匹配也有一定的原因。因此在使用前零度和满度校准是十分必要的

6.  总结

作为一款中低速高精度的ADC,ADS1256有着30kHz的转换频率,4路差分输入或8路伪差分输入,相比AD7190虽然价格略高一些,但是性能相比ADI公司的AD7190的性能提高不少,有8路伪差分的输入通道,特别是采样速率,在本次测试看,拥有不错的性价比和出色的性能会让它在同级别的ADC中也有非常强的竞争能力


关键字:STM32  高精度ADC 引用地址:AD1256之STM32程序——STM32测试高精度ADC篇(四)

上一篇:STM32 AD C单次转换模式 连续转换模式 扫描模式
下一篇:STM32用串口(USB串口)下载程序的方法(只能用UASRT1)

推荐阅读最新更新时间:2024-11-12 18:24

一文详解STM32的嘀嗒时钟(SysTick)
简要说明 1概述 嘀嗒时钟(SysTick)是一个简单的系统时钟节拍计数器,它属于Cortex-M4内核嵌套向量中断控制器(NVIC)里的一个功能单元。他是一个24位的倒计时定时器(在NVIC中),当systick计数值到0的时候,SysTick重装载寄存器就会自动重新装载初值。只要SysTick控制和状态寄存器(CTRL)中的使能位没有ENABLE清除掉,那么就会永远的执行下去。 SysTick定时器被捆绑在NVIC中,可产生SysTick异常(异常号:15),属于Cortex-M4内核里的一个功能单元。 SysTick常作为系统节拍定时器用于操作系统(如mCOS-Ⅱ、FreeRTOS等)的系统节拍定时,从而推动任务和时间的
[单片机]
一文详解<font color='red'>STM32</font>的嘀嗒时钟(SysTick)
74HC595 for STM32 源代码【worldsing笔记】
74HC595是硅结构的CMOS器件, 兼容低电压TTL电路,遵守JEDEC标准。 74HC595是具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。 数据在SHcp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在STcp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。 8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。 将
[单片机]
74HC595 for <font color='red'>STM32</font> 源代码【worldsing笔记】
关于STM32 ST-LINK Utility查看内核运行状态,助你判断程序是否跑飞
本文围绕STM32 ST-LINK Utility讲几点主要功能及相关拓展知识: 1.STM32编程下载; 2.利用该编程工具查看内核运行状态; 3.Option Bytes选项字配置; 1STM32编程下载 STM32 ST-LINK Utility一个最重要的功能就是对STM32进行编程。支持常见的hex、bin文件,还有早期摩托罗拉定义的srec和s19格式的文件(说实话,我都不了解这两种格式的文件)。 这里主要想提示一下初学者:hex带有地址,而bin文件不带地址,下载时需要填写起始地址。 下面看两张在STM32 ST-LINK Utility中下载选择文件的图大家就明白了。 1.选择hex下载,地址不可修改(灰色)
[单片机]
关于<font color='red'>STM32</font> ST-LINK Utility查看内核运行状态,助你判断程序是否跑飞
STM32单片机Systick函数的使用方法
在“嵌入式学习006_Systick使用(一)”中,详细介绍了Systick中寄存器的使用方法,用到了很多函数,实际上到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS.h中定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。 在CMSIS中提供的函数是SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。Sys
[单片机]
如何解决STM32芯片Flash写保护导致无法下载程序,无法在线调试的问题
本文介绍了如何解决STM32芯片Flash写保护导致无法下载程序,无法在线调试的问题;如果您遇到相同的问题,希望本文可以带来一些帮助; 1 FLASH的写保护 如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。 在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。 2 错误提示 在使用MDK进行调试的时候,出现报错 ==Flash Timeout.Reset Target and try it again==,具体如下图所示; 折腾了一番之后,并没有解决问题,因为使用的仿真器是stlink,因此下载了stlink utilit
[单片机]
如何解决<font color='red'>STM32</font>芯片Flash写保护导致无法下载程序,无法在线调试的问题
STM32 之 UART1(2)
(2)Init_External_Device.c C语言: Codee#14663 #include includes.h /******************************************************************************* == 全局变量 == *******************************************************************************/ //=== UART1_RX变量,TX变量 ======================================
[单片机]
STM32 外部中断简介
STM32 IO 口中断的一些基础概念。STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件。 在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的: void GPIO_EXTILineConfig(uint8_t
[单片机]
STM32的IAP下载与设置
首先修改IAP程序: 由于官方的例子中是基于官方的开发板的,其中使用的触发条件为上电检测一个按键。所以需要更改启动设置。去官方下载IAP程序 http://www.stmicroelectronics.com.cn/stonline/mcu/STM32_AN.htm 第一步:打开官方的STM32的IAP程序,根据软件选择工程STM3210B-EVAL,我用得是MDK。 第二步:我们需要把这个触发条件修改为自己开发板上的按键 SW3,需要做如下修改。 打开 platform_config.h 文件,做如下修改: //#if !defined (USE_STM3210B_EVAL) && !defin
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved