你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32微处理器和AD5791的20位超高精度测量系统

[复制链接]
gaosmile 发布时间:2020-7-14 11:36

引言

现在很多智能测量仪表要求具有超高精度的电压信号,同时要求高稳定性、高线形度和低噪声、低温度漂移。这样的模拟系统设计面临复杂的工程技术挑战,常规的方法是采用多个较低分辨率的DAC和大量分立元件与支持IC整合在一起,同时伴随着相当大的开发风险和高代价的修改时间,才能优化电路参数、减小误差和设计出复杂的自动校准电路,这样不仅增加了硬件设计的复杂性,通常达到的精度也不是很高。本系统设计的基于STM32微处理器和AD5791的20位超高精度测量系统中,实现了单路超高精度可调电压信号的输出,输出电压信号的幅值可以通过软件来设置。该系统可靠性高,不需要校准电路。

AD5791是美国ADI公司推出的一款高性能的单路20位电压输出数模转换器, 它是业界首款具有真正1 ppm(百万分之一)分辨率和精度的DAC器件 。双极工作电压高达33 V。同时AD5791具有1 ppm的分辨率和精度、低噪声(l ppm以下)、快速刷新率(1 us)和非常低的输出漂移(在l ppm以下)。该器件采用了多功能三线串行接口,并与SPI、QSPI TM 、MICROWIRE TM 和DSP接口标准兼容。该器件集成了一个上电复位电路,以确保DAC输出能达到0V,并保持在已知输出阻抗状态,直到有效写入为止。该器件还提供了一个输出钳位功能,这使得其输出在一个限定的负载状态。综上知,采用该款芯片,减少了复杂校准算法的必要性,能极大地简化设计任务、减少开发和维护成本,同时降低风险。国内相关学者在精密电压源和医疗仪器中也得到了应用  。

本系统的 Cortex-M3处理器为意法半导体公司推出的32位RISC处理器 STM32F103VCT6,主频最高可达72 MHz,应用也比较广泛  。该处理器具有256KB的程序存储器,48 KB的RAM,同时它有8个定时器、5路串口、3路SPI、2路I2C,具有独立看门狗和窗口看门狗,非常适合于与AD5791构成高精度的测量系统。

1、硬件电路设计

数模转换电路中采用了1片参考电压基准产生芯片REF02AZ、1片超高精度双路轨至轨输出运算放大器AD8676、1片高精度单路轨至轨输出运算放大器AD8675和20位超高精度数模转换芯片AD5791构成。该电路性能稳定,运行效果非常好。下面对电路进行详细分析。

AD5791中,VDD为+15 V,VSS为-15 V。VREFPS和VREFPF用以提供AD5791的正参考电压输入,输入范围5V到VDD-2.5 V,本测试系统中使用了+5 V的参考电压。VREFNS和VREFNF用以提供AD5791的负参考电压输入,输入范围VSS+2.5到0 V,本测试系统中使用了-5 V的参考电压。AD5791的工作电压为3.3 V。+5 V参考电压由参考电压产生芯片REF02AZ产生,负电压是通过由OP177构成的单位增益反向放大器来实现。±5 V电压产生电路如图1所示。

        

        AD5791有7个用于与STM32处理器进行通讯的引脚,下面逐一作详细介绍:

        RESET/:复位引脚,可以实现AD5791的复位;

        CLR/:清零引脚,可以将AD5791内部DAC寄存器的值恢复到用户定义的值,并更新DAC的输出;

        LDAC/:用于更新AD5791内部DAC寄存器的值,并更新DAC的输出;

        SDO:串行数据输出引脚;

        SDIN:串行数据输入引脚;

        SCLK:串行通讯时钟信号输入引脚,最高频率可高达35 MHz;

        SYNC/:串行输入数据的帧同步信号;

由于STM32处理器采用了I/O口模拟SPI通讯的方式,所以通讯控制引脚可以连接到空余的STM32处理器的任何一个I/O引脚上,只要做相应配置就可以。AD5791的应用电路图如图2所示。其中,AD8675构成电压跟随器,作为AD5791的输出缓冲。硬件电路上模拟地和数字地分开,并在一点接地,同时各个电源都加有滤波电容,以消除干扰。

2、软件设计

系统采用模拟SPI总线通信,软件的关键是STM32处理器和 AD5791之间的时序匹配,输出电压值到AD5791的DAC寄存器的值的计算,下面分别进行详细介绍。

2.1 AD5791芯片配置

AD5791的配置,主要在于AD5791的控制寄存器的配置。为了使得AD5791和STM32处理器匹配使用,需要做如下配置,具体控制寄存器相关介绍和操作参见手册。DBn(n=1…9)代表控制寄存器的第n位。

DB1 RBUF=1 内部运算放大器关闭

DB2 OPGND=0 将DAC输出下拉到地的功能切换掉,使得DAC处于正常模式

DB3 DACTRI=0 使DAC处于正常操作模式


DB4 BIN/2sC=1 使用直接二进制编码,不使用二进制补码编码的形式

DB5 SDODIS=0 SDO数据输出使能

DB6-DB9 LIN_COMP=0 参考电压输入范围选择为10 V

按照上述的配置,将相应配置字写入到AD5791的控制寄存器内部,AD5791就可以正常工作了。此处值得注意的是DB4位,一定要选择好相应的编码形式,否则输出电压会和计算值不符合。

2.2 ST M 32接口配置

STM32处理器的SPI 发送和接收都采用的是I/O口模拟的方式,因此I/O的初始化比较简单,除了DAC1_SDO网络标号的引脚设置为输入模式外,其他通讯用的引脚都设置为输出模式。

        

2.3 数模转换输出

数模转换输出,主要涉及3个子程序,芯片上电初始化子程序,芯片控制寄存器初始化子程序和电压输出子程序3个部分。下面给出AD5791读写函数和测试的例子。

        u32 AD5791_Read(void)//读取的24bit的数据

        {

        unsigned int i,j;

        u32 data,c;

        data=0;

        AD5791_sync_0();

        AD5791_sclk_0();

        for(i=0;i《24;i++)

        {

        j=3;

        data=data《《1;

        AD5791_sclk_1();

        while(j--);

        c=GET_AD5791_SO();

        AD5791_sclk_0();

        data=data|c;

        }

        AD5791_sclk_0();

        AD5791_sync_1();

        return(data);

        }

        void AD5791_Write(unsigned long OutData) //写一

        个24 bit的数值

        {

        unsigned char i;

        unsigned long value;

        value = OutData & 0x00ffffff; //取低24bit

        value = value《《8; //左移8位,ok

        AD5791_ldac_1();

        AD5791_sclk_1();

        AD5791_sync_1();

        AD5791_sync_0();

        for ( i = 0; i 《 24; i ++ )

        {

        AD5791_sclk_1();

        ad5791delay();

        if((value & 0x80000000) == 0x80000000)

        {

        AD5791_sdin_1();

        }

        else

        {

        AD5791_

        sdin_0();

        }

        ad5791delay();

        AD5791_sclk_0();

        ad5791delay();

        value = value 《《 1;

        }

        AD5791_sync_1();

        ad5791delay();

        AD5791_ldac_0();

        ad5791delay();

        AD5791_ldac_1();

        ad5791delay();

        }

        /*入口参数:outvalue 输出的电

        压的值*/

        void test_ad5791(double outvalue)

        {

        double temp=0.0;

        long temp1=0;

        Ad5791_gpio_init(); //AD5791 I/O口初始化

        Ad5791_clr_init();//AD5791 清零

        Reset_ad5791(); //AD5791 复位

        Write_ad5791_control_register();//写AD5791的控

        制寄存器

        temp=((outvalue+5.0)*1048575.0)/10.0;//计

        算DAC输出值

        temp1=(long)temp | 0x00100000;

        Write_ad5791_dac_register(temp1);//写AD5791的

        dac寄存器,同时输出相应电压

        }

程序中对AD5791芯片进行相应初始化以及写AD5791的相应寄存器都采用I/O模拟相应时序的方法。其中写模式的时序如图3所示。写数据时,注意先写高位,再写低位,必须严格按照时序来写入。

        

3、结束语

本系统成功实现了基于STM32处理器和AD5791的20位高精度电压输出系统,给出了全新实用的硬件和软件设计,适用于对输出高精度模拟电压有需要的智能仪表场合中。该系统精度高,漂移低,可靠性高,可以应用于医疗仪器、测试测量仪表、工业控制以及高端科学和航空航天仪器中,具有很好的应用前景。


1 收藏 评论1 发布时间:2020-7-14 11:36

举报

1个回答
liyuanlnx 回答时间:2020-7-14 21:44:35
入门小白,请问一下博主为什么选择使用模拟SPI?用IO口模拟SPI,SCLK能达到多快的速度?

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版