搜索
bottom↓
回复: 40

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

[复制链接]

出0入0汤圆

发表于 2007-3-18 16:35:24 | 显示全部楼层 |阅读模式
MEGA16读AD7705程序

#include <iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint unsigned int

#define Add_key  PINC



#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+接错了,其它的还是比较准确的,程序已经测试过了,谁要用的着的,可以看看,

出0入0汤圆

 楼主| 发表于 2007-3-18 16:37:14 | 显示全部楼层
最好使用标准的晶振,我用的是4.5MHZ的,

出0入0汤圆

发表于 2007-3-18 18:03:53 | 显示全部楼层
to erxun 老孟:

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

出0入0汤圆

发表于 2007-3-18 21:38:41 | 显示全部楼层
可以测负 电压吗?

出0入20汤圆

发表于 2007-3-18 22:00:34 | 显示全部楼层


价格在40元以下

出0入0汤圆

发表于 2007-3-18 23:40:15 | 显示全部楼层
好东西啊!!

出0入0汤圆

 楼主| 发表于 2007-3-19 08:04:33 | 显示全部楼层
我用的贴片的,AD7705BR,价格25上下浮动,差分输入,可以测量负电压..积分型的,速度不是很快,一般的测量应该可以使用,,,

资料如下:

点击此处打开armok01147037.pdf

出0入0汤圆

 楼主| 发表于 2007-3-28 09:47:52 | 显示全部楼层
两个通道依次读取,注意写通讯寄存器的数值,

#include <iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint unsigned int

#define Add_key  PINC



#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();               //绿灯闪烁



    }       

}

出0入0汤圆

 楼主| 发表于 2007-3-28 09:58:39 | 显示全部楼层
如果这样:写通讯寄存器(0x38),读数据1,写通讯寄存器(0x39),读数据2,…………



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



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

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



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

出0入0汤圆

发表于 2007-5-22 18:50:58 | 显示全部楼层
我折腾了大半天了也没弄出来,突然发现LZ的裤子,太高兴了!

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

出0入0汤圆

发表于 2007-5-22 19:06:29 | 显示全部楼层
顶顶顶顶顶顶顶顶顶!!!

出0入0汤圆

发表于 2007-5-22 19:06:35 | 显示全部楼层
顶顶顶顶顶顶顶顶顶!!!

出0入0汤圆

发表于 2007-5-23 11:22:16 | 显示全部楼层
我用MX7705读出来的都是0啊,怎么办啊,打MAXIM电话,技术人员忙,还没给我回电话,月底要交货啊,晚一天罚款5%,我儿子要断奶了.

出0入0汤圆

发表于 2008-5-20 11:49:54 | 显示全部楼层
你好,想问一下程序中有一句“SPDR=byteword; //发送数据”,byteword是什么东西?看不明白,我在数据手册中没有查到这个词。谢谢!!!

出0入0汤圆

发表于 2008-5-21 01:01:35 | 显示全部楼层
好东西,当然要顶了,呵呵

出0入0汤圆

发表于 2008-5-21 13:44:00 | 显示全部楼层
关注!

出0入0汤圆

发表于 2008-11-11 22:18:38 | 显示全部楼层
做个记号!!明天再看看!

出0入0汤圆

发表于 2009-5-2 20:32:11 | 显示全部楼层
好东西,谢谢

出0入0汤圆

发表于 2009-5-3 00:20:04 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-6-6 10:53:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-13 20:32:29 | 显示全部楼层
读出来的数据送去显示,怎么处理好呢?

出200入0汤圆

发表于 2009-8-13 22:13:15 | 显示全部楼层
这个要顶

出0入0汤圆

发表于 2009-8-17 14:20:09 | 显示全部楼层
很好  很好 呵呵

出0入0汤圆

发表于 2009-8-17 20:43:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-20 16:50:08 | 显示全部楼层
多谢楼主!

出0入0汤圆

发表于 2009-12-7 10:52:34 | 显示全部楼层

出0入0汤圆

发表于 2010-8-30 12:03:03 | 显示全部楼层
学习……

出0入0汤圆

发表于 2011-4-2 15:11:51 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-4-5 11:07:48 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-4-13 22:28:29 | 显示全部楼层
回复【28楼】minyang3011 一杯清茶
-----------------------------------------------------------------------

你好

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

出0入0汤圆

发表于 2011-4-13 22:32:15 | 显示全部楼层
AD7705的晶振用1M没得问题吧
我测5V的电压可不可以把AIN1-,AIN2-直接接地吗?

出0入0汤圆

发表于 2011-8-7 16:55:03 | 显示全部楼层
不错,留着

出0入0汤圆

发表于 2011-8-8 12:57:04 | 显示全部楼层
感谢

出0入0汤圆

发表于 2011-8-24 15:49:21 | 显示全部楼层

出0入0汤圆

发表于 2011-11-3 10:42:29 | 显示全部楼层
好资料学习了

出0入0汤圆

发表于 2012-6-2 11:33:00 | 显示全部楼层
谢谢,参考参考

出0入0汤圆

发表于 2012-6-16 13:22:25 | 显示全部楼层
原来在51上用过,最近可能会在AVR上用,谢谢楼主

出0入0汤圆

发表于 2012-9-6 16:49:58 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-9-8 21:09:49 | 显示全部楼层
做个记号,以后备用!

出0入0汤圆

发表于 2012-9-10 14:36:07 | 显示全部楼层
楼主,这句是不是错了?PORTB=0b11110111; //MISO输入加上拉电阻,PB3接的是DRDY啊。。。

出0入0汤圆

发表于 2015-3-7 22:02:56 | 显示全部楼层
谢谢,学习了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 14:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表