打印

用ad7792测pt100三线温度

[复制链接]
11445|73
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 cl234583745 于 2015-3-16 11:50 编辑

有人用过这个芯片吗
电路图和程序例程见图片和附件。
求大侠帮看看问题出在哪里了呢?我测试读回来的结果不对啊。一直是DataRead[0]=192始终不变,是电路还是程序哪里出的问题呢。愁死了。

照抄的电路图,r6为啥为512呢5.1k?

PT1003.jpg (694.03 KB )

PT1003.jpg

AD7792.zip

1.21 KB

相关帖子

沙发
cl234583745|  楼主 | 2015-3-16 11:46 | 只看该作者

估计是程序的问题,因为硬件电路图是抄的

本帖最后由 cl234583745 于 2015-3-16 11:54 编辑

估计是程序的问题,因为硬件电路图是抄的
#include<stdio.h>
#include<aduc841.h>
/******************************************************************
DEFINE CONTROL PINS OF ADUC841 FOR THE PURPOSE OF AD7792 CONTROL.
Customers should define the pins according to their design.

******************************************************************/
sbit CS=0x0A0;
sbit SCLOCK=0x0A6;
sbit DIN=0x0A2;
sbit DOUT=0x0A3;

unsigned char DataRead[3];


void WriteToReg(unsigned char ByteData);
void ReadFromReg(unsigned char nByte);
void Delay(unsigned int Time)
{

        while(Time)
        {
                Time--;
        }
}


void main()
{

        int ResetTime;
        /* Set up UART */
        T3CON = 0x086;
        T3FD = 0x08;
        SCON   = 0x052;
        
        printf("Hello\r\n");

        /* PRECONFIGURE...*/
        ResetTime=32;
        SCLOCK=1;

         CS=0;                  //to keep DIN=1 for 32 sclock to reset the part
         DIN=1;
         while(ResetTime--)
        {
                Delay(10);
                SCLOCK=0;
                Delay(10);
                 SCLOCK=1;
        }
         CS=1;        
        
    printf("Reset\r\n");
        
        
        WriteToReg(0x10); //write to Communication register.The next step is writing to Configuration register.选择配置寄存器0x10
        WriteToReg(0x00); //set the Configuration bipolar mode.Gain=1.                                                  配置寄存器的高8位--双极模式    
        WriteToReg(0x80); //Configuration internal reference selected.                                                                      低8位--有缓冲器

//////////////////////////////////////////////////////////////////
  WriteToReg(0x48);//写io寄存器
  WriteToReg(0x02); //使能和选择激励电流
///////////////////////////////////////////////////////////////////此处是例程里面没有的,我测试时候加的,感觉也没有什么作用。这个设置应该与电路有关系吧?

        while(1)
        {
        
                WriteToReg(0x08);//write to Communication register.The next step is writing to Mode register.选择模式寄存器0x08
                WriteToReg(0x20);//set the mode register as single conversion mode.                                           单次转换模式   
                WriteToReg(0x0A);//inter 64 kHZ clock.internal clock is not available at the clk pin.                   内部  64k时钟不提供给clk引脚
               
           
               
               
                WriteToReg(0x40);//write to Communication register.The next step is to read from Status register.读时候为状态寄存器,写时候为通信寄存器
                ReadFromReg(1);        
                while((DataRead[0]&0x80)==0x80)//wait for the end of convertion by polling the status register RDY bit
         
                {
                  
                        WriteToReg(0x40);
                        ReadFromReg(1);        
                }
                 
                 
               
                WriteToReg(0x58);//write to Communication register.The next step is to read from Data register.选择数据寄存器并且读数据寄存器0x58
                ReadFromReg(2);        
                printf("Data:%02BX %02BX\r\n",DataRead[0],DataRead[1]);

        
      
        }

}   


void WriteToReg(unsigned char ByteData) // write ByteData to the register
{
        unsigned char temp;
        int i;        
        CS=0;
        temp=0x80;
        for(i=0;i<8;i++)
        {
                 if((temp & ByteData)==0)
                {               
                      DIN=0;
                }        
                 else
                {
                         DIN=1;
             }
                SCLOCK=0;
                Delay(10);
                   SCLOCK=1;
                Delay(10);
                 temp=temp>>1;
        }
        CS=1;
}


void ReadFromReg(unsigned char nByte) // nByte is the number of bytes which need to be read
{
        int i,j;
           unsigned char temp;
           DIN=1;
         CS=0;
    temp=0;
        DOUT=1;

        for(i=0; i<nByte; i++)
        {
                for(j=0; j<8; j++)
            {
                     SCLOCK=0;
                     if(DOUT==0)
                     {
                                temp=temp<<1;
                         }else
                         {
                                temp=temp<<1;
                                 temp=temp+0x01;
                        }
                        Delay(10);
                SCLOCK=1;
                        Delay(10);
                  }
                  DataRead=temp;
                  temp=0;
        }
    CS=1;
}



666-24
726-37-114.8

AD7792_7793_cn.pdf

597.12 KB

使用特权

评论回复
板凳
cl234583745|  楼主 | 2015-3-24 10:16 | 只看该作者
帮我分析下电路也好啊

使用特权

评论回复
地板
捡漏王子| | 2015-3-24 12:21 | 只看该作者
程序编译没错误吗?

使用特权

评论回复
5
捡漏王子| | 2015-3-24 12:43 | 只看该作者
//////////////////////////////////////////////////////////////////
  WriteToReg(0x48);//写io寄存器
  WriteToReg(0x02); //使能和选择激励电流
///////////////////////////////////////////////////////////////////此处是例程里面没有的,我测试时候加的,感觉也没有什么作用。这个设置应该与电路有关系吧?

这激励电流肯定是要加的,你的写IO寄存器指令是不是错了?--->WriteToReg(0x28);

使用特权

评论回复
6
cl234583745|  楼主 | 2015-3-24 13:41 | 只看该作者
本帖最后由 cl234583745 于 2015-3-24 13:58 编辑
捡漏王子 发表于 2015-3-24 12:43
//////////////////////////////////////////////////////////////////
  WriteToReg(0x48);//写io寄存器
  ...

谢谢你啊,的确是个低级错误。你看了手册了,你是用过这个芯片吗?
我现在不知道是硬件问题还是软件问题了。
有几点我不清楚的:
1.avdd和dvdd引脚应该接多大电压呢?抄板的是3.6和3.3v。dvdd是数据引脚逻辑电平有关系,抄板的是stm32大概是3.3v的。我用的8位的单片机普通io口,应该是5v的吧?所以我把avdd和dvdd都接5v了可以吗?
2.提供的软件可以编程的3种恒流源选择多大的呢?这个跟参考电阻有关系吧?目的是为了REFIN+的电压达到2.5v吗?
3.编译没有报错,可以运行。但单步仿真时候这两句好像没有执行直接进到while里面判断了。不知道怎么回事?
WriteToReg(0x40);
ReadFromReg(1);   
while((DataRead[0]&0x80)==0x80)4.例程的寄存器设置的好像不是差分输入,外部参考电压。怎么这个又这么说呢
5.读回来的ad结果怎么处理呢?我看不太明白手册的编码公式。

麻烦大神指点

bb.jpg (608.01 KB )

bb.jpg

使用特权

评论回复
7
捡漏王子| | 2015-3-24 14:25 | 只看该作者
cl234583745 发表于 2015-3-24 13:41
谢谢你啊,的确是个低级错误。你看了手册了,你是用过这个芯片吗?
我现在不知道是硬件问题还是软件问题了 ...

我稍微看了下DS,没用过这款芯片
1 电压范围2.75-5.25V,你5V应该是可以的
2 电流大小决定了你的外部参考电压的大小,理解正确
3 不知道
4 没明白你的意思
5 你的意思是ad结果与你要测温度的关系?
   你用的是双极性模式:图中第二个公式,根据公式和ad值,计算出测量的电压,在结合你提供的激励电流,可以获取PT100的电阻值,查表方式就可以获取对应的温度值

使用特权

评论回复
8
捡漏王子| | 2015-3-24 14:38 | 只看该作者
还有就是你的配置寄存器当中 选择内部参考了,内部参考电压只有1.17V,所以你第2问中电流选择保证外部参考电压2.5V也就没有意义了。
选择了内部参考电压,那么你的采集AD值公式中的VREF=1.17V

使用特权

评论回复
9
cl234583745|  楼主 | 2015-3-25 11:15 | 只看该作者
本帖最后由 cl234583745 于 2015-3-25 11:19 编辑
捡漏王子 发表于 2015-3-24 14:38
还有就是你的配置寄存器当中 选择内部参考了,内部参考电压只有1.17V,所以你第2问中电流选择保证外部参考 ...

我现在采用内部1.17v参考单极模式,gain=1,激励电流选择第三个1ma。ad结果是49182
49182=(65535*AIN*1)/1.17
AIN=49182*1.17/65535=0.87805
电阻=AIN/1ma=878.05欧   
是这样计算的吗?
结果也不对啊。电阻大概应该是25度左右的阻值100欧左右
反过来计算AIN=100欧*1ma=0.1
code=(65535*0.1*1)/1.17=5601
差好多啊


使用特权

评论回复
10
捡漏王子| | 2015-3-25 12:15 | 只看该作者
cl234583745 发表于 2015-3-25 11:15
我现在采用内部1.17v参考单极模式,gain=1,激励电流选择第三个1ma。ad结果是49182
49182=(65535*AIN*1) ...

代码贴出来看

使用特权

评论回复
11
cl234583745|  楼主 | 2015-3-25 12:57 | 只看该作者
本帖最后由 cl234583745 于 2015-3-25 13:01 编辑
仿真单步时候。红色2句根本不经过,直接从上一句就跳进while里面了。不知道怎么回事。我测试把这两句放别的地方也不行。只有把ReadFromReg(1);注释掉。 WriteToReg(0x40);才执行。要说不论发的对错都应该执行啊,位置这2句放一起就都不执行了呢。
读写函数同上面2楼一样
  unsigned char DataRead[3];
  ResetTime=32;
        SCLOCK=1;

         CS=0;                  //to keep DIN=1 for 32 sclock to reset the part
         DIN=1;
         while(ResetTime--)
        {
                Delay(10);
                SCLOCK=0;
                Delay(10);
                 SCLOCK=1;
        }
         CS=1;        
      ////////////////////////////////////////////////////////////        
      WriteToReg(0x10); //write to Communication register.The next step is writing to Configuration register.选择配置寄存器0x10
      WriteToReg(0x10); //set the Configuration bipolar mode.Gain=1.                            配置寄存器的高8位--双极模式            
      WriteToReg(0x80); //Configuration internal reference selected.                                        低8位--有缓冲器
      //////////////////////////////////////////////////////////////////
      WriteToReg(0x28);//写io寄存器
      WriteToReg(0x03); //使能和选择激励电流

                                             
  for(;;)
  {
   

      //ReadAll_AD();//读取模拟接口

      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
      WriteToReg(0x08);//write to Communication register.The next step is writing to Mode register.选择模式寄存器0x08
      WriteToReg(0x20);//set the mode register as single conversion mode.                        单次转换模式         
      WriteToReg(0x0A);//inter 64 kHZ clock.internal clock is not available at the clk pin.内部  64k时钟不提供给clk引脚
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         
              
              
      WriteToReg(0x40);//write to Communication register.The next step is to read from Status register.读时候为状态寄存器,写时候为通信寄存器

      ReadFromReg(1);

              
      while((DataRead[0]&0x80)==0x80)//wait for the end of convertion by polling the status register RDY bit

      {
        
              WriteToReg(0x40);
              ReadFromReg(1);        
      }
      
      

      WriteToReg(0x58);//write to Communication register.The next step is to read from Data register.选择数据寄存器并且读数据寄存器0x58

      ReadFromReg(2);
      
               
                        
        __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */


使用特权

评论回复
12
捡漏王子| | 2015-3-25 13:10 | 只看该作者
cl234583745 发表于 2015-3-25 12:57
仿真单步时候。红色2句根本不经过,直接从上一句就跳进while里面了。不知道怎么回事。我测试把这两句放别的 ...

这个我确实没办法帮你了,原则上没问题了。
再看看外部3线制的接线对不对?

使用特权

评论回复
13
cl234583745|  楼主 | 2015-3-25 13:19 | 只看该作者
本帖最后由 cl234583745 于 2015-3-25 13:20 编辑
捡漏王子 发表于 2015-3-25 13:10
这个我确实没办法帮你了,原则上没问题了。
再看看外部3线制的接线对不对? ...

就是如图的接法。楼上的算法对吗?内置参考电压好像就不是差分输入了。差分要外部参考电压。计算出电压AIN后,怎么转换成pt100的阻值呢?运行的状态下测pt100 12脚电压56mv,电阻300欧。单独测pt100 12引脚电阻111欧。

使用特权

评论回复
14
捡漏王子| | 2015-3-25 13:27 | 只看该作者
cl234583745 发表于 2015-3-25 13:19
就是如图的接法。楼上的算法对吗?内置参考电压好像就不是差分输入了。差分要外部参考电压。计算出电压AIN ...

你的AD值是怎么组成的? DataRead[0]与 DataRead[1]的关系?

使用特权

评论回复
15
cl234583745|  楼主 | 2015-3-25 13:37 | 只看该作者
捡漏王子 发表于 2015-3-25 13:27
你的AD值是怎么组成的? DataRead[0]与 DataRead[1]的关系?

unsigned char DataRead[3];用来存读到的结果啊 3*8=24位。
度16位ad 2*8=16.就是读2次

data.jpg (35.74 KB )

data.jpg

使用特权

评论回复
16
捡漏王子| | 2015-3-25 13:41 | 只看该作者
cl234583745 发表于 2015-3-25 13:37
unsigned char DataRead[3];用来存读到的结果啊 3*8=24位。
度16位ad 2*8=16.就是读2次
...

OK,明白
我也找不到问题所在了

使用特权

评论回复
17
cl234583745|  楼主 | 2015-3-25 13:48 | 只看该作者
捡漏王子 发表于 2015-3-25 13:41
OK,明白
我也找不到问题所在了

那你说我上面计算的对吧?
若是外部参考电压。计算出来AIN后  怎么转换成阻值呢?也是r=u/i吗?跟那个512的参考电阻有关系吗?那个参考电阻阻值怎么确定的呢

使用特权

评论回复
18
cl234583745|  楼主 | 2015-3-25 14:00 | 只看该作者
捡漏王子 发表于 2015-3-25 13:10
这个我确实没办法帮你了,原则上没问题了。
再看看外部3线制的接线对不对? ...

我测量我抄的板子,运行下pt100 12电阻大概100多欧,电压在不超过30mv之内一直变化的,参考电阻两端电压也是一直跳动变化的。我的为啥都很稳定呢

使用特权

评论回复
19
捡漏王子| | 2015-3-25 14:13 | 只看该作者
cl234583745 发表于 2015-3-25 13:48
那你说我上面计算的对吧?
若是外部参考电压。计算出来AIN后  怎么转换成阻值呢?也是r=u/i吗?跟那个512 ...

外部参考的话根据你提供的一路电流大小和512电阻确定参考电压大小,其余计算一致

使用特权

评论回复
20
捡漏王子| | 2015-3-25 14:15 | 只看该作者
cl234583745 发表于 2015-3-25 14:00
我测量我抄的板子,运行下pt100 12电阻大概100多欧,电压在不超过30mv之内一直变化的,参考电阻两端电压 ...

带电情况下测量的电阻?不合理
电压跳动我猜测他是多通道在切换

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

644

帖子

1

粉丝