📄 ad7706.c
字号:
/*
*********************************************************************************************************
* File Name: AD7706.c
*
* Last Modified Data: 2006-08-14
*
* Last Version:V1.0
*
* Description:完成对AD7706的控制
*
*********************************************************************************************************
*/
#define _AD7706_
#include <intrins.h>
#include "..\Inc\Include.h"
/*
********************************************************************************************************
* Function:RestAd7706
*
* Descriptions:复位AD7706
*
* Input:无
*
* OutPut:无
*******************************************************************************************************
*/
void RestAd7706(void)
{
uchar i;
uint k=0;
bit c=1;
ADXiao=0;
Seq();
WriteToReg(0x20); //0010 0000 写AIN1的时钟寄存器
WriteToReg(0x0c); //0000 1100
WriteToReg(0x10); //0001 0000 写ANI1的设置寄存器
WriteToReg(0x44); //0100 0100
do
{
WriteToReg(0x08);
i = ReadReg();
k++;
if(k>5000) { c=0; ADXiao=1; }
}while(i&0x80&&c);
Delay3ms();
WriteToReg(0x21); //*clock register 0010 0001写AIN2的时钟寄存器
WriteToReg(0x0c); // 0000 1100
WriteToReg(0x11); //*setup register 0001 0001写ANI2的设置寄存器
WriteToReg(0x44); //44 0100 0100
do
{
WriteToReg(0x09); // 0000 1001
i = ReadReg();
k++;
if(k>5000) { c=0; ADXiao=1; }
}while(i&0x80&&c);
Delay3ms();
WriteToReg(0x22); //*clock register 0010 0010
WriteToReg(0x0c); // 0000 1100设置输出更新速率
WriteToReg(0x12); //*setup register 0001 0010
WriteToReg(0x44); //32倍 0100 0100用于选择工作模式和输入增益
do
{
WriteToReg(0x0a); //0000 1010
i=ReadReg();
k++;
if(k>5000) { c=0; ADXiao=1; }
}while(i&0x80&&c);
Delay3ms();
WriteToReg(0x23); //*clock register 0010 0011写AIN3的时钟寄存器
WriteToReg(0x0c); // 0000 1100
WriteToReg(0x13); //*setup register 0001 0011写ANI3的设置寄存器
WriteToReg(0x44); // 0100 0100
do
{
WriteToReg(0x0b); //0000 1011
i=ReadReg();
k++;
if(k>5000) { c=0; ADXiao=1; }
}while(i&0x80&&c);
Delay3ms();
}
/*
********************************************************************************************************
* Function:Seq
*
* Descriptions:
*
* Input:无
*
* OutPut:无
*******************************************************************************************************
*/
void Seq(void)
{
uchar i;
i = 40;
ADSCLK1;
ADSCLK0;
ADDIN1;
for(i=0;i<31;i++)
{
ADSCLK1;
ADSCLK0;
}
ADSCLK1;
}
/*
********************************************************************************************************
* Function:ReadReg
*
* Descriptions:读寄存器的状态
*
* Input:无
*
* OutPut:无
*******************************************************************************************************
*/
uchar ReadReg(void)
{
uchar x = 0;
uchar i = 8;
SDA_1=1;
ADSCLK0;
do{
ADSCLK1;
if(SDA_1)
x = x|0x01;
if(i>1)
{
x=x<<1;
ADSCLK0;
}
}while(--i);
return x;
}
/*
********************************************************************************************************
* Function:WriteToReg
*
* Descriptions:向AD7706的寄存器写数据
*
* Input:x 需要写入的数据
*
* OutPut:无
*******************************************************************************************************
*/
void WriteToReg(uchar x)
{
uchar i = 8;
do{
ADSCLK0;
if(x&0x80) ADDIN1;
else ADDIN0;
x = x<<1;
ADSCLK1;
}while(--i);
}
/*
********************************************************************************************************
* Function:ReadData
*
* Descriptions:读AD7706转换的数据
*
* Input:无
*
* OutPut:返回AD7706的状态
*******************************************************************************************************
*/
uint ReadData(void)
{
uint x=0;
uchar i=16;
SDA_1 = 1 ;//SDA_1= P3^6;
ADSCLK0;
do{
ADSCLK1;
if((SDA_1&0x01)==1)
x = x|0x01;
if(i>1)
{
x = x<<1;
ADSCLK0;
}
}while(--i);
return x;
}
/*
********************************************************************************************************
* AD
*
* Descriptions:
*
* Input:无,
*
* OutPut:返回AD代码值
*******************************************************************************************************
*/
uint AD(uchar x )
{
uint m=0,kk=0;
uchar a,b,k=0;
uchar c=1;
if(x==1) {a=0x08;b=0x38;}
else if(x==2) {a=0x09;b=0x39;}
else {a=0x0b;b=0x3b;}
do
{
WriteToReg(a); // 读通信寄存器 时间判断 最大转化时间需要修改
k = ReadReg();
m++; //延时
if(m>6000) c=0 ;
}while((k&0x80)&&c);
if(c)
{
WriteToReg(b);//读数据寄存器
kk=ReadData();
}
else kk=0;
return kk; //要处理代码的极限
}
/*
********************************************************************************************************
* Function:Delay3ms
*
* Descriptions:3ms延时
*
* Input:无
*
* OutPut:无
*******************************************************************************************************
*/
void Delay3ms(void)
{
uint k;
for(k=0;k<500;k++);
}
/*
********************************************************************************************************
* Function:
*
* Descriptions:改变AD7706的增益
*
* Input:无
*
* OutPut:无
*******************************************************************************************************
*/
void GainAD7706(uchar x)
{
uchar i;
uint k=0;
bit c=1;
switch(x)
{
case 0: i=0x44; ADGain=1; break;
case 1: i=0x44|1<<3;ADGain=2; break;
case 2: i=0x44|2<<3;ADGain=4; break;
case 3: i=0x44|3<<3;ADGain=8; break;
case 4: i=0x44|4<<3;ADGain=16; break;
case 5: i=0x44|5<<3;ADGain=32; break;
case 6: i=0x44|6<<3;ADGain=64; break;
case 7: i=0x44|7<<3;ADGain=128; break;
default:i=0x44|7<<3;ADGain=128; break;
}
WriteToReg(0x11); //写设置寄存器
WriteToReg(i); //44
do
{
WriteToReg(0x08);
i=ReadReg();
k++;
if(k>5000)
{
c=0;
ADXiao=1;
}
}while(i&0x80&&c);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -