搜索
bottom↓
回复: 38

自己的毕业设计,离线热电偶测温电路AD7190,ADuM5401磁隔离

[复制链接]

出0入0汤圆

发表于 2010-10-25 22:43:04 | 显示全部楼层 |阅读模式
我不是搞电的,只是兴趣。一个同学在做微重力燃烧试验,把一个铁桶从楼顶释放,自由落体,在短短的2秒多以内,桶内可以看做失重,因为有空气阻力,不是那么理想,所以还只能算微重力。条件有点艰苦,去北京的落塔做的话一次费用貌似就上万了,在学校每次的成本基本只有校门口小饭馆的一顿饭(不算设备钱,其实用的设备也不值钱。。。)。那个同学使我们学委,很让人敬佩,虽然报销很简单,但每次做完实验请帮忙的同学吃饭都是他自己掏腰包,自愧不如。
一开始同学用图像的方法观察和计算火焰以及固体燃料的消耗,后来想测温度,就找我。现在的测温仪器要么有个显示屏自己读,要么联电脑上在线测。我需要做的就是能用电池供电、多路热电偶测温、能吧数据独立存下来的一个东西。

主控都是Mega16,因为比较熟悉。刚好还是在涨价前囤了几颗。
搞了两个版本,第一个是用的max6675和AD7705两种方法,也是同学拿去用的一块板。资料没整理也不发了,有个经验就是用AD7705时,最好先把他的spi复位一下(DIN连续40个时钟以上高电平,手册上有讲)。一开始没在意,经常通信失败,后来程序初始化是来一段,稳定的很。
第二版用了AD7190+ADUM的磁隔离,为的是‘高速’和抗干扰,没怎么实际应用,是我搞的比较拖拉,那一段状态很差。。。最终当毕业论文,老师们听到一头雾水(因为我不是学电的。。。老师们当然不懂)。但是因为做出了实物,所以顺利让我过了。
因为是论文,所以比较罗嗦,我删掉了有关我的信息和N多‘铺垫’(凑页数用的),感兴趣的根据目录选着看吧。
论文部分ourdev_592794T55R83.doc(文件大小:2.05M) (原文件名:离线热电偶测温.doc)

布线,比较矬 (原文件名:pcb.jpg)

程序部分,WINAVR下写的&原理图,eagle5.9画的ourdev_592796A9AS9F.rar(文件大小:185K) (原文件名:program&sch.rar)

单片机程序里能看到很多ourdev上历程的影子,毕竟我也是从这里开始学avr的。上位机用labview编的,太烂了,也不发了。
单片机软件写的比较顺利,只要搞懂AD7190那些滤波器怎么设置就能跑起来。特别注意,因为使用了外部的多路模拟开关cd4051,ad不能连续采,一定要单次采!就是说每次采样都必须让滤波器重新建立,AD7190有两种‘single’模式,datasheet上介绍的很模糊,在论文第27页上有我的理解。
AD7190有两种单次采样模式。
(1)根据表4.4,当Mode register的MR21~MR23被设置为001(二进制)时,AD7190工作于单次采样模式。在此模式下,每次转换过程都需要一个完整的滤波器建立时间。转换完成后芯片发出转换完成信号(DRY引脚低电平),同时进入空闲模式(Idle mode)。从空闲模式下启动此种单次采样,芯片需要1ms的启动时间。
(2)当Mode register的MR21~MR23被设置为000(二进制),同时MR11位置位时,AD7190工作与另一种单次采样模式。与前一种不同的是,这里的单次采样仅表示每次采样都要对滤波器重新建立,每次采样完成后自动开始下一次单次采样,而不是空闲模式。

我发现用ADI推荐的电路使用带隔离电源的ADuM芯片纹波很大,而且在测电磁炉烧水温度时经常死机。后来把ADum两侧地线上的电感去掉,纹波就小多了,两端地之间加一个安规电容,测电磁炉烧水也不再死了。还有我的电路抗干扰能力不强,能看到工频干扰的影子,应该是布线问题,还有就是没外壳。还好是拿来测火焰,2度的波动对几百上千的火焰来说是可以接受的误差。本来因为各种因素,热电偶测火焰想侧准都很难,很不幸我也没找到校准的仪器。仅作为是一次学习吧。

今天突然心血来潮,就发一下,缅怀我有点风浪的大学生活

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2010-10-25 22:47:14 | 显示全部楼层
另外电压基准选的太不给力,MC1403的误差是1%,纯粹浪费AD7190的精度。当时看坛子里说MC1403的温飘特小,考虑我还是用在比较热的地方,就选了它。后来觉得是个失败,当个教训吧。

上面电路单片机下面的铺铜没显示出来,所以有的地线显示没连

出0入0汤圆

发表于 2010-10-26 00:25:19 | 显示全部楼层
膜拜啊,楼主什么专业啊那

出0入0汤圆

发表于 2010-10-26 08:53:10 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-10-26 09:18:46 | 显示全部楼层
AD7190是磁隔离器件吗?没有查资料,这个IC价格如何?

出0入0汤圆

 楼主| 发表于 2010-10-26 13:54:46 | 显示全部楼层
回复【2楼】fshunj
膜拜啊,楼主什么专业啊那
-----------------------------------------------------------------------
安全工程,火灾科学。基本上就是热能工程的基础加上一些火灾和安全相关的专业课


回复【4楼】our_avr
ad7190是磁隔离器件吗?没有查资料,这个ic价格如何?
-----------------------------------------------------------------------
不是。AD7190时4.8KHz、24位的sigma-delta ADC,集成可编程放大器,能直接采集mV级别的电压。
磁隔离也是ADI公司的,型号用的是ADuM5401,三进一出,集成隔离电源。也有带隔离的ADC,但是不适合我的应用。
AD7190当时买的68元一片,还算比较好买。
ADuM5401是样片,问了淘宝上几家要4、5十元一片。效果不见得比用隔离电源+光耦好,但是外围电路很简单,占用PCB小。

出0入0汤圆

发表于 2010-11-24 16:18:29 | 显示全部楼层
请问楼主,我用的时候为什么写58读出来的数据全0写5c读出来的全1,求教。。。

出0入0汤圆

发表于 2010-11-24 16:38:56 | 显示全部楼层
磁隔离芯片的耗电一般都比较大,摸起来有点热。

出0入0汤圆

发表于 2010-11-24 17:02:04 | 显示全部楼层
我用过ADI的磁隔离,个人感觉还是很不错的,信号质量算可以,
速度比较高的片子是要贵些,如果是满足RS232的话就很便宜了,
应该才10-15吧,MSOP8的,体积很小,的确省地方

楼主很不错,画电路还要再多锻炼下,一定是块好料

出0入0汤圆

发表于 2010-11-24 18:11:33 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-11-25 21:30:17 | 显示全部楼层
回复【6楼】jingji
请问楼主,我用的时候为什么写58读出来的数据全0写5c读出来的全1,求教。。。
-----------------------------------------------------------------------

是一直如此还是偶尔?能把你通信部分的代码发一下吗?

回复【8楼】DigiCat 数码加菲
我用过adi的磁隔离,个人感觉还是很不错的,信号质量算可以,
速度比较高的片子是要贵些,如果是满足rs232的话就很便宜了,
应该才10-15吧,msop8的,体积很小,的确省地方
楼主很不错,画电路还要再多锻炼下,一定是块好料
-----------------------------------------------------------------------

谢谢夸奖,只怕以后做电路的机会也来越少了。。。工作了,与兴趣不怎么相关的行业,有点身不由己了。另外我用磁隔离芯片也不热,用示波器能明显看到,信号上有个高频的纹波,应该是先把输入的高电平信号变成高频信号,过变压器隔离后,再滤波变回高电平。

出0入0汤圆

发表于 2010-11-26 10:30:56 | 显示全部楼层
求教楼主,为什么我的AD7190数据总是写入不了ADC的数据寄存器?

出0入0汤圆

 楼主| 发表于 2010-11-26 23:17:31 | 显示全部楼层
回复【11楼】jingji
求教楼主,为什么我的ad7190数据总是写入不了adc的数据寄存器?
-----------------------------------------------------------------------

把你的程序发上来看一下。能确认电路没问题吗?

出0入0汤圆

发表于 2010-11-27 09:14:04 | 显示全部楼层
能给个程序吗?想做一个测温的 。

出0入0汤圆

 楼主| 发表于 2010-11-27 19:23:05 | 显示全部楼层
回复【13楼】xlsmt
能给个程序吗?想做一个测温的 。
-----------------------------------------------------------------------

压缩包里有

出0入0汤圆

发表于 2010-11-28 11:44:13 | 显示全部楼层
这是连接电路,#include<avr/io.h>
#include<util/delay.h>
#define uint  unsigned int
#define uchar unsigned char
#define BIT(X) (1<<X)
//#define RDY    (PINB&0x40)
uchar RDY;
uchar Buf[3]={0,0,0};
#include"SPI.c"

#include"AD7190.c"
#include"1602.c"
#define AD7190_ENH PORTB|=BIT(4)
#define AD7190_ENL PORTB&=~BIT(4)
void Init_Prot();

int main()
{
        uchar status=0,i,n,t;
        Init_Prot();
        t=PINB;
        RDY=t&0x40;
        unsigned long int ad_z=0;
        uchar display[]={"Electron Scales"};
       
        Init_1602();       
        Write_1602(com_1602,0X80);
        zfc(display);
        Init_SPI();
        PORTB|=BIT(3);
        PORTB&=~BIT(4);

        AD7190_RW(0xff);//芯片复位
        AD7190_RW(0xff);
        AD7190_RW(0xff);
        AD7190_RW(0xff);
        AD7190_RW(0xff);
        _delay_ms(200);

       
       
        while(1)

        {       
                while((PINB&0x40)==0x40);       
                Init_AD7190();
                        /*while(RDY==0x40)
                        {        AD7190_RW(0x00);
                                AD7190_RW(0X10);//选择Configuration  regisster(24 bit,with 3 turns)
                            AD7190_RW(0x80);//chop enabled
                            AD7190_RW(0x02);//选择AIN3 to AIN4  channel
                            AD7190_RW(0x0f);//unbuffer model,current关闭,gain =128 ,单极性
                        }
                        while(RDY==0x40)
                        {
                                AD7190_RW(0x08);//选择模式寄存器,内部零点校准(24 bit,with 3 turns)
                            AD7190_RW(0x88);//Internal zero-scale calibration  Model
                            AD7190_RW(0x00);
                            AD7190_RW(0x01);  
                        }
                        while(RDY==0x40)
                        {
                                AD7190_RW(0x08);//选择模式寄存器,内部满量程校准(24 bit,with 3 turns)
                            AD7190_RW(0xa8);//Internal full-scale calibration Model
                            AD7190_RW(0x00);
                            AD7190_RW(0x01);   

                        }
                        while(RDY==0x40)
                        {
                                AD7190_RW(0x08);//选择模式寄存器(24 bit,with 3 turns)
                            AD7190_RW(0x08);//连续转换模式
                            AD7190_RW(0x00);
                            AD7190_RW(0x18);//Filter output data rate select


                        }*/

                        _delay_ms(1250);
        while((PINB&0x40)!=0x40);
               
        /*        AD7190_RW(0X40);
                status=AD7190_RW(0X40);

                Write_1602(com_1602,0XCA);
                Write_1602(data_1602,(status/100)+0x30);
                Write_1602(com_1602,0XCB);
                Write_1602(data_1602,(status/10%10)+0x30);
                Write_1602(com_1602,0XCC);
                Write_1602(data_1602,(status%10)+0x30);*/

        /*        AD7190_RW(0X10);//写入下次寄存器操作为配置寄存器
                //配置寄存器写入数据
                AD7190_RW(0X80);
                AD7190_RW(0X02);
                AD7190_RW(0X18);*/

       
                _delay_ms(200);
               

        AD7190_RW(0X58);

    //        if((PINB&PB6))
               
                        Buf[0]=0xff;
                        Buf[1]=0xff;
                        Buf[2]=0;                       
                        for(i=0;i<3;i++)
                        {
                                Buf=AD7190_RW(0);
                               
                        }
                        ad_z=Buf[0];
                        ad_z=(ad_z<<8)+Buf[1];
                        ad_z=(ad_z<<8)+Buf[2];       
                        for(i=8;i>0;i--)
                        {
                                n=ad_z%10;
                                Write_1602(com_1602,0XC0+i-1);
                                Write_1602(data_1602,n+0x30);
                                ad_z=ad_z/10;
                        }
                        _delay_ms(200);
                        _delay_ms(200);
                        _delay_ms(200);



        AD7190_RW(0X58);
                for(i=0;i<3;i++)
                {
                        Buf=AD7190_RW(0X00);               
                }
                _delay_ms(10);
                for(i=0;i<3;i++)
                {
                        Write_1602(com_1602,0XCd+i);
                        Write_1602(data_1602,Buf+0x30);
                }
       
                }
        //}
       
        //else
          
}
void Init_Prot()
{
        DDRA=0XFF;
        DDRB=0Xbf;
        PORTB=0xf7;
        DDRC=0XFF;
        DDRD=0XFF;
}//这是主函数
#define communications_Register 0//通讯寄存器
#define mode_Register           1//模式寄存器
#define deploy_Register         2//配置寄存器
#define data_Register           3//数据寄存器
#define GPOCON_Register         5
#define imbalance_Register      6//失调寄存器
#define full_range_Register     7//满量程寄存器

/*void Write_AD7190(uchar data)
{
        AD7190_RW(data);
}
uchar Read_AD7190()
{
        uchar ad_val;
        ad_val=SPI_Receive();       
        return ad_val;
}
*/
void Init_AD7190()
{
        AD7190_RW(0xff);//芯片复位
        AD7190_RW(0xff);
        AD7190_RW(0xff);
        AD7190_RW(0xff);
        AD7190_RW(0xff);
        _delay_us(200);
        _delay_us(200);
        _delay_us(200);

/*        AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
        //模式寄存器写入数据(内部零电平校准)
        AD7190_RW(0X88);
        AD7190_RW(0X88);
        AD7190_RW(0X60);

        _delay_us(20);

        AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
        //模式寄存器写入数据(内部满量程校准)
        AD7190_RW(0XA8);
        AD7190_RW(0X88);
        AD7190_RW(0X60);*/       
        AD7190_RW(0x00);
        AD7190_RW(0X28);//写入下次寄存器操作为G存器
        //模式寄存入数据(连续装换模式)
        //AD7190_RW(0X28);
        AD7190_RW(0X40);
        //AD7190_RW(0X05)
        _delay_us(20);

        AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
        //模式寄存器写入数据(系统零电平校准)
        AD7190_RW(0XCc);
        AD7190_RW(0X8f);
        AD7190_RW(0Xff);       

        _delay_us(20);

        AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
        //模式寄存器写入数据(系统满量程校准)
        AD7190_RW(0XEc);
        AD7190_RW(0X8f);
        AD7190_RW(0Xff);

        _delay_us(20);
        AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
        //模式寄存器写入数据(内部零电平校准)
        AD7190_RW(0X8c);
        AD7190_RW(0X8f);
        AD7190_RW(0Xff);

        _delay_us(20);       
        AD7190_RW(0x00);
        AD7190_RW(0X08);//写入下次寄存器操作为模式寄存器
        //模式寄存器写入数据(内部零电平校准)
        AD7190_RW(0X0c);
        AD7190_RW(0X8f);
        AD7190_RW(0Xff);

        _delay_us(20);
        AD7190_RW(0x00);
        AD7190_RW(0X10);//写入下次寄存器操作为配置寄存器
        //配置寄存器写入数据
        AD7190_RW(0X80);
        AD7190_RW(0X01);
        AD7190_RW(0X0f);

        _delay_us(20);
;
}
//spi标志
#define DDR_SPI DDRB
#define DD_MOSI 5
#define DD_SCK  7
#define DD_SS   4
//===============SPI 初始化===============
void Init_SPI()
{
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);//设置MOSI,SCK,SS.CE 为OUTPUT,其它为INPUT
SPCR |=(1<<SPE)|(1<<MSTR)|(1<<SPR0);//使能SPI接口,主机模式,MSB低位在前,模式0,16分频,SPI时钟1MHZ
SPSR=0;
}


//====================发送数据================//
void  SPI_Send(uchar message)
{
        SPDR=message;
        while(!(SPSR&BIT(SPIF)));
}
//================接收数据=====================//
uchar SPI_Receive()
{
        while(!(SPSR&BIT(SPIF)));
        return SPDR;
}

uchar AD7190_RW(uchar data)
{
        SPDR=data;
    while(!(SPSR&(1<<SPIF)));
    return SPDR;
}

出0入0汤圆

发表于 2010-11-28 11:46:13 | 显示全部楼层
连接电路

出0入0汤圆

发表于 2010-11-28 11:47:11 | 显示全部楼层
电路没问题

出0入0汤圆

发表于 2010-11-28 12:26:37 | 显示全部楼层
拿逻辑分析仪看看波形吧。


(原文件名:saleae_spi1.jpg)

出0入0汤圆

 楼主| 发表于 2010-11-28 14:46:30 | 显示全部楼层
回复【15楼】jingji
-----------------------------------------------------------------------


简单看了一下,有几个疑问:
1.你电路里ADC的CS引脚怎么处理的?一直使能?(这个不是关键,但我习惯控制住cs,不通讯时不使能,以防被干扰)
2.RDY这个量在刚进main函数时赋值,之后没看到有照到能改变它的语句。赋值的位置不合适吧,应该是在while循环的开始。
3.spi初始化里面,我用的是模式3,而你用了模式0,这个应该是最大的问题所在,试试该成模式3.

如果有理解错误,请指正

出0入0汤圆

发表于 2010-11-29 22:29:26 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2010-11-29 23:59:23 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-12-8 10:12:34 | 显示全部楼层
回复【楼主位】ilawp
-----------------------------------------------------------------------

兄弟,电路图打开后(用protel 99se),怎么是空白的啊?

出0入8汤圆

发表于 2010-12-8 11:41:27 | 显示全部楼层
回复【22楼】cobble2064  
回复【楼主位】ilawp
-----------------------------------------------------------------------
兄弟,电路图打开后(用protel 99se),怎么是空白的啊?
-----------------------------------------------------------------------

兄弟 楼主已经写了使用eagle5.9画的了。

出0入0汤圆

发表于 2011-4-25 10:42:43 | 显示全部楼层
楼主真是牛人啊,楼主是清华热能的,还是中科大热能的,现在中科大以前的理论热物理的 范维澄老师 后来的国家重点实验室 火灾研究中心主任 调到清华,这两家也算是 同门弟子了

出0入0汤圆

发表于 2011-5-17 16:21:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-29 17:08:45 | 显示全部楼层
楼主牛人啊,佩服!

出0入0汤圆

发表于 2011-8-24 17:19:59 | 显示全部楼层
楼主能加我吗?我的是314064909 我问你个问题呀

出0入0汤圆

发表于 2012-2-13 21:07:22 | 显示全部楼层
不知道这颗芯片的抗干扰能力怎样?

出0入0汤圆

发表于 2012-4-12 10:17:19 | 显示全部楼层
我也要用这个芯片,呵呵,希望有问题有找楼主求教

出0入0汤圆

发表于 2012-5-17 15:33:19 | 显示全部楼层
大侠,求助,正在搞AD7190,头都大了,大侠的帖子是阿莫改版以前发的,现在下载不了,有备份吗?能不能发我一份,903511694@qq.com  加急

出0入0汤圆

发表于 2012-5-19 22:38:12 | 显示全部楼层
大侠,我弄了个程序想让你给看看,我已经发到你的邮箱里了,希望可以查收一下,谢谢!!

出0入0汤圆

发表于 2012-5-30 09:16:50 | 显示全部楼层
多谢大侠的指导,现在终于有点结果了,由于其中一个数型定义错误,浪费了好长时间,非常感谢大侠的资料

出0入0汤圆

发表于 2012-9-22 08:00:29 | 显示全部楼层
多谢大侠的指导

出0入0汤圆

发表于 2012-10-7 15:00:33 | 显示全部楼层
能测负温度吗?

出0入0汤圆

发表于 2012-10-7 15:07:22 | 显示全部楼层
FlashNuk 发表于 2010-11-24 16:38
磁隔离芯片的耗电一般都比较大,摸起来有点热。

相同速率下,比光耦小。

出0入0汤圆

发表于 2014-12-23 15:42:40 | 显示全部楼层
收下学习了,赞一个

出0入0汤圆

发表于 2015-1-5 13:18:25 | 显示全部楼层
本科生能做成这样,已经非常不错。

出0入0汤圆

发表于 2015-1-14 01:18:56 | 显示全部楼层
楼主的ADUM5401 的RCout接错了,应该悬空不能接到VDD,(虽然过了五年了,楼主估计改过来,但是给后来参考的提个醒,哈哈)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-28 06:30

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

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