基于16位ADC芯片TM7705+AD623仪表运放的电压和电流信号采集的方案验证板_PDF_C95040
焊接完成后的实物图:
材料清单bom
硬件原理图和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为直接采集信号,不做放大处理。
单片机源程序如下:
- /******************** 新创电子007 ***************
- * File Name : MAIN.h
- * Author :
- * Version : Keil uVision4
- * Description : public header file
- *免责声明: 1.此程序为TM7705演示程序,仅作参考之用。
- 2.如有直接使用本例程程序造成经济损失的,不承担任何责任
- *******************************************************/
- #include<STC15F2K60S2.h>
- #include<usart.h>
- #include<intrins.h>
- #include <TM7705.h>
- #define ENABLE_ISP 0x83
- #define uint unsigned int
- #define uchar unsigned char
- sbit P1_3=P1^3;
- uchar TimeN=0,BZ=1,sbuf[2]={0,0},Step=0;
- xdata uchar uart_buf1[60],uart_buf2[60],S1=0,SBZ1=0,Slen1=0,send_buf[50];
- uchar ChaoShi1=0,Address=0xfe;
- uint ADis[4]={0,0,0,0}; //ADC实时值
- unsigned long mV=0,mA=0; //采集电压和电流值
- void Delay1(uint ms)
- {
- uint i;
- while(ms--)
- {
- for(i=1;i<(uint)(8*143-2);i++)
- ;
- }
- }
- void Init() //定时器初始化
- {
- TMOD=0x01;
- ET0=1; //T0内部中断 允许
- TH0=0xec; //5MS延时
- TL0=0x78;
- EA=1; //开启总中断
- TR0=1; //启动定时器0
- }
- void GetAD()
- {
- uchar temp1,temp2;
- uint temp;
- float Dis1=2498.000000,Dis2=65535.000000,Dis3=0.000000;
- //基准电压值 万用表测量
- if(Step==0)
- {
- write_byte_TM7705(1,0x10); //通道1(0 0 0 1 0 0 0 0),写通讯寄存器下一步写设置寄存器
- 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
- Step=2;
- }
- if(Step==1)
- {
- write_byte_TM7705(1,0x11); //通道1(0 0 0 1 0 0 0 0),写通讯寄存器下一步写设置寄存器
- 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;
- Step=3;
- }
- if(P1_3==0)
- {
- if(Step==2)
- {
- write_byte_TM7705(1,0x38); //读通道1
- temp1=read_byte_TM7705(1); //先读高位
- temp2=read_byte_TM7705(1); //再读低位
- temp=temp1*256+temp2;
- Dis3=Dis1/Dis2;
- Dis3=temp*Dis3;
- mV=Dis3*500; //电压值换算,输入电压0-1.25V 运放放大倍数2(电位器100K时),程序做了除2处理
- Step=1;
- }
- if(Step==3)
- {
- write_byte_TM7705(1,0x39); //读通道2
- temp1=read_byte_TM7705(1); //先读高位
- temp2=read_byte_TM7705(1); //再读低位
- temp=temp1*256+temp2;
- Dis3=Dis1/Dis2;
- Dis3=temp*Dis3;
- mA=Dis3*10; //电流值换算,输入电电流0-20mA
- Step=0;
- }
- }
- }
- void main()
- {
- uchar i;
- P1M1=0;P0M0=0;
- Delay1(50);
- Init();
- InitCom1();
- delay_nms(50);
- TM7705_init(1);
- delay_nms(50);
- UARTSendByte1(Address);
- //WDT_CONTR=0x34;//启动看门狗
- while(1)
- {
- // WDT_CONTR|=0x10;//清看门狗
- GetAD(); //ADC 通道1和通道2轮流采集,采集频率50HZ
- if(BZ==1) //每1秒主动上传采集结果
- {
- BZ=0;
- UARTSendByte1(mV/1000000+'0');
- UARTSendByte1(mV%1000000/100000+'0');
- UARTSendByte1(mV%100000/10000+'0');
- UARTSendByte1(mV%10000/1000+'0');
- UARTSendByte1('.');
- UARTSendByte1(mV%1000/100+'0');
- UARTSendByte1(mV%100/10+'0');
- UARTSendByte1(mV%10+'0');
- UARTSendByte1('m');
- UARTSendByte1('V');
- UARTSendByte1(' ');
- UARTSendByte1(mA/1000000+'0');
- UARTSendByte1(mA%1000000/100000+'0');
- UARTSendByte1(mA%100000/10000+'0');
- UARTSendByte1(mA%10000/1000+'0');
- UARTSendByte1('.');
- UARTSendByte1(mA%1000/100+'0');
- UARTSendByte1(mA%100/10+'0');
- UARTSendByte1(mA%10+'0');
- UARTSendByte1('m');
- UARTSendByte1('A');
- UARTSendByte1('\n');
- }
- if(SBZ1==1)
- {
-
- for(i=0;i<uart_buf2[3];i++)
- {
- uart_buf1[i]=uart_buf2[i];
- }
- SBZ1=0;
- }//SBZ1
- }//while
- }//main
- void int2() interrupt 1 // 时钟中断 0
- {
- TH0=0xdc; //约5ms
- TL0=0x00;
- TimeN++;
- ChaoShi1++;
- if(ChaoShi1>5) //数据接收超时
- {
- S1=0;
- ChaoShi1=0;
- }
- if(TimeN>=200)
- {
- TimeN=0;
- BZ=1;
- }
- // if(TimeN==1) LED_DY=0; //电源指示灯闪烁
- // if(TimeN==8) LED_DY=1; //电源指示灯闪烁
- }
- void UART_Interrupt_Receive(void) interrupt 4 //串口1
- {
- if(RI==1)
- {
- RI=0;
- uart_buf2[S1]=SBUF;
- S1++;
- ChaoShi1=0;
- }else{TI=0;}
- if(S1==1) //数据包头
- {
- if(uart_buf2[0]!=0xff) S1=0;
- }
- if(S1==2) //数据包头
- {
- if(uart_buf2[1]!=0x5c) S1=0;
- if(uart_buf2[1]==0xff) {S1=1;uart_buf2[0]=uart_buf2[1];}
- }
- if(S1==3) //设备地址
- {
- if(uart_buf2[2]!=Address) S1=0;
- if(uart_buf2[2]==0xff){S1=1;uart_buf2[0]=uart_buf2[2];}
-
- }
- if(S1==4) //数据长度
- {
- if(uart_buf2[3]>50){S1=0;Slen1=0;}
- else Slen1=uart_buf2[3];
- if(uart_buf2[3]==0xFF){S1=1;uart_buf2[0]=uart_buf2[3];Slen1=0;}
- }
- if(S1>=Slen1&&S1>6)
- {S1=0;SBZ1=1;Slen1=0;} //S1接收字节计数,SBZ1串口1接收完成标志 1完成 0未完成,Slen数据长度
- if(S1>51) //缓冲区溢出
- {
- S1=0;Slen1=0;
- }
- }
复制代码- /******************** 新创电子007 ***************
- * File Name : MAIN.h
- * Author :
- * Version : Keil uVision4
- * Date First Issued : 24/01/2017
- * Description : 单片机22.1184MHZ、TM7705外部晶振4.9152MHZ
- TM7705读取采集到的16bit AD数据经过换算后,每秒通过串口1发送采集结果
- *免责声明: 1.此程序为TM7705演示程序,仅作参考之用。
- 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任
- *******************************************************/
- #include <STC15F2K60S2.h>
- #include <TM7705.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit SCLK_TM7705=P1^0; //定义SCLK时钟信号端口
- sbit DIN_TM7705=P1^5; //定义DIN数据输入端口
- sbit DOUT_TM7705=P1^4; //定义DOUT数据输出端口
- sbit DRDY1=P1^3; //定义DRDY可读AD端口
- sbit CS1=P1^1; //定义DRDY可读AD端口
- sbit RST1=P1^2; //定义DRDY可读AD端口
- sbit DRDY2=P5^4; //定义DRDY可读AD端口
- sbit CS2=P5^4; //定义DRDY可读AD端口
- sbit RST2=P5^4; //定义DRDY可读AD端口
- sbit DRDY3=P5^4; //定义DRDY可读AD端口
- sbit CS3=P5^4; //定义DRDY可读AD端口
- sbit RST3=P5^4; //定义DRDY可读AD端口
- sbit DRDY4=P5^4; //定义DRDY可读AD端口
- sbit CS4=P5^4; //定义DRDY可读AD端口
- sbit RST4=P5^4; //定义DRDY可读AD端口
- void delay_us() //短延时函数,晶振11.0592MHZ,延时约1us
- {
- ; ; ;
- }
- void delay_nms(uchar n) //延时约nms
- {
- uchar i;
- while(n--)
- for(i=0;i<125;i++);
- }
- void write_byte_TM7705(uchar a,uchar dat1) //将数据dat1写入TM7705
- {
- uchar i;
- switch(a)
- {
- case 1: CS1=0;CS2=1;CS3=1;CS4=1;break;
- case 2: CS2=0;CS1=1;CS3=1;CS4=1;break;
- case 3: CS3=0;CS1=1;CS2=1;CS4=1;break;
- case 4: CS4=0;CS1=1;CS2=1;CS3=1;break;
- default:break;
- }
- SCLK_TM7705=1;
- for(i=0;i<8;i++)
- {
- SCLK_TM7705=0;
- delay_us();
- if(dat1&0x80) DIN_TM7705=1; //先写高位
- else DIN_TM7705=0;
- delay_us();
- SCLK_TM7705=1;
- delay_us();
- dat1<<=1;
- }
- SCLK_TM7705=1;
- DIN_TM7705=1;
- CS1=1;CS2=1;CS3=1;CS4=1;
- }
- unsigned char read_byte_TM7705(uchar a) //从TM7705寄存器读数据
- {
- uchar i,dat2=0;
- switch(a)
- {
- case 1: CS1=0;CS2=1;CS3=1;CS4=1;break;
- case 2: CS2=0;CS1=1;CS3=1;CS4=1;break;
- case 3: CS3=0;CS1=1;CS2=1;CS4=1;break;
- case 4: CS4=0;CS1=1;CS2=1;CS3=1;break;
- default:break;
- }
- SCLK_TM7705=1;
- for(i=0;i<8;i++)
- {
- SCLK_TM7705=0;
- delay_us();
- dat2=(dat2<<1)|DOUT_TM7705; // 高位先读
- delay_us();
- SCLK_TM7705=1;
- delay_us();
- }
- SCLK_TM7705=1;
- CS1=1;CS2=1;CS3=1;CS4=1;
- return dat2;
- }
- void TM7705_init(uchar a)
- {
- uchar i;
- RST1=1;RST2=1;RST3=1;RST4=1;
- switch(a)
- {
- case 1: CS1=0;CS2=1;CS3=1;CS4=1;RST1=1;break;
- case 2: CS2=0;CS1=1;CS3=1;CS4=1;RST2=1;break;
- case 3: CS3=0;CS1=1;CS2=1;CS4=1;RST3=1;break;
- case 4: CS4=0;CS1=1;CS2=1;CS3=1;RST4=1;break;
- default:break;
- }
- SCLK_TM7705=1;
- DIN_TM7705=1;
- DOUT_TM7705=1;
- switch(a)
- {
- case 1: DRDY1=1;break;
- case 2: DRDY2=1;break;
- case 3: DRDY3=1;break;
- case 4: DRDY4=1;break;
- default:break;
- }
- for(i=0;i<40;i++)
- {
- SCLK_TM7705=0;
- delay_us();
- SCLK_TM7705=1;
- delay_us();
- }
- delay_us();
- delay_us();
-
- /*********以下为设置通道1************/
- write_byte_TM7705(a,0x20); //通道1(0 0 1 0 0 0 0 0),写通讯寄存器下一步写时钟寄存器
- write_byte_TM7705(a,0x0C); //50HZ(0 0 0 0 1 1 0 0) 因为晶振为4.9152MHZ需设置CLKDIV=1,CLK=1;
-
- write_byte_TM7705(a,0x10); //通道1(0 0 0 1 0 0 0 0),写通讯寄存器下一步写设置寄存器
- // 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;
- write_byte_TM7705(a,0x44);
- /*********以下为设置通道2************/
- /* write_byte_TM7705(a,0x21); //通道2(0 0 1 0 0 0 0 1),写通讯寄存器下一步写时钟寄存器
- write_byte_TM7705(a,0x0c); //50HZ(0 0 0 0 0 1 0 0),若晶振为2.4576MHZ需设置CLKDIV=0,CLK=1;
- //write_byte_TM7705(0x08); //20HZ(0 0 0 0 1 0 0 0),若晶振为2MHZ需设置CLKDIV=1,CLK=0;
- write_byte_TM7705(a,0x11); //通道2(0 0 0 1 0 0 0 1),写通讯寄存器下一步写设置寄存器
- 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;
- CS1=1;CS2=1;CS3=1;CS4=1;
- }
复制代码
所有资料51hei提供下载:
基于16位ADC芯片TM7705的电压和电流信号采集的方案验证板_PDF_C95040_2017-04-12.rar
(1.96 MB, 下载次数: 678)
|