找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27311|回复: 30
收起左侧

16位ADC TM7705电压和电流信号采集的单片机源码及原理图和PCB图

  [复制链接]
ID:330238 发表于 2018-5-17 11:29 | 显示全部楼层 |阅读模式
基于16位ADC芯片TM7705+AD623仪表运放的电压和电流信号采集的方案验证板_PDF_C95040

0.png

焊接完成后的实物图:
0.png

材料清单bom
0.jpg

硬件原理图和pcb工程可以到附件中下载


TM7705方案验证板的使用说明

本验证板通过制作一个基于TM7705的ADC模数转换电路,进行电压和电流信号的采集验证。




为了使用正常使用这个PCB空板,请大家按照一下步骤进行操作:

第1步: 根据BOM表,焊接出PCBA。焊接过程中,需要注意的是TM7705这款芯片有宽体(SOIC-16_300mil)和窄体(SOIC-16_150mil)2个封装,此验证板已经做了兼容处理,2个封装均可焊接,用户自己设计电路时需要注意。
        另外,STC单片机是可以不焊接的,用户通过引出的功能脚,可以用自己的单片机直接控制TM7705。
        注:验证板上的R6电阻不用焊接。
第2步:焊接好后,先用万用表测试一下,看看是否存在有PCB焊接短路现象,用商城 的CH340 USB转串口模块或者STC编程器给验证板供电。


第3步:使用STC官方烧录软件及商城 的CH340 USB转串口模块或者STC编程器,接线顺序5V RxD TxD 0V给验证板烧录程序;



第4步:烧录成功后,不要拔掉编程器,打开串口助手,波特率设置9600,文本接收模式,此时通过TTL串口可以接收到验证板返回的测量数据,更新频率1s;


第5步:ENJOY!
此时可以在验证板的输入口:0-2.5V /4-20mA输入电压电流信号来验证ADC芯片的性能啦;
注:0-2.5V电压输入口输入放大倍数,是可以通过RP1点位器(100K)调节的;
        4-20mA为直接采集信号,不做放大处理。


单片机源程序如下:
  1. /******************** 新创电子007 ***************
  2. * File Name          : MAIN.h
  3. * Author             :
  4. * Version                         : Keil uVision4
  5. * Description        : public header file
  6. *免责声明:   1.此程序为TM7705演示程序,仅作参考之用。
  7.               2.如有直接使用本例程程序造成经济损失的,不承担任何责任        
  8. *******************************************************/

  9. #include<STC15F2K60S2.h>
  10. #include<usart.h>
  11. #include<intrins.h>
  12. #include <TM7705.h>

  13. #define ENABLE_ISP 0x83
  14. #define uint  unsigned int
  15. #define uchar unsigned char

  16. sbit P1_3=P1^3;

  17. uchar TimeN=0,BZ=1,sbuf[2]={0,0},Step=0;
  18. xdata uchar uart_buf1[60],uart_buf2[60],S1=0,SBZ1=0,Slen1=0,send_buf[50];
  19. uchar ChaoShi1=0,Address=0xfe;
  20. uint ADis[4]={0,0,0,0};        //ADC实时值
  21. unsigned long mV=0,mA=0; //采集电压和电流值

  22. void Delay1(uint ms)
  23. {
  24.     uint i;
  25.     while(ms--)   
  26.    {
  27.      for(i=1;i<(uint)(8*143-2);i++)
  28.          ;
  29.    }   
  30. }

  31. void Init()      //定时器初始化
  32. {
  33.         TMOD=0x01;
  34.     ET0=1;            //T0内部中断        允许        
  35.         TH0=0xec;         //5MS延时
  36.         TL0=0x78;
  37.         EA=1;             //开启总中断
  38.         TR0=1;            //启动定时器0        
  39. }

  40. void GetAD()
  41. {
  42.         uchar temp1,temp2;
  43.         uint temp;
  44.         float Dis1=2498.000000,Dis2=65535.000000,Dis3=0.000000;
  45.                   //基准电压值 万用表测量
  46.                 if(Step==0)
  47.                 {
  48.                         write_byte_TM7705(1,0x10);         //通道1(0 0 0 1 0 0 0 0),写通讯寄存器下一步写设置寄存器
  49.                     write_byte_TM7705(1,0x44);        //写入设置寄存器(0 1 0 0 0 1 0 0),自校准模式0 1,1倍增益0 0 0,单极性B/U=1,buf串联设置为0,FSYNC=0        
  50.                         Step=2;
  51.                 }
  52.                 if(Step==1)
  53.                 {
  54.                    write_byte_TM7705(1,0x11);         //通道1(0 0 0 1 0 0 0 0),写通讯寄存器下一步写设置寄存器
  55.                    write_byte_TM7705(1,0x44);           //写入设置寄存器(0 1 0 0 0 0 0 0),自校准模式0 1,16倍增益0 0 0,双极性B/U=0,buf串联设置为0,FSYNC=0;
  56.                    Step=3;
  57.                 }
  58.                 if(P1_3==0)
  59.                 {
  60.                         if(Step==2)
  61.                         {
  62.                                 write_byte_TM7705(1,0x38);          //读通道1
  63.                                 temp1=read_byte_TM7705(1);        //先读高位
  64.                                 temp2=read_byte_TM7705(1); //再读低位
  65.                                 temp=temp1*256+temp2;
  66.                                 Dis3=Dis1/Dis2;
  67.                                 Dis3=temp*Dis3;
  68.                                 mV=Dis3*500;                //电压值换算,输入电压0-1.25V 运放放大倍数2(电位器100K时),程序做了除2处理
  69.                                 Step=1;
  70.                         }        

  71.                 if(Step==3)
  72.                 {
  73.                         write_byte_TM7705(1,0x39);          //读通道2
  74.                         temp1=read_byte_TM7705(1);        //先读高位
  75.                         temp2=read_byte_TM7705(1); //再读低位
  76.                         temp=temp1*256+temp2;
  77.                         Dis3=Dis1/Dis2;
  78.                         Dis3=temp*Dis3;
  79.                         mA=Dis3*10;                                //电流值换算,输入电电流0-20mA
  80.                         Step=0;
  81.                 }
  82.         }        
  83. }
  84. void main()
  85. {
  86.         uchar i;
  87.         P1M1=0;P0M0=0;
  88.         Delay1(50);
  89.         Init();
  90.         InitCom1();
  91.         delay_nms(50);  
  92.         TM7705_init(1);
  93.         delay_nms(50);
  94.         UARTSendByte1(Address);

  95.         //WDT_CONTR=0x34;//启动看门狗           
  96.         while(1)
  97.         {
  98.         //        WDT_CONTR|=0x10;//清看门狗
  99.                 GetAD();                 //ADC 通道1和通道2轮流采集,采集频率50HZ
  100.                 if(BZ==1)                 //每1秒主动上传采集结果
  101.                 {
  102.                         BZ=0;
  103.                         UARTSendByte1(mV/1000000+'0');
  104.                         UARTSendByte1(mV%1000000/100000+'0');
  105.                         UARTSendByte1(mV%100000/10000+'0');        
  106.                         UARTSendByte1(mV%10000/1000+'0');
  107.                         UARTSendByte1('.');        
  108.                         UARTSendByte1(mV%1000/100+'0');
  109.                         UARTSendByte1(mV%100/10+'0');
  110.                         UARTSendByte1(mV%10+'0');
  111.                         UARTSendByte1('m');
  112.                         UARTSendByte1('V');
  113.                         UARTSendByte1(' ');
  114.                         UARTSendByte1(mA/1000000+'0');
  115.                         UARTSendByte1(mA%1000000/100000+'0');
  116.                         UARTSendByte1(mA%100000/10000+'0');        
  117.                         UARTSendByte1(mA%10000/1000+'0');
  118.                         UARTSendByte1('.');        
  119.                         UARTSendByte1(mA%1000/100+'0');
  120.                         UARTSendByte1(mA%100/10+'0');
  121.                         UARTSendByte1(mA%10+'0');
  122.                         UARTSendByte1('m');
  123.                         UARTSendByte1('A');
  124.                         UARTSendByte1('\n');        
  125.                 }
  126.                 if(SBZ1==1)
  127.                 {
  128.                
  129.                                 for(i=0;i<uart_buf2[3];i++)
  130.                                 {
  131.                                         uart_buf1[i]=uart_buf2[i];
  132.                                 }
  133.                                 SBZ1=0;
  134.                 }//SBZ1
  135.         }//while         
  136. }//main
  137. void int2() interrupt 1              // 时钟中断  0
  138. {
  139.         TH0=0xdc;                 //约5ms
  140.         TL0=0x00;
  141.         TimeN++;
  142.         ChaoShi1++;
  143.         if(ChaoShi1>5)           //数据接收超时
  144.         {                 
  145.                 S1=0;        
  146.                 ChaoShi1=0;
  147.         }
  148.         if(TimeN>=200)
  149.         {
  150.                 TimeN=0;
  151.                 BZ=1;
  152.         }
  153. //        if(TimeN==1) LED_DY=0;          //电源指示灯闪烁
  154. //        if(TimeN==8) LED_DY=1;          //电源指示灯闪烁
  155. }
  156. void UART_Interrupt_Receive(void) interrupt 4                //串口1
  157. {
  158.         if(RI==1)
  159.         {
  160.                 RI=0;
  161.                 uart_buf2[S1]=SBUF;
  162.                 S1++;
  163.                 ChaoShi1=0;
  164.         }else{TI=0;}

  165.         if(S1==1)                                                                   //数据包头
  166.         {
  167.                 if(uart_buf2[0]!=0xff) S1=0;               
  168.         }                                                                                   
  169.         if(S1==2)                                                                   //数据包头
  170.         {
  171.                 if(uart_buf2[1]!=0x5c) S1=0;
  172.                 if(uart_buf2[1]==0xff)        {S1=1;uart_buf2[0]=uart_buf2[1];}
  173.         }
  174.         if(S1==3)                                                                         //设备地址
  175.         {
  176.                 if(uart_buf2[2]!=Address) S1=0;
  177.                 if(uart_buf2[2]==0xff){S1=1;uart_buf2[0]=uart_buf2[2];}
  178.                
  179.         }
  180.         if(S1==4)                                                                         //数据长度
  181.         {
  182.                 if(uart_buf2[3]>50){S1=0;Slen1=0;}
  183.                 else Slen1=uart_buf2[3];
  184.                 if(uart_buf2[3]==0xFF){S1=1;uart_buf2[0]=uart_buf2[3];Slen1=0;}
  185.         }           
  186.         if(S1>=Slen1&&S1>6)
  187.         {S1=0;SBZ1=1;Slen1=0;}                                                //S1接收字节计数,SBZ1串口1接收完成标志 1完成 0未完成,Slen数据长度
  188.         if(S1>51)                                                                        //缓冲区溢出
  189.         {
  190.                 S1=0;Slen1=0;        
  191.         }
  192. }
复制代码
  1. /******************** 新创电子007 ***************
  2. * File Name          : MAIN.h
  3. * Author             :
  4. * Version                         : Keil uVision4
  5. * Date First Issued  : 24/01/2017
  6. * Description        : 单片机22.1184MHZ、TM7705外部晶振4.9152MHZ
  7.                        TM7705读取采集到的16bit AD数据经过换算后,每秒通过串口1发送采集结果
  8. *免责声明:   1.此程序为TM7705演示程序,仅作参考之用。
  9.                2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任               
  10. *******************************************************/


  11. #include <STC15F2K60S2.h>
  12. #include <TM7705.h>

  13. #define uchar unsigned char
  14. #define uint unsigned int

  15. sbit SCLK_TM7705=P1^0;           //定义SCLK时钟信号端口
  16. sbit DIN_TM7705=P1^5;           //定义DIN数据输入端口
  17. sbit DOUT_TM7705=P1^4;           //定义DOUT数据输出端口

  18. sbit DRDY1=P1^3;           //定义DRDY可读AD端口
  19. sbit CS1=P1^1;           //定义DRDY可读AD端口
  20. sbit RST1=P1^2;           //定义DRDY可读AD端口

  21. sbit DRDY2=P5^4;           //定义DRDY可读AD端口
  22. sbit CS2=P5^4;           //定义DRDY可读AD端口
  23. sbit RST2=P5^4;           //定义DRDY可读AD端口

  24. sbit DRDY3=P5^4;           //定义DRDY可读AD端口
  25. sbit CS3=P5^4;           //定义DRDY可读AD端口
  26. sbit RST3=P5^4;           //定义DRDY可读AD端口

  27. sbit DRDY4=P5^4;           //定义DRDY可读AD端口
  28. sbit CS4=P5^4;           //定义DRDY可读AD端口
  29. sbit RST4=P5^4;           //定义DRDY可读AD端口

  30. void delay_us()                          //短延时函数,晶振11.0592MHZ,延时约1us
  31. {
  32. ; ; ;
  33. }

  34. void delay_nms(uchar n)                        //延时约nms
  35. {
  36.   uchar i;
  37.   while(n--)
  38.     for(i=0;i<125;i++);
  39. }

  40. void write_byte_TM7705(uchar a,uchar dat1)        //将数据dat1写入TM7705
  41. {
  42.   uchar i;
  43.   switch(a)
  44.   {
  45.           case 1: CS1=0;CS2=1;CS3=1;CS4=1;break;
  46.         case 2:        CS2=0;CS1=1;CS3=1;CS4=1;break;
  47.         case 3:        CS3=0;CS1=1;CS2=1;CS4=1;break;
  48.         case 4:        CS4=0;CS1=1;CS2=1;CS3=1;break;
  49.         default:break;
  50.   }
  51.   SCLK_TM7705=1;
  52.   for(i=0;i<8;i++)
  53.   {
  54.     SCLK_TM7705=0;
  55.         delay_us();
  56.         if(dat1&0x80) DIN_TM7705=1;           //先写高位
  57.           else        DIN_TM7705=0;
  58.          delay_us();
  59.          SCLK_TM7705=1;
  60.          delay_us();
  61.          dat1<<=1;
  62.   }
  63.    SCLK_TM7705=1;
  64.    DIN_TM7705=1;
  65.    CS1=1;CS2=1;CS3=1;CS4=1;
  66. }

  67. unsigned char read_byte_TM7705(uchar a)   //从TM7705寄存器读数据
  68. {
  69.   uchar i,dat2=0;
  70.   switch(a)
  71.   {
  72.           case 1: CS1=0;CS2=1;CS3=1;CS4=1;break;
  73.         case 2:        CS2=0;CS1=1;CS3=1;CS4=1;break;
  74.         case 3:        CS3=0;CS1=1;CS2=1;CS4=1;break;
  75.         case 4:        CS4=0;CS1=1;CS2=1;CS3=1;break;
  76.         default:break;
  77.   }
  78.   SCLK_TM7705=1;
  79.   for(i=0;i<8;i++)
  80.   {
  81.     SCLK_TM7705=0;
  82.         delay_us();
  83.         dat2=(dat2<<1)|DOUT_TM7705;          // 高位先读
  84.         delay_us();
  85.         SCLK_TM7705=1;
  86.         delay_us();
  87.   }
  88.         SCLK_TM7705=1;
  89.          CS1=1;CS2=1;CS3=1;CS4=1;
  90.         return dat2;
  91. }


  92. void TM7705_init(uchar a)
  93. {
  94.   uchar i;
  95.   RST1=1;RST2=1;RST3=1;RST4=1;
  96.   switch(a)
  97.   {
  98.           case 1: CS1=0;CS2=1;CS3=1;CS4=1;RST1=1;break;
  99.         case 2:        CS2=0;CS1=1;CS3=1;CS4=1;RST2=1;break;
  100.         case 3:        CS3=0;CS1=1;CS2=1;CS4=1;RST3=1;break;
  101.         case 4:        CS4=0;CS1=1;CS2=1;CS3=1;RST4=1;break;
  102.         default:break;
  103.   }
  104.   SCLK_TM7705=1;
  105.   DIN_TM7705=1;
  106.   DOUT_TM7705=1;
  107.   switch(a)
  108.   {
  109.           case 1: DRDY1=1;break;
  110.         case 2:        DRDY2=1;break;
  111.         case 3:        DRDY3=1;break;
  112.         case 4:        DRDY4=1;break;
  113.         default:break;
  114.   }

  115.   for(i=0;i<40;i++)
  116.   {
  117.    SCLK_TM7705=0;
  118.    delay_us();
  119.    SCLK_TM7705=1;
  120.    delay_us();
  121.   }
  122.    delay_us();
  123.    delay_us();

  124.    /*********以下为设置通道1************/
  125.    write_byte_TM7705(a,0x20);          //通道1(0 0 1 0 0 0 0 0),写通讯寄存器下一步写时钟寄存器
  126.    write_byte_TM7705(a,0x0C);          //50HZ(0 0 0 0 1 1 0 0)         因为晶振为4.9152MHZ需设置CLKDIV=1,CLK=1;
  127.   
  128.    write_byte_TM7705(a,0x10);         //通道1(0 0 0 1 0 0 0 0),写通讯寄存器下一步写设置寄存器
  129.   // write_byte_TM7705(0x7C);        //写入设置寄存器(0 1 1 1 1 1 0 0)自校准模式0 1,1倍增益0 0 0,单极性B/U=1,buf串联设置为0,FSYNC=0;
  130.    write_byte_TM7705(a,0x44);
  131.    /*********以下为设置通道2************/
  132. /*   write_byte_TM7705(a,0x21);          //通道2(0 0 1 0 0 0 0 1),写通讯寄存器下一步写时钟寄存器
  133.    write_byte_TM7705(a,0x0c);          //50HZ(0 0 0 0 0 1 0 0),若晶振为2.4576MHZ需设置CLKDIV=0,CLK=1;
  134.    //write_byte_TM7705(0x08);          //20HZ(0 0 0 0 1 0 0 0),若晶振为2MHZ需设置CLKDIV=1,CLK=0;
  135.    write_byte_TM7705(a,0x11);         //通道2(0 0 0 1 0 0 0 1),写通讯寄存器下一步写设置寄存器
  136.    write_byte_TM7705(a,0x44);*/        //写入设置寄存器(0 1 0 0 0 1 0 0)自校准模式0 1,1倍增益0 0 0,单极性B/U=1,buf串联设置为0,FSYNC=0;
  137.    CS1=1;CS2=1;CS3=1;CS4=1;

  138. }
复制代码

0.jpg

所有资料51hei提供下载:
基于16位ADC芯片TM7705的电压和电流信号采集的方案验证板_PDF_C95040_2017-04-12.rar (1.96 MB, 下载次数: 678)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:332810 发表于 2018-5-18 11:03 | 显示全部楼层
学习一下好资料,51黑有你更精彩!!!
可惜原理图PCB是protel99格式的,我没有,有人能帮忙转成AD格式的吗?
回复

使用道具 举报

ID:65956 发表于 2018-9-27 08:41 | 显示全部楼层
用这个方案还需要个电压基准源就比较麻烦
回复

使用道具 举报

ID:149642 发表于 2019-4-14 11:38 来自手机 | 显示全部楼层
非常感谢,可惜我只会汇编,慢慢研究吧
回复

使用道具 举报

ID:410674 发表于 2019-7-18 08:29 | 显示全部楼层
很好,这个可以用于12位的ADC吗
回复

使用道具 举报

ID:281113 发表于 2019-10-12 10:07 | 显示全部楼层
采样速度不搞吧!
回复

使用道具 举报

ID:125719 发表于 2019-10-12 10:56 | 显示全部楼层
用这个可以测量微弱电流吗,
回复

使用道具 举报

ID:79874 发表于 2019-10-16 16:51 来自手机 | 显示全部楼层
可以测量弱信号
回复

使用道具 举报

ID:625111 发表于 2019-10-16 22:23 | 显示全部楼层
这个方案还需要个电压基准源就比较麻烦
回复

使用道具 举报

ID:72088 发表于 2019-10-20 11:09 | 显示全部楼层
aking991 发表于 2018-9-27 08:41
用这个方案还需要个电压基准源就比较麻烦

AD7705需要外接基准电压源,TM7705也可以不接电压基准,TM7705内部有2.48V基准电压源
向测试寄存器写入01H指令,内部基准就可以工作了
回复

使用道具 举报

ID:72088 发表于 2019-10-20 11:10 | 显示全部楼层
sgly 发表于 2019-7-18 08:29
很好,这个可以用于12位的ADC吗

这是16位的
回复

使用道具 举报

ID:637221 发表于 2019-11-15 16:58 | 显示全部楼层
原理图怎么打开呢?
回复

使用道具 举报

ID:275111 发表于 2019-12-10 15:42 | 显示全部楼层
fufeijue 发表于 2019-11-15 16:58
并没有原理图。。。。坑人?

没有原理图就算了。我就是想看这个是怎么测量电流的。
回复

使用道具 举报

ID:275111 发表于 2019-12-10 15:50 | 显示全部楼层
有电路图。不过是99的。我用AD16转了之后可以打开。谢谢楼主。
回复

使用道具 举报

ID:384489 发表于 2019-12-19 17:35 | 显示全部楼层
学习一下,刚好看到AD7705。
回复

使用道具 举报

ID:352720 发表于 2020-1-17 00:20 | 显示全部楼层

学习一下,谢谢分享
回复

使用道具 举报

ID:283207 发表于 2020-2-5 00:20 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

ID:623647 发表于 2020-2-10 09:40 | 显示全部楼层
非常感谢楼主分享!
回复

使用道具 举报

ID:698129 发表于 2020-2-25 17:57 | 显示全部楼层
这个厉害了啊,牛逼
回复

使用道具 举报

ID:126065 发表于 2020-3-25 23:45 | 显示全部楼层
下载学习了 谢了
回复

使用道具 举报

ID:345127 发表于 2020-3-27 08:57 | 显示全部楼层
感谢楼主谢谢
回复

使用道具 举报

ID:390615 发表于 2020-6-8 11:30 | 显示全部楼层
这个电路我看过,觉得不错,应该挺稳定的
回复

使用道具 举报

ID:828712 发表于 2021-4-8 16:59 | 显示全部楼层
电压值换算:mV=Dis3*500;                //电压值换算,输入电压0-1.25V 运放放大倍数2(电位器100K时),程序做了除2处理
这里500怎么来的
回复

使用道具 举报

ID:885521 发表于 2021-9-28 19:25 | 显示全部楼层
为什么接上之后电流不管多大都是24.980ma呢。呜呜呜
回复

使用道具 举报

ID:863287 发表于 2022-2-25 15:45 | 显示全部楼层

学习一下好资料,51黑有你更精彩!!
回复

使用道具 举报

ID:872228 发表于 2022-2-28 16:52 | 显示全部楼层
可以加好友交流一下吗? 系统硬件与软件, 比较实用
回复

使用道具 举报

ID:230500 发表于 2022-3-5 20:29 | 显示全部楼层
非常感谢楼主分享!  可以参考做一个数字表头
回复

使用道具 举报

ID:85548 发表于 2022-7-4 10:11 | 显示全部楼层
目前正在弄一个数字表头,tm7707,采集。N76E003AT20单片机。单片机自带的spi接口,用着弄不明白。
回复

使用道具 举报

ID:622096 发表于 2022-7-31 21:19 | 显示全部楼层
谢谢,正要用这个芯片,很好的参考资料
回复

使用道具 举报

ID:968906 发表于 2023-4-6 09:27 | 显示全部楼层

很好,这个可以用于12位的ADC吗


回复

使用道具 举报

ID:1109055 发表于 2024-1-12 16:34 | 显示全部楼层
我用TM7705模块,电压测量后,和万用表测量的差0.012V,不知道是哪里问题,有没有谁碰到类似问题的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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