AD7705 应用补充说明 附完整程序
AD7705 性价比比较高的 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 7
extern void SpiInit(void); // SPI 初始化 M16
extern 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 intj;
for(;t>0;t--)
for(j=0;j<70;j++);
}
// SPI 初始化 M16
void 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 SPI
SET_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;
}
//复位 AD7705
void 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置为输出低电平,使能 AD7705
ResetAD() ;
TransmitterSpi(0x20); //通讯寄存器 //通道 1,下一个写时钟寄存器 自校准
TransmitterSpi(0x00); //时钟寄存器 //写时钟寄存器设置 2.459Mhz更新速率为20hz
TransmitterSpi(0x10); //通讯寄存器 //通道 1,下一个写设置寄存器
TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极 ,缓冲
delay50us(100); //延时
TransmitterSpi(0x21); //通讯寄存器 //通道 2,下一个写时钟寄存器 自校准
TransmitterSpi(0x00); //时钟寄存器 //写时钟寄存器设置 2.459Mhz更新速率为20hz
TransmitterSpi(0x11); //通讯寄存器 //通道 2,下一个写设置寄存器
TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极,缓冲
delay50us(100);
}
//*************************** 按照通道 1 读取 ****************************//
unsigned intReadDataCH1(void)
{
unsigned intgetData = 0;
unsigned char bufR;
TransmitterSpi(0x10); //通讯寄存器 //通道 1,下一个写设置寄存器
TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极 ,缓冲
while(PINB&(1<<CS_DRDY)); //等待校准完成READY 信号变为低电平
TransmitterSpi(0x38); //发送 0x38 读取 CH1 数据寄存器
while(PINB&(1<<CS_DRDY)); //等待 READY 信号变为低电平
bufR=TransmitterSpi(0xff);//转换结果高位
bufR=TransmitterSpi(0xff);//转换结果低位
getData=(bufR<<8)|bufR;//获得数据 16 位
return getData ; //返回数据
}
//***************************按照通道 2 读取****************************//
unsigned intReadDataCH2(void)
{
unsigned intgetData = 0;
unsigned char bufR;
TransmitterSpi(0x11); //通讯寄存器 //通道 1,下一个写设置寄存器
TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极 ,缓冲
while(PINB&(1<<CS_DRDY)); //等待校准完成 READY 信号变为低电平
TransmitterSpi(0x39); //发送 0x01 读取 AD7705 数据寄存器
while(PINB&(1<<CS_DRDY)); //等待 READY 信号变为低电平
bufR=TransmitterSpi(0xff);//转换结果高位
bufR=TransmitterSpi(0xff);//转换结果低位
getData=(bufR<<8)|bufR; //读取数据前 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();
}
}
天涯过客
程序文件ourdev_504515.rar(文件大小:18K) (原文件名:AD7705.rar) 顶 谢啦! mark 谢谢 mark mark!~~ 记号 楼主无私。顶一下 ./emotion/em025.gif 程序不错 AD7705单通道用得很好.但第二个通道从来没正常过,一般是正常值的一半.
原因也一直没找到.不知是芯片不行还是我不行.
按楼主的方法试试看行不行.
另外楼主的AD7705多少钱买的.我买的好像30左右.
TM7708 24位的10元左右,以前买的,感觉还可以,现在应该有新型号了. 谢谢 好贵的东东啊 不错 mark mark MARK HYLG 发表于 2010-8-2 12:58 static/image/common/back.gif
AD7705单通道用得很好.但第二个通道从来没正常过,一般是正常值的一半.
原因也一直没找到.不知是芯片不行还 ...
请问你的正常了吗?我的老喜欢死机...... 死机跟时序有关系。 {:victory:}{:victory:}{:handshake:} HYLG 发表于 2012-9-19 16:13 static/image/common/back.gif
死机跟时序有关系。
恩 找到原因了!是换通道是初始化没弄好! {:smile:}{:smile:}{:smile:} 记号,最近准备用7705,谢谢楼主 {:smile:}{:smile:} 建议不用这个吧,抗干扰性太差 正需要啊,谢谢分享 谢谢楼主慷慨分享 mark 感谢楼主 谢谢楼主。 马克,留有后续运用。谢谢楼主 gzhmcu 发表于 2013-8-12 15:00
建议不用这个吧,抗干扰性太差
请教一下有没有能可靠分辨100uv的AD,一开始也准备有AD7705. 我可以直白一点吗?将这个程序用在工业环境,绝对死翘翘。AD7705虽然简单,但要工业环境下365x7x24小时不间断工作,是有一番学问的。 另外,通道切换,无需自校准,只是需要一些时间等sin5滤波器稳定。 原来弄过7715
就是觉得这ad的片子好贵的说 看看 还是可以备份 amigenius 发表于 2015-3-8 10:59
我可以直白一点吗?将这个程序用在工业环境,绝对死翘翘。AD7705虽然简单,但要工业环境下365x7x24小时不间 ...
前辈,请教您一下:AD7705在工业或者电磁干扰比较严重的情况下运行,要注意哪些细节?谢谢!! 原来也想用AD7705,有时间研究一下,谢谢! {:titter:}价格¥太高,就用 Tm7705凑合一下 谢谢坛友,看了部分代码,突然有灵感修正一个令我恼怒的bug TransmitterSpi(0x11); //通讯寄存器 //通道 1,下一个写设置寄存器
TransmitterSpi(0x48); //设置寄存器 //自校准,增益 1,双极 ,缓冲
while(PINB&(1<<CS_DRDY)); //等待校准完成 READY 信号变为低电平
TransmitterSpi(0x39); //发送 0x01 读取 AD7705 数据寄存器
while(PINB&(1<<CS_DRDY)); //等待 READY 信号变为低电平---->不能在这里再判断DRDY,否则异常。
bufR=TransmitterSpi(0xff);//转换结果高位
bufR=TransmitterSpi(0xff);//转换结果低位 好东西,谢谢楼主的分享!!!!!!!! 留下了 性价比高的芯片 我都不敢用7705了,端口容易迷失。 zxd0225 发表于 2018-4-8 10:36
我都不敢用7705了,端口容易迷失。
你好,请问一下端口迷失是什么意思?有什么现象。最近我也用到这个片子也出现莫名其妙的问题。 zxd0225 发表于 2018-4-8 10:36
我都不敢用7705了,端口容易迷失。
这个才是含金量的东西 zxd0225 发表于 2018-4-8 10:36
我都不敢用7705了,端口容易迷失。
我可以告诉您AD7705(不是TM),可以做到在5Kv EFT环境下,24*7*365一直不间断稳定工作吗?
amigenius 发表于 2018-6-22 10:07
我可以告诉您AD7705(不是TM),可以做到在5Kv EFT环境下,24*7*365一直不间断稳定工作吗?
...
请问一下采取什么措施能避免端口迷失?或者端口迷失不可避免的话,在端口迷失后怎样操作,我现在做的是每次读取之前先发送56个脉冲,但这样还不敢确定不出问题。谢谢 感谢楼主, 收藏了。 天微的TM7705TM7708 怎么样? 价格降成了白菜 不知道稳定性如何 mark一下,留着学习 7705抗干扰比较差,我用接触器打打里面的寄存器的数据就乱掉了 又长见识了 经典款adc 正正在用这个芯片
页:
[1]