AD7705显示
AD7705 及其应用
为此, 我们选用 AD7705 作为模数转换器。AD7705
1 闸位荷重仪的基本原理
在 闸 位 荷 重 仪 中 ,最 基 本 的 测 量 参 数 包 括 开 度 和荷重。闸位编码传感器与闸门启闭机主轴相连, 把闸门的提升高度转换为数字编码后可直接送入微 处 理 器;而 测 量 荷 重 我 们 采 用 压 力 传 感 器 。起 吊 闸 门时,传感器受力,输出电压信号。此信号经 A/D 转换后,由微处理器读入、处理并显示输出,进行 报警控制。图 1所示为闸位荷重仪的原理框图。
在我们的系统中,由于89C51的串行口用于扩展 RS-485 接口。因此,采用另一种方法,即用 89C51的 并行口模拟串行口的时序,完成对 AD7705的操作, 详细的连接方法如图 1 所示。把 89C51 的 P1.7、P1.6、
P1.5、P1.4 分别与 AD7705 的 DIN、SCLK、DOUT、CS
程增益 (具有 1、 2、 4、 8、 16、 32、 64、 128 八种
的 24 位并行输入口完全可以满足不同位数的编码
放 大 倍 数 )、可 编 程 输 出 数 据 更 新 率 及 自 校 准 和 系
器需要 ; 另一片 8255 用作键盘显示接口。
统 校 准 功 能;同 时 具 有 三 线 串 行 接 口 ,与 微 处 理 器
AD7705 是 AD 公司新推出的 16 位 Σ - Δ A/D 转换器。器件包括由缓冲器
图1 闸位荷重仪的原理框图
和 增 益 可 编 程 放 大 器( PGA )组 成 的 前 端来自拟调节电路、Σ - Δ调制器、可编
综 合 考 虑 仪 器 的 功 能 、运 行 环 境 及 经 济 效 益 等
程数字滤波器等部件。能直接将传感器测量到的 2
AD7705的操作
AD7705的操作我现在使用外部TL431(2.5V基准电压),电源电压为5V,外接晶体振荡器2.4576MHz,电路如下:程序如下:--------------------------AD7705.H -----------------------------------#ifndef _AD7705_H_#define _AD7705_H_// 引脚定义sbit AD7705_SCLK = P2^4;sbit AD7705_DRDY = P2^5;sbit AD7705_DOUT = P2^6;sbit AD7705_DIN = P2^7;// 通讯寄存器地址定义#define WR_SETUP_REG 0x10 //选中设置寄存器,写#define RD_SETUP_REG 0x18 //选中设置寄存器,读#define WR_CLOCK_REG 0x20 //选中时钟寄存器,写#define RD_DATA_REG 0x38 //选中数据寄存器,读#define WR_OFFSET_REG 0x60 //选中offset寄存器,写#define RD_OFFSET_REG 0x68 //选中offset寄存器,读#define WR_FULL_REG 0x70 //选中full scale寄存器,写#define RD_FULL_REG 0x78 //选中full scale寄存器,读#define SYS_ZERO_CALI 0x80 //系统零校准模式#define SYS_FULL_CALI 0xC0 //系统满量程校准模式#define ZERO_CALIBRA TION 0x00 //系统零校准#define FULL_CALIBRA TION 0x01 //系统满量程校准#define CLOCK_REG_SET 0x04 //CLOCK寄存器设置,无分频,50HZ 输出更新速率#define DELAY() {_nop_();_nop_();_nop_();}// 函数声明void AD7705_Init(void);void AD7705_Reset(void);void AD7705_Start(void);uchar AD7705_ReadByte(void);void AD7705_WritByte(uchar d);float AD7705_ReadV ol(void);#endif--------------------------AD7705.C -----------------------------------//**************************************************************************** //功能:AD7705串行接口失步后将其复位。
[设计]AD转换芯片7705
[设计]AD转换芯片7705AD7705 性价比比较高的 16位 ad 使用比较简单用做单通道的时候基本不怎么需要设置做双通道的时候,发现的点问题,而这几点问题在网上的前辈那也没有特别说明这里提出来供用的着 AD7705 的参考下1. 关于时钟寄存器 AD7705 只有一个时钟寄存器而不是两个。
2.4576MHZ 是标准频率,如果用 4.9152MHZ的时候,要将 CLKDIV位置位也就是 2 分频到 2.4576 具体设置看手册2. 关于数据寄存器 AD7705 也只有一个数据寄存器,一段时间内只能对一路AD输入做数据转换。
数据转换范围单极性 0 -- Vref/Gain 对应 0 -- 0xffff(65535)双极性 -Vref/Gain -- 0 对应 0 -- 0x8000(32768) 0 - Vref/Gain 对应0x8000(32768) -- 0xffff(65535)3. 关于设置寄存器同样也只有一个,要用哪个通道就要先设置这个通道对应的寄存器值4. 校准寄存器虽然有 4对但只是对应外部校准的所以在用自校准,通道切换的时候也要重新自校准一下,校准的时候 DRDY 为高电平,校准完后为低电平校准完后第一次读的数据不怎么准应该读第二次转换出来的数据。
下边是我单通道切换转换的程序:#include <iom16v.h>//SPI 引脚定义 PB 口#define CS_DRDY 3#define CS_CS 4#define CS_MOSI 5#define CS_MISO 6#define CS_SCK 7extern void SpiInit(void); // SPI 初始化 M16extern void InitAD7705(void); // AD7705 初始化extern unsigned int ReadDataCH1(void); //读取转换数据extern unsigned int ReadDataCH2(void); //读取转换数据#include "AD7705.H"//定义位操作#define SET_BIT(x,y) ((x) |= (0x0001 << (y))) #define CLR_BIT(x,y) ((x) &= ~(0x0001 <<(y))) #define CPL_BIT(x,y) ((x) ^= (0x0001 << (y))) #define GET_BIT(x,y) (((x) & (1 << (y))) == 0? 0:1)#define LET_BIT(x,y,z) ((x) = (x) & (~(1 << (y))) | ((z) << (y))) //**********************短延时程序50us**************************// void delay50us(unsigned int t) {unsigned int j;for(;t>0;t--)for(j=0;j<70;j++);}// SPI 初始化 M16void SpiInit(void){//cs 置为输出方可不影响 SPI 总线DDRB|=(1<<CS_MOSI)|(1<<CS_SCK)|(1<<CS_CS);//使能 spi 设置为主机时钟极性为空闲时高平上升沿采样下降沿设置分频系数为128分频SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR0);SPSR = 0x00; //setup SPISET_BIT(PORTB,CS_DRDY); //设置 REDY 信号输入端口上拉电阻使能SET_BIT(PORTB,CS_MISO); //设置 MISO 信号输入端口上拉电阻使能 }// SPI 发送接收数据unsigned char TransmitterSpi(unsigned char cData){SPDR = cData;while(!(SPSR&(1<<SPIF)));return SPDR;}//复位 AD7705void ResetAD(void){unsigned char i ;for(i = 10;i>0;i--) //持续DIN高电平写操作,恢复AD7705接口{TransmitterSpi(0xff);}}// AD7705 初始化void InitAD7705(void){CLR_BIT(PORTB,CS_CS); //CS置为输出低电平,使能 AD7705ResetAD() ;TransmitterSpi(0x20); //通讯寄存器 //通道 1,下一个写时钟寄存器自校准TransmitterSpi(0x00); //时钟寄存器 //写时钟寄存器设置 2.459Mhz更新速率为20hzTransmitterSpi(0x10); //通讯寄存器 //通道 1,下一个写设置寄存器TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极 ,缓冲delay50us(100); //延时TransmitterSpi(0x21); //通讯寄存器 //通道 2,下一个写时钟寄存器自校准TransmitterSpi(0x00); //时钟寄存器 //写时钟寄存器设置 2.459Mhz更新速率为20hzTransmitterSpi(0x11); //通讯寄存器 //通道 2,下一个写设置寄存器TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极,缓冲delay50us(100);}//*************************** 按照通道 1 读取****************************//unsigned int ReadDataCH1(void) {unsigned int getData = 0;unsigned char bufR[5];TransmitterSpi(0x10); //通讯寄存器 //通道 1,下一个写设置寄存器TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极 ,缓冲while(PINB&(1<<CS_DRDY)); //等待校准完成 READY 信号变为低电平TransmitterSpi(0x38); //发送 0x38 读取 CH1 数据寄存器while(PINB&(1<<CS_DRDY)); //等待 READY 信号变为低电平bufR[0]=TransmitterSpi(0xff); //转换结果高位bufR[1]=TransmitterSpi(0xff); //转换结果低位getData=(bufR[0]<<8)|bufR[1]; //获得数据 16 位return getData ; //返回数据}//***************************按照通道 2 读取****************************//unsigned int ReadDataCH2(void) {unsigned int getData = 0;unsigned char bufR[5];TransmitterSpi(0x11); //通讯寄存器 //通道 1,下一个写设置寄存器TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极 ,缓冲while(PINB&(1<<CS_DRDY)); //等待校准完成 READY 信号变为低电平TransmitterSpi(0x39); //发送 0x01 读取 AD7705 数据寄存器while(PINB&(1<<CS_DRDY)); //等待 READY 信号变为低电平bufR[0]=TransmitterSpi(0xff); //转换结果高位bufR[1]=TransmitterSpi(0xff); //转换结果低位getData=(bufR[0]<<8)|bufR[1]; //读取数据前 16 位return getData ;}void main(void){unsigned char adi ;unsigned int getData,getData2;SpiInit();InitAD7705();while(1){if(adi++ >=1) adi = 0;if(adi == 0) getData = ReadDataCH1(); if(adi == 1) getData2 = ReadDataCH2(); }}。
AD7705输出数据一直是0xffff的问题的解决过程
最近手头上有个16位的高精度ADC,就想着做个测试版调试调试吧,先上自己画的原理图晶振采用4.9152MHz的,复位采用上电复位,复位时间大概1ms 吧!基准使用TL431提供!模拟输入端采用电位器调节。
画板,焊接,写程序!一切都很顺利!调试程序时卡了壳,出现如下问题1、ADC输出数据不变,或者输出一直是oxffff检测硬件供电电压是否正常,5v检测基准电压是否正常,2.5v根据网上和官方的测试版,我感觉硬件设计应该没有太大问题那么目标锁定在软件上,首先怀疑的是时序,芯片上有个引脚DRDY,这个引脚变低时有数据输出,我用逻辑分析仪分析自己模拟SPI的时序,发现时序跟手册上的一样,而且DRDY也会置高和变低!根据这个分析这应该不是自己SPI时序的问题了!经过一早上的看手册,查资料,还是没有头绪,不知道哪来的一个念头,是不是芯片复位没有复位好呢?因为我采用的是上电复位,所以我觉得应该观察上电后输出的第一个数据是否正常,别愣着啦,赶紧测试!哇塞。
数据正确!调整电压,第一次上电后数据依然正确,按下单片机复位键,前几次正确,后面又变为0xffff了。
问题找到啦,芯片复位有问题!我改成单片机控制复位,把ADC的复位引脚接到单片机一个引脚上,通过引脚控制ADC复位,复位时间为10ms。
下载程序,上电测试,发现预期连续采集一百个数据,只输出了四五个!复位重来,效果一样,有时候只输出一个数据,庆幸的是数据都正确啦!这个时候没辙啦。
给adi亚太客服打电话。
至今没给回复。
nngt我还是靠自己吧!上网搜索,终于在一篇帖子中见到可能这么一句话“可能每次读AD7705的数据时都要把clock register,setup register 重新设置一遍,复位重来一遍”不管正确与否,试试再说!改程序,下载,看现象,哇塞!一次性输出100个数据,数据正常!可能大家跟我一样吧,怎么会这个样子呢。
我也很郁闷,手册上找不到连续读数据的时序,手册上看不到为什么这么做就数据正确啦!期待ADI工程师给我回复吧!!!不过总算是可以正常运行啦!谢天谢地你好啦!!!欢迎大家进我的空间,有问题可以在我的空间名字上找到我的联系方式/zhangkai0215/item/0c94e099cae3b83d336eeb0d主函数/*********************************************************Auther :zhang kaiDate :April 3, 2013File :main.cHardware :STC89C52Description :AD7705 driver use STC89C52 as MCU*********************************************************/#include <AT89X51.H>#include "AD7705_IO.h"#include "putchar.h"#include "intrins.h"unsigned char buf[4] = {0,0,0,0};void main(void){unsigned char i;InitUart();for(i=0;i<100;i++){CLR_RST();_nop_();SET_RST();CLR_CS();buf[0] = 0x21;WriteToAD7705(1,buf); //write communication register 0x20 to control the progress to write clock registerbuf[0] = 0x0c;WriteToAD7705(1,buf); //write clock register,50Hz update ratebuf[0] = 0x11;WriteToAD7705(1,buf); //write communication register 0x10 to control the progress to write setup registerbuf[0] = 0x44;WriteToAD7705(1,buf); //write setup register,Self-CalibrationAD7705WaitBusy (); //判忙TR1=1;buf[0] = 0x38;WriteToAD7705(1,buf); //write communication register 0x38 to control the progress to read data registerAD7705WaitBusy ();ReadFromAD7705(2,buf); //read data registeputchar(buf[1]);putchar(buf[0]);}SET_CS();while(1);}。
AD7705输出数据一直是0xffff的问题的解决过程
最近手头上有个16位的高精度ADC,就想着做个测试版调试调试吧,先上自己画的原理图晶振采用4.9152MHz的,复位采用上电复位,复位时间大概1ms 吧!基准使用TL431提供!模拟输入端采用电位器调节。
画板,焊接,写程序!一切都很顺利!调试程序时卡了壳,出现如下问题1、ADC输出数据不变,或者输出一直是oxffff检测硬件供电电压是否正常,5v检测基准电压是否正常,2.5v根据网上和官方的测试版,我感觉硬件设计应该没有太大问题那么目标锁定在软件上,首先怀疑的是时序,芯片上有个引脚DRDY,这个引脚变低时有数据输出,我用逻辑分析仪分析自己模拟SPI的时序,发现时序跟手册上的一样,而且DRDY也会置高和变低!根据这个分析这应该不是自己SPI时序的问题了!经过一早上的看手册,查资料,还是没有头绪,不知道哪来的一个念头,是不是芯片复位没有复位好呢?因为我采用的是上电复位,所以我觉得应该观察上电后输出的第一个数据是否正常,别愣着啦,赶紧测试!哇塞。
数据正确!调整电压,第一次上电后数据依然正确,按下单片机复位键,前几次正确,后面又变为0xffff了。
问题找到啦,芯片复位有问题!我改成单片机控制复位,把ADC的复位引脚接到单片机一个引脚上,通过引脚控制ADC复位,复位时间为10ms。
下载程序,上电测试,发现预期连续采集一百个数据,只输出了四五个!复位重来,效果一样,有时候只输出一个数据,庆幸的是数据都正确啦!这个时候没辙啦。
给adi亚太客服打电话。
至今没给回复。
nngt我还是靠自己吧!上网搜索,终于在一篇帖子中见到可能这么一句话“可能每次读AD7705的数据时都要把clock register,setup register 重新设置一遍,复位重来一遍”不管正确与否,试试再说!改程序,下载,看现象,哇塞!一次性输出100个数据,数据正常!可能大家跟我一样吧,怎么会这个样子呢。
我也很郁闷,手册上找不到连续读数据的时序,手册上看不到为什么这么做就数据正确啦!期待ADI工程师给我回复吧!!!不过总算是可以正常运行啦!谢天谢地你好啦!!!欢迎大家进我的空间,有问题可以在我的空间名字上找到我的联系方式/zhangkai0215/item/0c94e099cae3b83d336eeb0d主函数/*********************************************************Auther :zhang kaiDate :April 3, 2013File :main.cHardware :STC89C52Description :AD7705 driver use STC89C52 as MCU*********************************************************/#include <AT89X51.H>#include "AD7705_IO.h"#include "putchar.h"#include "intrins.h"unsigned char buf[4] = {0,0,0,0};void main(void){unsigned char i;InitUart();for(i=0;i<100;i++){CLR_RST();_nop_();SET_RST();CLR_CS();buf[0] = 0x21;WriteToAD7705(1,buf); //write communication register 0x20 to control the progress to write clock registerbuf[0] = 0x0c;WriteToAD7705(1,buf); //write clock register,50Hz update ratebuf[0] = 0x11;WriteToAD7705(1,buf); //write communication register 0x10 to control the progress to write setup registerbuf[0] = 0x44;WriteToAD7705(1,buf); //write setup register,Self-CalibrationAD7705WaitBusy (); //判忙TR1=1;buf[0] = 0x38;WriteToAD7705(1,buf); //write communication register 0x38 to control the progress to read data registerAD7705WaitBusy ();ReadFromAD7705(2,buf); //read data registeputchar(buf[1]);putchar(buf[0]);}SET_CS();while(1);}。
AD7705及其校准
AD7705及其校准16位∑-Δ模数转换器AD7705及其校准1、AD7705简介AD7705是AD公司推出的16位∑-Δ(电荷平衡式)A/D转换器。
他包括由缓冲器和增益可编程放大器(PGA)组成的前端模拟调节电路、∑-Δ调制器及可编程数字滤波器等,能直接对来自传感器的微弱信号进行A/D转换。
此外他还具有高分辨率、宽动态范围、自校准,低功耗及优良的抗噪声性能,因此非常适用于仪表测量和工业控制等领域。
1.1基本特性AD7705的基本特性为:16位无丢失代码;0.003%的非线性度;PGA可选择1,2,4,8,16,32,64,128;8种增益;输出数据更新速率可编程;具有自校准和系统校准功能,三线串行接口,可缓冲模拟输入;低功耗。
1.2引脚功能AD7705的引脚排列如图1所示,各引脚的功能说明如下:SCLK:串行时钟输入。
MCLK IN:主时钟输入。
时钟频率为500kHz-5MHz。
MCLK OUT:主时钟输出。
CS反:片选,低电平有效。
RESET反:复位。
该端口为低电平时,可以将控制逻辑、接口逻辑、校准系数以及数字滤波器等复位为上电状态;AIN2(+)、AIN2(-):分别为差分模拟输入通道2的正、负输入端。
AIN1(+)、AIN1(-):分别为差分输入通道1得正、负输入端。
REF IN(+)、REF IN(-):分别为参考电压的正、负端。
为了确保元件的正常工作,REF IN(+)端口的输入信号必须大于REF IN(-)端的输入。
DRDY反:逻辑输出。
低电平表示可以读取新的数据转换;高电平时不可读取数据。
IDN,DOUT:分别为串行数据输入和输出端。
1.3片内寄存器AD7705共有8个片内寄存器,他们是通信寄存器、设置寄存器、时钟寄存器、数据寄存器以及几个测试和校准寄存器。
这些寄存器的任何操作都必须先写通信寄存器,然后才能对其他寄存器进行操作。
(1)通信寄存器通信寄存器是一个8位读/写寄存器,写入通信寄存器的数据决定下一次读/写操作在哪一个寄存器上进行,完成对所选寄存器的读/写操作后,该端口等待下一次写操作,这也是通信寄存器的缺省状态,如果在DIN为高电平时,写操作持续的时间足够长(至少32个串行时钟周期),那么AD7705将返回该缺省状态。
AD7705中文资料_数据手册_参数
关于AD7705的技术文档
关于AD7705模块的技术文档一、模块描述1、简介:D7705/7706 是应用于低频测量的2/3 通道的模拟前端。
该器件可以接受直接来自传感器的低电平的输入信号,然后产生串行的数字输出。
利用Σ-∆转换技术实现了16 位无丢失代码性能。
选定的输入信号被送到一个基于模拟调制器的增益可编程专用前端。
片内数字滤波器处理调制器的输出信号。
通过片内控制寄存器可调节滤波器的截止点和输出更新速率,从而对数字滤波器的第一个陷波进行编程。
2、产品性能参数及特点:�AD7705:2 个全差分输入通道的ADC�AD7706:3 个伪差分输入通道的ADC16位无丢失代码0.003%非线性�可编程增益前端增益:1~128�三线串行接口SPITM、QSPITM、MICROWIRETM和DSP 兼容�有对模拟输入缓冲的能力�2.7~3.3V或4.75~5.25V工作电压� 3V电压时,最大功耗为1mW�等待电流的最大值为8μA�16脚DIP、SOIC和TSSOP封3、产品应用场合:AD7705/7706 是用于智能系统、微控制器系统和基于DSP 系统的理想产品。
其串行接口可配置为三线接口。
增益值、信号极性以及更新速率的选择可用串行输入口由软件来配置。
该器件还包括自校准和系统校准选项,以消除器件本身或系统的增益和偏移误差。
二、模块原理图三、引脚功能四、校准1、自校准过向设置寄存器的MD1和MD0写入相应值(0,1),器件开始自校准。
在单极性输入信号范围内,用来确定校准系数的零标度点是用差分输入对的输入端在器件内部短路(即,对于AD7705,AIN(+)=AIN(-)=内部偏置电压;对于AD7706,AIN=COMMON=内部偏置电压)。
增益可编程放大器(PGA)设置为用于零标度校准转换时选定的增益(由通信寄存器内的G1和G0位设置)。
满标度标准转换是在一个内部产生的VREF电压和选定增益的条件下完成的。
校准持续时间是6×1/输出速率。
AD7705的操作
AD7705的操作我现在使用外部TL431(2.5V基准电压),电源电压为5V,外接晶体振荡器2.4576MHz,电路如下:程序如下:--------------------------AD7705.H -----------------------------------#ifndef _AD7705_H_#define _AD7705_H_// 引脚定义sbit AD7705_SCLK = P2^4;sbit AD7705_DRDY = P2^5;sbit AD7705_DOUT = P2^6;sbit AD7705_DIN = P2^7;// 通讯寄存器地址定义#define WR_SETUP_REG 0x10 //选中设置寄存器,写#define RD_SETUP_REG 0x18 //选中设置寄存器,读#define WR_CLOCK_REG 0x20 //选中时钟寄存器,写#define RD_DATA_REG 0x38 //选中数据寄存器,读#define WR_OFFSET_REG 0x60 //选中offset寄存器,写#define RD_OFFSET_REG 0x68 //选中offset寄存器,读#define WR_FULL_REG 0x70 //选中full scale寄存器,写#define RD_FULL_REG 0x78 //选中full scale寄存器,读#define SYS_ZERO_CALI 0x80 //系统零校准模式#define SYS_FULL_CALI 0xC0 //系统满量程校准模式#define ZERO_CALIBRA TION 0x00 //系统零校准#define FULL_CALIBRA TION 0x01 //系统满量程校准#define CLOCK_REG_SET 0x04 //CLOCK寄存器设置,无分频,50HZ 输出更新速率#define DELAY() {_nop_();_nop_();_nop_();}// 函数声明void AD7705_Init(void);void AD7705_Reset(void);void AD7705_Start(void);uchar AD7705_ReadByte(void);void AD7705_WritByte(uchar d);float AD7705_ReadV ol(void);#endif--------------------------AD7705.C -----------------------------------//**************************************************************************** //功能:AD7705串行接口失步后将其复位。
AD7705在智能数字仪表中的应用
控制字节:这个命令选择输入通道,选择寄存器下一个操作是读操作
还是写操作。第二步是读或写选择的寄存器:数据传输周期结束后,
AD7705 又回到默认状态,等待一次写通信寄存器操作。对 AD7705 的
操作流程如图 5 所示。
图 3 写操作时序
写函数(8 bit):
void tx_byte(unsigned char content)
图 2 AD7705 接口电路
5 V。3 V 电压时,最大功耗为 1 mW,等待模式下电源电流仅为 8 μA。
AD7705 与微处理器连接,没有使用单片机的串行口,而是采用普
引脚如图:
通的 I/O 口来模拟串行口。AD7705 的 DRDY 与单片机的 P1.0 相连,
以备单片机来查询 AD7705 的状态。AD7705 的 RST 与单片机的 P1.4
田瑞鑫冬季施工应注意问题的探讨山东建工集团山东济南250014要当室外日平均气温连续5天稳定低于5即进入冬期施工在工程建设施工过程中受自然气候的影响加之工程建设的进度需要有时不可避免的要进行冬期施工本文就冬期施工过程中注意的问题进行探讨
科技信息
○机械与电子○
SCIENCE & TECHNOLOGY INFORMATION
换函数的增益斜率,元件内部通过 33 位分辨率决定 16 位的转换结
果。每当环境温度和工作电压发生变化时,或者器件的工作状态改变,
如输入通道切换、增益或数字滤波器第一凹口频率变动、信号输入范
围变化等任何一项发生时,必须进行一次校准。对于自校准方式,校准
过程在器件内部一次完成。AD7705 内部设置 AIN(+)端和 AIN(- )端为
除引线电阻及干扰所引起的误差,提高测量精度。各种接线方式中,三
AD7705在起重机控制器中的应用
河南科技上河南职业技术学院机电系赵玉剑在起重机智能控制器中,限重拉力传感器采用应变式传感器,输出的是比较微弱的模拟信号,抗干扰能力差。
若用传统的电路设计方法,则需在A/D 之前增加一级或多级高精度放大器,这样不仅增加了成本和提高了系统的复杂性,而且还会出现外部低频(如工频)干扰和放大器漂移的情况。
为此,该控制器的A/D 芯片选用AD7705,避免了上述问题的出现,且转换精度也能满足系统的要求。
一、AD7705简介AD7705是AD 公司推出的应用于低频测量的2通道模拟前端。
该器件可以接受直接来自传感器的低电平输入信号,然后产生串行的数字输出。
利用∑-△转换技术实现了16位无丢失代码的性能。
1.AD7705的特点。
2个全差分输入通道,16位无丢失代码,0.003%非线性。
可编程增益为1~128。
三线串行接口SPITM 、QS PITM 、MICROWIRETM 和DS P 兼容。
有对模拟输入缓冲的能力。
2.7~3.3V 或4.75~5.25V 工作电压。
在3V 电压时,最大功耗为1Mw 。
等待电流的最大值为8μA 。
16脚DIP 、S OIC 和TS SOP 封装。
2.AD7705的引脚排列与功能。
AD7705的引脚排列如图1所示,各引脚的功能说明如下。
S CLK :串行时钟,施密特逻辑输入。
MCLK IN :转换器提供主时钟信号。
可以是晶振时钟或外部时钟,其频率范围为500kHz ~5MHz 。
M LK OUT :时钟信号输出。
当用晶振作为芯片的工作时钟时,晶振接在M LK IN 和M LK OUT 之间。
如果采用外部时钟时,则MCLK OUT 将提供一个反向时钟信号。
该时钟的输出可以通过编程来关闭从而节省能耗。
/CS :片选端,低电平有效。
/RES ET :复位输入端。
低电平有效的输入,将器件的控制逻辑、接口逻辑、校准系数、数字滤波器和模拟调制器复位至上电状态。
AIN1(+)、A IN1(-):为第1个差分输入通道的正端与负端。
ad7705技术参数
ad7705 技术参数
AD7705 美国模拟器件公司(其在中国注册公司为:亚德诺半导体技术有限公司)生产的模数转换器。
AD7705 为完整16 位、低成本、Σ- Δ型ADC,适合直流和低频交流测量应用。
其具有低功耗(3 V 时最大值为1 mW)特性,因而可用于环路供电、电池供电或本地供电的应用中。
片内可编程增益放大器提供从1 至128 的增益设置,无需使用外部信号调理硬件便可接受低电平和高电平模拟输入。
ad7705 技术参数:
采用双列16 脚封装。
带信号调理、1mW 功耗,是AD 公司出品的适用于低频测量仪器的AD 转换器。
它能将从传感器接收到的很弱的输入信号直接转换成串行数字信号输出,而无需外部仪表放大器。
采用Σ-
Δ的ADC,实现16 位无误码的良好性能,片内可编程放大器可设置输入信号增益。
通过片内控制寄存器调整内部数字滤波器的关闭时间和更新速率,可设置数字滤波器的第一个凹口。
在+3V 电源和1MHz 主时钟时,
AD7705 功耗仅是1mW。
AD7705 是基于微控制器(MCU)、数字信号处理器(DSP)系统的理想电路,能够进一步节省成本、缩小体积、减小系统的复杂性。
应用于微处理器(MCU)、数字信号处理(DSP)系统,手持式仪器,分布式数据采集系统。
AD7705调试注意事项
AD7705应用总结:最近用到了AD7705,先将AD7705的应用经验以及注意要点总结如下,这些经验同样适用于AD7799、AD7706等AD公司的拥有校准功能的AD芯片。
1.时序注意要点:数字接口迷失的时候可以通过ADIN输入持续32个脉冲周期(DCLK)以上的高电平将复位AD7705的数字接口,复位之后要等待500us 以上才能访问AD7705芯片,这种复位方式不会影响AD7705内部的任何寄存器,所有的寄存器将保持复位之前的内容,但所有的寄存器在数字接口迷失的状态下内容是不确定的,因此强烈建议在复位之后重新设置AD7705内部所有的寄存器,防止错误。
而芯片管脚RESET的复位将使片内所有的寄存器恢复到上电的默认值。
时钟输入信号DCLK是一种施密特出发信号,能够适应光耦合器的慢速边沿,其他数字输入信号的上升和下降时间不应超过1us。
2.AD7705时钟大于2M时,时钟设置寄存器的CLK位应置1,小于2M时应置0。
DCLK的脉冲宽度要满足最小的脉宽要求。
在时钟DCLK下降之后的低电平期间读取数据ADOUT。
在时钟DCLK的低电平期间设置要写入数据ADIN,然后在DCLK的上升沿写入到7705。
写入数据以及读取数据的时钟DCLK的数目要与(被写入或被读取的寄存器)的位数长度一致,多于或少于(寄存器位长度)的时钟DCLK数目都将导致操作错误。
在两次写操作之间,ADIN应最好保持在高电平:因为任何(读或写)操作都必须从写通信寄存器开始,而且写入通信寄存器的8个位中的第1位必须为0,后续的位才能被写入到通信寄存器。
所以当ADIN为0的时候,万一时钟DCLK受到干扰导致0写入通信寄存器,AD7705会误认为是写通信寄存器的操作开始而等待后续的7位位串,发生这种干扰之后会导致AD7705的数字接口迷失,从而导致内部寄存器的内容也许会变得未知状态。
此外,时钟信号DCLK在两次操作AD7705之间要保持高电平。
AD7705_最好的中文资料
CS
择,或在与 AD7705/7706 通信时,CS可用作帧同步信号 复位输入。低电平有效的输入,将器件的控制逻辑、接口逻辑、校准系 5 RESET 数、数字滤波器和模拟调制器复位至上电状态 对于 AD7705,差分模拟输入通道 2 的正输入端。对于 AD7706,模拟输入 6 AIN2(+)[AIN1] 通道 1 的输入端 对于 AD7705,差分模拟输入通道 1 的正输入端;对于 AD7706,模拟输入 7 AIN1(+)[AIN2] 通道 2 的输入端 对于 AD7705,差分模拟输入通道 1 的负输入端;对于 AD7706,COMMON 输 8 AIN1(-)[COMMON] 入端,模拟通道 1、2、3 的输入以此输入端为基准 基准输入端。AD7705/7706 差分基准输入的正输入端。基准输入是差分 9 REFIN(+) 的,并规定 REFIN(+)必须大于 REFIN(-)。REFIN(+)可以取 VDD 和 GND 之 间的任何值 基准输入端。AD7705/7706 差分基准输入的负输入端。REFIN(-)可以取 10 REFIN(-) VDD 和 GND 之间的任何值,且满足 REFIN(+)大于 REFIN(-) 对于 AD7705,差分模拟输入通道 2 的负输入端。对于 AD7706,模拟输入 11 AIN2(-)[AIN3] 通道 3 输入端 逻辑输出。这个输出端上的逻辑低电平表示可从 AD7705/7706 的数据寄存 器获取新的输出字。完成对一个完全的输出字的读操作后, DRDY引脚立即 回到高电平。如果在两次输出更新之间,不发生数据读出, DRDY将在下一 12
———— ————
————
13
DOUT
14 15 16
AD7705/7706在仪器仪表中的应用 工业控制 解决方案
由于模拟输入和基准输入是差分的,模拟调制器的大部分电压都是共模电压,AD770 5/7706 的良好的共模抑制性能能消除这些共模输入信号里的共模噪声,数字滤波器能抑 制供电电源产生的除了调制器采样频率整数倍的频率以外的宽带噪声。此外 ,数字滤波器 还能消除模拟和基准输入信号里的噪声不使模拟调制器饱和。但是,由于它的分辨率太高, 而要求的噪声电平太小,所以,必须注意接地和电路布线。
(1) 低价格、高性能 (2) 集成化的数字滤波 (3) 与 DSP 技术的兼容性便于实现系统集成
AD7705/7706 是利用 Σ-△转换技术实现了 16 位无丢失代码性能。该器件可以接受 直接来自传感器的低电平的输入信号,然后产生串行的数字输出。
AD7705/7706 只需 2.7~3.3V 或 4.75~5.25V 单电源。AD7705 是双通道全 差分模拟输入,而 AD7706 是 3 通道伪差分模拟输入,二者都有一个差分基准输入。当电 源电压为 5V、基准电压为 2.5V 时,这二种器件都可将输入信号范围从 0~20mA 到 0~ 2.5V 的信号进行处理。还可以处理±20mV~±2.5V 的双极性输入信号。当电源电压为 3 V、基准电压为 1.225V 时,可处理 0~10mV 到 0~1.225V 的单极性输入信号,它的 双极性输入信号范围是±10mV 到±1.225V 对于 AD7705 是以 AIN(-)输入端为参考点,而 AD7706 是 COMMON 输入端。AD7705/7706 是用于智能系统、微控制器系统和基于 D SP 系统的理想产品。其串行接口可配置为三线接口。增益值、信号极性以及更新速率的 选择可用串行输入口由软件来配置。该器件还包括自校准和系统校准选项,以消除器件本 身或系统的增益和偏移误差。
AD7705输出数据一直是0xffff的问题的解决过程
最近手头上有个16位的高精度ADC,就想着做个测试版调试调试吧,先上自己画的原理图晶振采用4.9152MHz的,复位采用上电复位,复位时间大概1ms 吧!基准使用TL431提供!模拟输入端采用电位器调节。
画板,焊接,写程序!一切都很顺利!调试程序时卡了壳,出现如下问题1、ADC输出数据不变,或者输出一直是oxffff检测硬件供电电压是否正常,5v检测基准电压是否正常,2.5v根据网上和官方的测试版,我感觉硬件设计应该没有太大问题那么目标锁定在软件上,首先怀疑的是时序,芯片上有个引脚DRDY,这个引脚变低时有数据输出,我用逻辑分析仪分析自己模拟SPI的时序,发现时序跟手册上的一样,而且DRDY也会置高和变低!根据这个分析这应该不是自己SPI时序的问题了!经过一早上的看手册,查资料,还是没有头绪,不知道哪来的一个念头,是不是芯片复位没有复位好呢?因为我采用的是上电复位,所以我觉得应该观察上电后输出的第一个数据是否正常,别愣着啦,赶紧测试!哇塞。
数据正确!调整电压,第一次上电后数据依然正确,按下单片机复位键,前几次正确,后面又变为0xffff了。
问题找到啦,芯片复位有问题!我改成单片机控制复位,把ADC的复位引脚接到单片机一个引脚上,通过引脚控制ADC复位,复位时间为10ms。
下载程序,上电测试,发现预期连续采集一百个数据,只输出了四五个!复位重来,效果一样,有时候只输出一个数据,庆幸的是数据都正确啦!这个时候没辙啦。
给adi亚太客服打电话。
至今没给回复。
nngt我还是靠自己吧!上网搜索,终于在一篇帖子中见到可能这么一句话“可能每次读AD7705的数据时都要把clock register,setup register重新设置一遍,复位重来一遍”不管正确与否,试试再说!改程序,下载,看现象,哇塞!一次性输出100个数据,数据正常!可能大家跟我一样吧,怎么会这个样子呢。
我也很郁闷,手册上找不到连续读数据的时序,手册上看不到为什么这么做就数据正确啦!期待ADI工程师给我回复吧!!!不过总算是可以正常运行啦!谢天谢地你好啦!!!欢迎大家进我的空间,有问题可以在我的空间名字上找到我的联系方式/zhangkai0215/item/0c94e099cae3b83d336eeb0d主函数/*********************************************************Auther :zhang kaiDate :April 3, 2013File :main.cHardware :STC89C52Description :AD7705 driver use STC89C52 as MCU*********************************************************/#include <AT89X51.H>#include "AD7705_IO.h"#include "putchar.h"#include "intrins.h"unsigned char buf[4] = {0,0,0,0};void main(void){unsigned char i;InitUart();for(i=0;i<100;i++){CLR_RST();_nop_();SET_RST();CLR_CS();buf[0] = 0x21;WriteToAD7705(1,buf); //write communication register 0x20 to control the progress to write clock registerbuf[0] = 0x0c;WriteToAD7705(1,buf); //write clock register,50Hz update ratebuf[0] = 0x11;WriteToAD7705(1,buf); //write communication register 0x10 to control the progress to write setup registerbuf[0] = 0x44;WriteToAD7705(1,buf); //write setup register,Self-CalibrationAD7705WaitBusy (); //判忙TR1=1;buf[0] = 0x38;WriteToAD7705(1,buf); //write communication register 0x38 to control the progress to read data registerAD7705WaitBusy ();ReadFromAD7705(2,buf); //read data registeputchar(buf[1]);putchar(buf[0]);}SET_CS();while(1);}。
AD7705的操作
AD7705的操作
AD7705是由Analog Devices公司推出的一款基于模拟/数字混合技
术的通用称重接口单元,其将模拟信号转换成数字信号,便于数字系统进
行处理,可以将传感器集成到数字系统中,实现多功能的称重系统。
AD7705有两种型号:AD7705-1和AD7705-2,其中,AD7705-1具有单
路输入,4种模拟量输入类型(电阻、电容、电压、电流),可定义的模
式和参考电压,2倍长量程和可编程滤波器,而AD7705-2则具有双路输入,其他参数相同。
采用的控制和数据通信接口包括UART,SPI,I2C和PWM/INTEGER。
一、精度高:以电流输入(TARA补偿)为例,其满量程误差最小可
达0.08%(最大满量程100克),实测偏差不大于0.2%,所以可以用于
仪表和计量定量计量应用。
二、模式多样性:AD7705可定制4种模式,分别是SCALE,
SCALE&HOLD,CONTINUOUS,CONTINUOUS&HOLD,可根据仪器的不同应用来
设置合适的模式,以提高AD7705的灵活性。
三、可编程参数:AD7705可编程参数,包括量程、模式,参考电压,滤波器等参数,可以根据实际应用需要,编程满足应用需求。
四、安全功能:AD7705具有3种安全功能,可以有效保护被测设备
的安全,它们分别是超载保护,超电压保护和超电容保护。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void lcd_write_comm(unsigned char comm)
{
lcd_busy_chek();
LCD_CTRL_PORT&=~LCD_RW; //WRITE
LCD_CTRL_PORT&=~LCD_RS; //RS=0
LCD_DATA_PORT=comm;
LCD_CTRL_PORT^=LCD_RW; //WRITE
}
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *p) //写数据
{
lcd_posion(x,y);
while(*p)
_delay_ms(88);
lcd_write_comm(0x01); //清屏
lcd_write_str(0,0,"remember mydream");
lcd_write_str(0,1,"I will be winner");
PORTD=1<<(count++%8);
#define LCD_RW 0X02
#define LCD_EN 0X04
//读取类型
#define read_comm 0
#define read_data 1
//数据端口
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PORT PORTA
lcd_en_signal();
LCD_CTRL_PORT^=LCD_RS; //CONVERSE RS
LCD_CTRL_PORT^=LCD_RW; //WRITE
}
void lcd_posion(unsigned char x,unsigned char y)
lcd_write_comm(0x01); //清屏
lcd_write_str(0,0,"dfgfhfgj");
lcd_write_str(0,1,"shfghjhgkgk");
PORTD=1<<(count++%8);
for(unsigned char i=0;i<200;i++)
LCD_DATA_PORT = 0XFF;
LCD_CTRL_PORT&=~LCD_RS;
LCD_CTRL_PORT|=LCD_RW; //read
//为什么这里换成函数lcd_en_signal()却不行???
LCD_CTRL_PORT&=~LCD_EN;
#include <avr/io.h>
#include <avr/delay.h>
//控制端口
#define LCD_CTRL_DDR DDRB
#define LCD_CTRL_PORT PORTB
#define LCD_CTRL_PIN PINB
#define LCD_RS 0X01
{
unsigned char address;
if(y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
lcd_write_comm(address);
}
void lcd_write_data(unsigned char data)
_delay_us(1);
LCD_CTRL_PORT&=~LCD_EN;
}
main()
{
PORTD=0X00;
DDRD=0XFF;
unsigned count=0;
lcd_init();
while(1)
{
temp=LCD_DATA_PIN;
LCD_CTRL_PORT^=LCD_RW; //CONVERSE RW
LCD_CTRL_PORT^=LCD_RS; //CONVERSE RS
return temp;
}
void lcd_busy_chek(void)
{
LCD_DATA_DDR = 0X00;
LCD_DATA_PORT = 0X00;
LCD_DATA_DDR = 0XFF;
}
void lcd_en_signal(void)
{
LCD_CTRL_PORT&=~LCD_EN;
_delay_us(1);
LCD_CTRL_PORT|=LCD_EN;
{
lcd_write_data(*p);
p++;
}
}
unsigned char lcd_read_char(unsigned char read_type)
{
unsigned char temp;
l=read_comm) //read comm
_delay_us(1);
LCD_CTRL_PORT|=LCD_EN;
_delay_us(1);
LCD_CTRL_PORT&=~LCD_EN;
while( LCD_DATA_PIN&0X80 )
{
LCD_CTRL_PORT&=~LCD_EN;
{
lcd_busy_chek();
LCD_CTRL_PORT&=~LCD_RW; //WRITE
LCD_CTRL_PORT|=LCD_RS; //RS=0
LCD_DATA_PORT = data;
lcd_en_signal();
LCD_CTRL_PORT^=LCD_RS; //CONVERSE RS
#define LCD_DATA_PIN PINA
void lcd_init(void); //LCD初始化
void lcd_write_comm(unsigned char comm); //写命令
void lcd_write_data(unsigned char data); //写数据
_delay_us(1);
LCD_CTRL_PORT|=LCD_EN;
_delay_us(1);
LCD_CTRL_PORT&=~LCD_EN;
}
/*
lcd_en_signal();
while( LCD_DATA_PIN&0X80 )
LCD_DATA_DDR=0XFF;
lcd_write_comm(0x3f); //功能设置,8位数据,两行显示,5X10
lcd_write_comm(0x06); //输入方式设置
lcd_write_comm(0x0f); //显示开关设置
lcd_write_comm(0x01); //清屏
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *p); //写字符串
unsigned char lcd_read_char(unsigned char read_type); //读取
void lcd_posion(unsigned char x,unsigned char y); //位置设定
{
lcd_en_signal();
}
*/
//为什么这里换成函数lcd_en_signal()却不行???
LCD_CTRL_PORT^=LCD_RW; //CONVERSE RW
LCD_CTRL_PORT^=LCD_RS; //CONVERSE RS
void lcd_busy_chek(void);
void lcd_en_signal(void);
void lcd_init(void)
{
LCD_CTRL_PORT=0x00;
LCD_CTRL_DDR= 0xff;
LCD_DATA_PORT=0X00;
{
LCD_CTRL_PORT&=~LCD_RS;
}
else //read data
{
LCD_CTRL_PORT|=LCD_RS;
}
LCD_CTRL_PORT|=LCD_RW; //read
lcd_en_signal();
for(unsigned char j=0;j<200;j++)
_delay_ms(88);
}
}