AD7705双通道的应用程序奉献给大家
奉献给大家AD7705的双通道应用程序~~~~~#include<reg52.h>
#define CH1 1 /*AD7705输入通道IN1*/
#define CH2 2 /*AD7705输入通道IN2*/
#define BIPOLAR 0 /*AD7705双极性输入*/
#define UNIPOLAR 1 /*AD7705单极性输入*/
#define AD_CLK_WIDTH 1 /*AD7705串口时钟脉冲宽度*/
sbit AdClk=P1^0; /*AD7705时钟脉冲*/
sbit AdDin=P1^1; /*AD7705数据输入脉冲*/
sbit AdDout=P1^2; /*AD7705数据输出的反相脉冲*/
sbit AdDrdy=P1^3; /*指定转换标志位*/
sbit AdReset=P1^4;/*复位*/
void Wait7705(unsigned int t);/* AD7705软件延时 */
void WriteByte7705(unsigned char x);/* 向AD7705写入一个字节 */
unsigned int ReadWord7705(void);/* 从AD7705读一个字节 */
void Reset7705(void);/* AD7705通信端口复位 */
void Init7705_1();
void Init7705_2();
unsigned int GetData7705_ch1();/* 读AD7705转换数据 输入通道channel ----1=IN1,2=IN2;*/
unsigned int GetData7705_ch2();/* 读AD7705转换数据 输入通道channe2 ----1=IN1,2=IN2;*/
void main()
{
_nop_();
_nop_();
_nop_();
AdClk=1;//AD7705时钟脉冲
AdDin=1; //AD7705数据输入脉冲
AdDout=1; //AD7705数据输出的反相脉冲
AdReset=1;
Wait7705(100);//软件延时
AdReset=0;//复位
Wait7705(100);
AdReset=1;
Wait7705(100);
while(1)
{
get_ad();
}
}
void Wait7705(unsigned int t)/* AD7705软件延时 */
{
for( ;t>0 ;t-- );
}
/* 向AD7705写入一个字节 */
void WriteByte7705(unsigned char x)
{
unsigned char i;
for (i=0;i<8;i++)
{
AdClk=0;
Wait7705(AD_CLK_WIDTH);
AdDin=(bit)(x&0x80);
Wait7705(AD_CLK_WIDTH);
AdClk=1;
Wait7705(AD_CLK_WIDTH);
x<<=1;
}
}
/* 从AD7705读一个字 */
unsigned int ReadWord7705(void)
{
unsigned char i;
unsigned int x ;
AdClk=1;
for(i=0,x=0;i<16;i++)
{
AdClk=0;
Wait7705(AD_CLK_WIDTH);
x<<=1;
if(AdDout)
x|=0x01;
AdClk=1;
Wait7705(AD_CLK_WIDTH);
}
return x;
}
/* AD7705通信端口复位 */
void Reset7705(void)
{
unsigned char i;
for(i=0;i<64;i++)
{ /* 多于连续32个 DIN=1 使串口复位 */
AdClk=0;
Wait7705(AD_CLK_WIDTH);
AdDin =1;
Wait7705(AD_CLK_WIDTH);
AdClk=1;
Wait7705(AD_CLK_WIDTH);
}
}
void Init7705_1()
{
unsigned char i;
for(i=10;i>0;i--)
{WriteByte7705(0xff);}//持续DIN高电平写操作,恢复AD7705接口
Reset7705(); /* 防止串口失步 */
WriteByte7705(0x20); /* 写ch0 clock register */
WriteByte7705(0x00); /* 2.4576MHz时钟,20Hz数据更新速率 */
WriteByte7705(0x10); /*选择设置寄存器,使用chnanel 1*/
WriteByte7705(0x44);
}
void Init7705_2()
{
unsigned char i;
for(i=10;i>0;i--)
{WriteByte7705(0xff);}//持续DIN高电平写操作,恢复AD7705接口
Reset7705(); /* 防止串口失步 */
WriteByte7705(0x21); /* 写ch1 clock register */
WriteByte7705(0x00); /* 2.4576MHz时钟,20Hz数据更新速率 */
WriteByte7705(0x11); /*选择设置寄存器,使用chnanel 2*/
WriteByte7705(0x44);
}
/* 读AD7705转换数据 输入通道channel ----1=IN1,2=IN2;*/
unsigned int GetData7705_ch1()
{
unsigned int temp1=0;
Init7705_1();
Wait7705(10);
while(AdDrdy==1); //数据准备好
WriteByte7705(0x38);
temp1=ReadWord7705();//读取
return temp1;
}
/* 读AD7705转换数据 输入通道channe2 ----1=IN1,2=IN2;*/
unsigned int GetData7705_ch2()
{
unsigned int temp2=0;
Init7705_2();
Wait7705(10);
while(AdDrdy==1) //数据准备好
WriteByte7705(0x39);
temp2=ReadWord7705();//读取
return temp2;
} 记号 谢谢楼主。 好人呀! 正需要。 好样的 这东东不好买哦,一个就要50大洋,听说,在电子城找了几天 好样的 AD7705 这款芯片的转化精度比较高,可靠位可以达到15位。但是需要注意以下两点
1:转换过程中需要注意切换通道的时候需要在切换后延时一段时间然后启动AD转换,频繁的切换会导致精度下降,一般采用双通道同时输入的方案,都是低功耗低速考虑的。
2:数据传输过程中要考虑AD7705的“端口迷失”问题,需要加入硬件定时器定时检测AD7705的“就绪”状态,如果超时需要进行硬件复位从新初始化。在设计过程中遇到过因外部干扰导致的这种问题。 mark mark 好 mark {:smile:}{:smile:}{:smile:}{:smile:} 正打算使用!收藏!!{:sad:} 怎么找回我的id号呢?楼主这个id就是我的啊! 马克正用到谢谢
不知道LZ是否测试通道切换后第一个数据是否可用? mark hhahaha portx 发表于 2009-9-5 00:33 static/image/common/back.gif
AD7705 这款芯片的转化精度比较高,可靠位可以达到15位。但是需要注意以下两点
1:转换过程中需要注意切换通 ...
我也遇到过这种问题 marshallemon 发表于 2012-6-18 21:53 static/image/common/back.gif
不知道LZ是否测试通道切换后第一个数据是否可用?
切换通道后第一个数据可以使用,要注意AD7705这个芯片只适合测量相对静态的信号“内部采样速度很低”,要把握好这个尺度否则每次输出的结果会相差很大。 学习了~ 谢谢分享~ LZ,请教一下,没读一次AD值都要复位一下,重写寄存器???? 多谢楼主啊,解决大问题了!{:biggrin:} 参考一下,等调通了再回来赞一个。 调试成功,谢谢楼主了。 学习了,正用到这个芯片 学习了,正用到这个芯片 顶一个,楼主威武! Mark一下,现在在用这个呢 正在学习 顶一个 好东西 学习了正好用到调试一下 正好要用到,做个记号 谢谢,正准备使用这个芯片。 谢谢分享!!!!
页:
[1]