erxun 发表于 2007-3-18 16:35:24

感谢各位网友支持,贡献MEGA16读AD7705程序

MEGA16读AD7705程序

#include <iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint unsigned int

#define Add_keyPINC



#define CS_1      (PORTB|= (1<<4 ))

#define CS_0      (PORTB&= ~(1<<4 ))

#define LED_1       (PORTB|= (1<<0 ))

#define LED_0       (PORTB&= ~(1<<0 ))

#define LED1_1       (PORTB|= (1<<1 ))

#define LED1_0       (PORTB&= ~(1<<1 ))

#define DRDY      (PINB& 0x08)

#define ADDR      (PINC& 0x01)

#define SPE_1       (SPCR|= (1<<6 ))

uint value,value1,value2;



//**********************短延时程序50us**************************//

void delay50us(uint t)

{

    uint j;               

    for(;t>0;t--)                       

      for(j=0;j<70;j++)       

            ;

}

//**********************短延时程序5us**************************//

void delay5us(uint t)

{

    uint j;               

    for(;t>0;t--)                       

      for(j=0;j<7;j++)       

            ;

}

//**********************长延时程序50ms**************************//

void delay50ms(uint t)

{

        uint i;

        for(;t>0;t--)

                for(i=0;i<52642;i++)

                        ;                                                               

}

//**************************端口初始化*************************//

void IO_Init(void)

{

DDRC=0x00;

PORTC=0x00;

DDRB=0b10110111;   //PB3\PB6输入

PORTB=0b11110111; //MISO输入加上拉电阻

}

void spi_init(void)

{

SPCR = 0b01011111; //使能SPI,MSB先发送,主机,SCK空闲高,模式三,128分频

SPSR = 0x00; //setup SPI,主机倍频

//CS_0;    //使能SPI器件

}



//******************SPI写寄存器函数*******************************//

void WriteToReg_ADC(uint byteword)

{

   CS_0;    //使能SPI器件

//SPE_1;

SPDR=byteword;       //发送数据

while(!(SPSR & (1<<SPIF)));//等待发送完毕

   CS_1;    //禁止SPI器件

//delay5us(10);

}

//******************SPI读函数*******************************//

unsigned char Read_Byte_SPI(void)

{   

    SPDR = 0xff;//发送数据,给AD7705提供脉冲

    while (!(SPSR &(1<<SPIF)));

    return SPDR;

}

//******************SPI读数据寄存器函数*******************************//

uint Read_ADC16BitValue(void)

{   

    uchar temp1=0;

    uint temp=0;

       CS_0;    //使能SPI器件

        temp=Read_Byte_SPI();

        temp=temp<<8;

        temp1=Read_Byte_SPI();

        temp=temp|temp1;

       CS_1;    //禁止SPI器件

        return temp;

}

//******************绿灯闪烁******************************//

void greenled(void)

{

          LED_0;

          delay50us(50);

          LED_1;

          delay50us(50);

          LED_0;

          delay50us(50);

          LED_1;

          delay50us(50);

}

//******************绿灯闪烁******************************//

void yellowled(void)

{

          LED1_0;

          delay50us(50);

          LED1_1;

          delay50us(50);

          LED1_0;

          delay50us(50);

          LED1_1;

          delay50us(50);

}

//**************************AD初始化*************************//

void ADC_Init(void)

{

uchar i;

   for(i=10;i>0;i--)

    {WriteToReg_ADC(0xff);}//持续DIN高电平写操作,恢复AD7705接口

WriteToReg_ADC(0x20);       //通道1,下一个写时钟寄存器

WriteToReg_ADC(0x0c);       //写时钟寄存器设置更新速率为200hz

WriteToReg_ADC(0x10);       //通道1,下一个写设置寄存器

WriteToReg_ADC(0x44);       //自校准,增益1,单极,无缓冲

delay50us(100);            //延时

//WriteToReg_ADC(0x21);       //通道2,下一个写时钟寄存器

// WriteToReg_ADC(0x0c);       //写时钟寄存器设置更新速率为200hz

// WriteToReg_ADC(0x11);       //通道2,下一个写设置寄存器

//WriteToReg_ADC(0x44);       //自校准,增益1,单极,无缓冲

// delay50us(100);

}

//***************************读取****************************//

void ceshi(void)

{

if(DRDY==0)   //数据准备好

          {       

          

           WriteToReg_ADC(0x38);       //下一操作为读数据寄存器1

           value1=Read_ADC16BitValue();//读取

          

          LED_1;               //进入AD,指示等灭

           yellowled();         //黄灯闪烁

          }

greenled();               //绿灯闪烁

}

void main(void)

{

        delay50us(100);   //延时等待外围器件稳定

        IO_Init();

        spi_init();

        ADC_Init();



        while(1)

        {

       ceshi();         //读取AD数据

    }       

}

-------------------------------------------------------------------

AD7705精度在16位,第一次用16位的AD,很好....先前一直不能正确读取数值.是因为AD7705坏了,损坏的原因是设计上的失误,我把REF IN+接地了,REF IN-接参考电压..后来重新焊接了一个板子,把REF IN+修改了.就好了,哎,不是问题的问题!!

大家看下面的图,REF IN+接错了,其它的还是比较准确的,程序已经测试过了,谁要用的着的,可以看看,

http://cache.amobbs.com/bbs_upload782111/files_6/armok01146979.jpg

erxun 发表于 2007-3-18 16:37:14

最好使用标准的晶振,我用的是4.5MHZ的,

tda1552 发表于 2007-3-18 18:03:53

to erxun 老孟:

AD7705 多少米,哪里有卖?毕设想用它

jackiezeng 发表于 2007-3-18 21:38:41

可以测负 电压吗?

wenming 发表于 2007-3-18 22:00:34

http://cache.amobbs.com/bbs_upload782111/files_6/armok01147019.JPG

价格在40元以下

wgxrc 发表于 2007-3-18 23:40:15

好东西啊!!

erxun 发表于 2007-3-19 08:04:33

我用的贴片的,AD7705BR,价格25上下浮动,差分输入,可以测量负电压..积分型的,速度不是很快,一般的测量应该可以使用,,,

资料如下:

点击此处打开armok01147037.pdf

erxun 发表于 2007-3-28 09:47:52

两个通道依次读取,注意写通讯寄存器的数值,

#include <iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint unsigned int

#define Add_keyPINC



#define CS_1      (PORTB|= (1<<4 ))

#define CS_0      (PORTB&= ~(1<<4 ))

#define LED_1       (PORTB|= (1<<0 ))

#define LED_0       (PORTB&= ~(1<<0 ))

#define LED1_1       (PORTB|= (1<<1 ))

#define LED1_0       (PORTB&= ~(1<<1 ))

#define DRDY      (PINB& 0x08)

#define ADDR      (PINC& 0x01)

#define SPE_1       (SPCR|= (1<<6 ))

uint value,value1,value2;

uchar ch_flag=0;

//**********************短延时程序50us**************************//

void delay50us(uint t)

{

    uint j;               

    for(;t>0;t--)                       

      for(j=0;j<70;j++)       

            ;

}

//**********************短延时程序5us**************************//

void delay5us(uint t)

{

    uint j;               

    for(;t>0;t--)                       

      for(j=0;j<7;j++)       

            ;

}

//**********************长延时程序50ms**************************//

void delay50ms(uint t)

{

        uint i;

        for(;t>0;t--)

                for(i=0;i<52642;i++)

                        ;                                                               

}

//**************************端口初始化*************************//

void IO_Init(void)

{

DDRC=0x00;

PORTC=0x00;

DDRB=0b10110111;   //PB3\PB6输入

PORTB=0b11110111; //MISO输入加上拉电阻

}

void spi_init(void)

{

SPCR = 0b01011111; //使能SPI,MSB先发送,主机,SCK空闲高,模式三,128分频

SPSR = 0x00; //setup SPI,主机倍频

//CS_0;    //使能SPI器件

}



//******************SPI写寄存器函数 8BIT*******************************//

void WriteToReg_ADC(uchar byteword)

{

   CS_0;    //使能SPI器件

//SPE_1;

SPDR=byteword;       //发送数据

while(!(SPSR & (1<<SPIF)));//等待发送完毕

   CS_1;    //禁止SPI器件

//delay5us(10);

}

//******************SPI读函数 8BIT*******************************//

unsigned char Read_Byte_SPI(void)

{   

    SPDR = 0xff;//发送数据,给AD7705提供脉冲

    while (!(SPSR &(1<<SPIF)));

    return SPDR;

}

//******************SPI读数据寄存器函数 16BIT****************************//

uint Read_ADC16BitValue(void)

{   

    uchar temp1=0;

    uint temp=0;

       CS_0;    //使能SPI器件

        temp=Read_Byte_SPI();

        temp=temp<<8;

        temp1=Read_Byte_SPI();

        temp=temp|temp1;

       CS_1;    //禁止SPI器件

        return temp;

}

//******************绿灯闪烁******************************//

void greenled(void)

{

          LED_0;

          delay50us(50);

          LED_1;

          delay50us(50);

          LED_0;

          delay50us(50);

          LED_1;

          delay50us(50);

}

//******************绿灯闪烁******************************//

void yellowled(void)

{

          LED1_0;

          delay50us(50);

          LED1_1;

          delay50us(50);

          LED1_0;

          delay50us(50);

          LED1_1;

          delay50us(50);

}

//**************************AD初始化*************************//

void ADC_Init(void)

{

uchar i;

   for(i=10;i>0;i--)

    {WriteToReg_ADC(0xff);}//持续DIN高电平写操作,恢复AD7705接口

WriteToReg_ADC(0x20);       //通道1,下一个写时钟寄存器

WriteToReg_ADC(0x0a);       //写时钟寄存器设置更新速率为200hz

WriteToReg_ADC(0x10);       //通道1,下一个写设置寄存器

WriteToReg_ADC(0x40);       //自校准,增益1,双极,缓冲

delay50us(100);            //延时

WriteToReg_ADC(0x21);       //通道2,下一个写时钟寄存器

WriteToReg_ADC(0x0a);       //写时钟寄存器设置更新速率为200hz

WriteToReg_ADC(0x11);       //通道2,下一个写设置寄存器

WriteToReg_ADC(0x40);       //自校准,增益1,双极,缓冲

delay50us(100);

}



//***************************按照通道1读取****************************//

void Read_ch1(void)

{

uint temp1=0;

if(DRDY==0)   //数据准备好

          {                  

          

           temp1=Read_ADC16BitValue();//读取          

           LED_1;               //进入AD,指示等灭

           yellowled();         //黄灯闪烁

          }

    greenled();               //绿灯闪烁

        value1=temp1;

        WriteToReg_ADC(0x39);// 下一操作为读数据寄存器2

}

//***************************按照通道2读取****************************//

void Read_ch2(void)

{

uint temp2=0;

if(DRDY==0)   //数据准备好

          {                  

          

           temp2=Read_ADC16BitValue();//读取          

           LED_1;               //进入AD,指示等灭

           yellowled();         //黄灯闪烁

          }

    greenled();               //绿灯闪烁

        value2=temp2;

        WriteToReg_ADC(0x38);       //下一操作为读数据寄存器1

}

//********************获取两个通道模拟量数值***************//

void get_ad(void)

{

if(DRDY==0)   //数据准备好

{

    ch_flag++;

        if(ch_flag==0x03)

        {ch_flag=0x00;}



if(ch_flag==0x01)

{ Read_ch1();}

if(ch_flag==0x02)

{ Read_ch2();}



}



}

//***********************主程序*********************************//

void main(void)

{

        delay50us(100);   //延时等待外围器件稳定

        IO_Init();

        spi_init();

        ADC_Init();



        while(1)

        {

   get_ad();

        greenled(); greenled(); greenled();               //绿灯闪烁



    }       

}

erxun 发表于 2007-3-28 09:58:39

如果这样:写通讯寄存器(0x38),读数据1,写通讯寄存器(0x39),读数据2,…………



读取的数值对于通道来说,是反的,



这样做呢:读数据1,写通讯寄存器(0x39),读数据2,写通讯寄存器(0x38),…………

这样读取的数值和通道是对应的了,



上周以为好了,今天拿来用的时候发现反了,呵呵 ,还是没有深刻理解手册上的说法啊,认识肤浅了,以后得仔细理解手册!!!!

alisha 发表于 2007-5-22 18:50:58

我折腾了大半天了也没弄出来,突然发现LZ的裤子,太高兴了!

好人啊,我马上去试,顺便问一下,对MX7705的操作和AD7705应该一样吧.

smithding 发表于 2007-5-22 19:06:29

顶顶顶顶顶顶顶顶顶!!!

smithding 发表于 2007-5-22 19:06:35

顶顶顶顶顶顶顶顶顶!!!

alisha 发表于 2007-5-23 11:22:16

我用MX7705读出来的都是0啊,怎么办啊,打MAXIM电话,技术人员忙,还没给我回电话,月底要交货啊,晚一天罚款5%,我儿子要断奶了.

binghe1983 发表于 2008-5-20 11:49:54

你好,想问一下程序中有一句“SPDR=byteword; //发送数据”,byteword是什么东西?看不明白,我在数据手册中没有查到这个词。谢谢!!!

cgbabc 发表于 2008-5-21 01:01:35

好东西,当然要顶了,呵呵

dddddddwolf 发表于 2008-5-21 13:44:00

关注!

li0713 发表于 2008-11-11 22:18:38

做个记号!!明天再看看!

zhoupei 发表于 2009-5-2 20:32:11

好东西,谢谢

chess01 发表于 2009-5-3 00:20:04

记号

shamork 发表于 2009-6-6 10:53:18

mark

ouyangyong817 发表于 2009-8-13 20:32:29

读出来的数据送去显示,怎么处理好呢?

wahaha 发表于 2009-8-13 22:13:15

这个要顶

shengfeng 发表于 2009-8-17 14:20:09

很好很好 呵呵

lxg104 发表于 2009-8-17 20:43:49

mark

edawn 发表于 2009-8-20 16:50:08

多谢楼主!

aduc812 发表于 2009-12-7 10:52:34

maqingbiao 发表于 2010-8-30 12:03:03

学习……

hailin0716 发表于 2011-4-2 15:11:51

学习了

minyang3011 发表于 2011-4-5 11:07:48

学习了

liu100149 发表于 2011-4-13 22:28:29

回复【28楼】minyang3011 一杯清茶
-----------------------------------------------------------------------

你好

我在读到AD7705的数字时,数字波动很大是怎么回事呀

liu100149 发表于 2011-4-13 22:32:15

AD7705的晶振用1M没得问题吧
我测5V的电压可不可以把AIN1-,AIN2-直接接地吗?

staroul 发表于 2011-8-7 16:55:03

不错,留着

libaoming 发表于 2011-8-8 12:57:04

感谢

panmingfu 发表于 2011-8-24 15:49:21

flyxiao 发表于 2011-11-3 10:42:29

好资料学习了

ywei 发表于 2012-6-2 11:33:00

谢谢,参考参考

qgbgzp 发表于 2012-6-16 13:22:25

原来在51上用过,最近可能会在AVR上用,谢谢楼主

chen0610 发表于 2012-9-6 16:49:58

MARK{:smile:}

shiyingyifan 发表于 2012-9-8 21:09:49

做个记号,以后备用!

chen0610 发表于 2012-9-10 14:36:07

楼主,这句是不是错了?PORTB=0b11110111; //MISO输入加上拉电阻,PB3接的是DRDY啊。。。

lxjmcuahz 发表于 2015-3-7 22:02:56

谢谢,学习了。
页: [1]
查看完整版本: 感谢各位网友支持,贡献MEGA16读AD7705程序