利用ADuC7060与铂电阻电桥实现测温功能
0赞
发表于 3/20/2012 12:18:04 PM
阅读(6260)
在过程控制中,经常需要对温度进行检测,一种简单的方法就是通过热电阻电桥进行测量,下面为大家简单介绍他的工作原理。
测量原理:
芯片简介:ADuC706x 系列是完全集成的8 kSPS、24 位数据采集系统,在单芯片内集成高性能多信道Σ-Δ 模数转换器(ADC)、16 位/32 位ARM7TDMI® MCU 和Flash/EE 存储器,它由内置两个差分对或四个单端通道的主ADC 和内置七个通道的辅助ADC 组成,可以工作在单端模式或差分输入模式下。片内集成一个单通道缓冲电压输出DAC。通过编程可以将DAC 输出范围设置为四种电压范围之一。
铂热电阻简介:简称铂电阻,它的阻值会随着温度的变化而改变。它有PT100HE PT1000等等系列产品。PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。它的工业原理:当PT100在0摄氏度的时候他的阻值为100欧姆,它的的阻值会随着温度上升它的电阻值是成匀速增涨的。
如果将一个电桥电路中4个电阻中的一个电阻替换为铂电阻,那么若对桥臂两个连接点通电,随着温度变化另外两个连接点必然会产生电压差,将这两点的电压差通过ADUC7060的差分ADC进行采样,并经过简单的运算,就可以将模拟电压变化转换为温度的变化。
电路原理图如下:

下面是铂电阻传感器的图片,一般会有两根引线,也有3根的,主要是为了抵消引线阻抗,3根引线比较常用。

下面给出代码,主要利用ADUC7060的ADC模块,后面还有LCD显示的代码。
/************************************************************************************************ *************************************************************************************************/ // Bit Definitions #define BIT0 0x01 #define BIT1 0x02 #define BIT2 0x04 #define BIT3 0x08 #define BIT4 0x10 #define BIT5 0x20 #define BIT6 0x40 #define BIT7 0x80 #define BIT8 0x100 #define BIT9 0x200 #define BIT10 0x400 #define BIT11 0x800 #define BIT12 0x1000 #define BIT13 0x2000 #define BIT14 0x4000 #define BIT15 0x8000 #define BIT16 0x10000 #define BIT17 0x20000 #define BIT18 0x40000 #define BIT19 0x80000 #define BIT20 0x100000 #define BIT21 0x200000 #define BIT22 0x400000 #define BIT23 0x800000 #define BIT24 0x1000000 #define BIT25 0x2000000 #define BIT26 0x4000000 #define BIT27 0x8000000 #define BIT28 0x10000000 #define BIT29 0x20000000 #define BIT30 0x40000000 #define BIT31 0x80000000 #define CR 0x0D #define G 9.8 #include#include #include #include #include //__irq __arm void IRQ_Handler(void); void display1(unsigned char row,unsigned char number,unsigned char dot); void display8(double shuju,unsigned char dot); void WRITE_DAT(unsigned char addr,unsigned char dat);/*Write display data to LCD*/ void DIS(unsigned char dat); void SETUP_LCD(void); void WRITE_COM(unsigned char com); /*Write a command to LCD*/ void delay(unsigned char x); void delay3(unsigned char x,unsigned char y,unsigned char z); /******************************************************************************* 函数名称:senddata () 函数功能:将24位AD转换结果每8位一组发出 ******************************************************************************/ void senddata(int to_send) { while(!(0x020==(COMSTA0 & 0x020))){} COMTX = 0x0A; // 输出0A while(!(0x020==(COMSTA0 & 0x020))){} COMTX = 0x0D; // 输出 0D while(!(0x020==(COMSTA0 & 0x020))){} COMTX = ((to_send >> 24) & 0xFF); //输出24~31位 while(!(0x020==(COMSTA0 & 0x020))){} COMTX = ((to_send >> 16) & 0xFF); //输出16~23位 while(!(0x020==(COMSTA0 & 0x020))){} COMTX = ((to_send >> 8) & 0xFF); //输出8~15位 while(!(0x020==(COMSTA0 & 0x020))){} COMTX = (to_send & 0xFF); //输出0~7位 } /******************************************************************************* 函数名称:delay() 函数功能:延时等待 ******************************************************************************/ void delay1 (int length) { while (length >=0) length--; } double data1,temp3; int Temp; int Temp2; int main(void) { POWKEY1 = 0x1; POWCON0 = 0x78; // Set core to max CPU speed of 10.24Mhz POWKEY2 = 0xF4; /* ADCFLT = 0x4F; //转换频率100Hz,无滤波,斩波关 ADC0CON = BIT6 + BIT7 + BIT8 + BIT10 + BIT15; // 使能ADC0,选择ADC2/ADC5单端模式,增益为1 ADCCFG = 0; ADCMDE = BIT0 + BIT7; //连续转换模式 */ /*初始化UART串口*/ GP1CON |= BIT0 + BIT4; // 硬件接口选择P1.0和P1.1 COMCON0 = BIT7; COMDIV0 = 0x21; //设置波特率为 9600bps COMDIV1 = 0x00; COMCON0 = BIT0 + BIT1 + BIT2; /*初始化ADC1*/ ADCMSKI = BIT1; // 使能ADC转换完成中断 ADCFLT = 0x7; // 1Khz 转换频率, 斩波关 ADCMDE = BIT0+BIT7; // ADC连续转换,正常模式 ADC1CON = BIT9+BIT15 ; //单极性编码输出,辅助ADC使能,ADC1 输入通道选择ADC2/ADC3 差分模式 ADCCFG = 0; IRQEN = BIT10 ; // 使能 ADC1 中断 GP2DAT = 0x03030000; // configure p2.1 ,2.0as output 1 GP0DAT = 0x10100000; GP1DAT = BIT28+BIT29+BIT30; // Configure P1.4, P1.5, P1.6 as an output delay3(25,25,25); GP1SET = BIT20+BIT21+BIT22; // _CS = 1;_WR = 1;_DAT = 1; delay3(25,25,25); SETUP_LCD(); // 初始化液晶 delay3(25,25,25); SETUP_LCD(); // 初始化液晶 while(1) { GP0DAT ^= 0x00100000; Temp=ADC0DAT; Temp2=ADC1DAT; temp3=(double)Temp2; temp3=temp3*1.2*103.89/128; data1= temp3/4096/32; //将转换结果读出 // senddata(Temp2); //将转换结果按位从串口发出 delay1(200000); //延时便于观察结果 display8(data1,3); } } // 显示1位数据 void display1(unsigned char row,unsigned char number,unsigned char dot) { switch(number) { case 0: number = 0xbe; //0 break; case 1: number = 0x06; //1 break; case 2: number = 0x7c; //2 break; case 3: number = 0x5e; //3 break; case 4: number = 0xc6; //4 break; case 5: number = 0xda; //5 break; case 6: number = 0xfa; //6 break; case 7: number = 0x0e; //7 break; case 8: number = 0xfe; //8 break; case 9: number = 0xde; //9 break; } if(dot == 1) {number = number|0x01;} WRITE_DAT(row,number); } // 显示8位数据 xxxxxxxx void display8(double shuju,unsigned char dot) { unsigned char a; unsigned char b; unsigned char c; unsigned char d; unsigned char e; unsigned char f; unsigned char g; unsigned char h; unsigned char r; unsigned long shuzi; shuzi = shuju; r = 0; switch(dot) { case 0: shuzi = shuju; a = (shuzi%100000000)/10000000; //10000000 b = (shuzi%10000000)/1000000; //1000000 c = (shuzi%1000000)/100000; //100000 d = (shuzi%100000)/10000; //10000 e = (shuzi%10000)/1000; //1000 f = (shuzi%1000)/100; //100 g = (shuzi%100)/10; //10 h = shuzi%10; //1 display1(r,a,0); r = r+2; display1(r,b,0); r = r+2; display1(r,c,0); r = r+2; display1(r,d,0); r = r+2; display1(r,e,0); r = r+2; display1(r,f,0); r = r+2; display1(r,g,0); r = r+2; display1(r,h,0); break; case 1: shuzi = shuju*10; a = (shuzi%100000000)/10000000; //10000000 b = (shuzi%10000000)/1000000; //1000000 c = (shuzi%1000000)/100000; //100000 d = (shuzi%100000)/10000; //10000 e = (shuzi%10000)/1000; //1000 f = (shuzi%1000)/100; //100 g = (shuzi%100)/10; //10 h = shuzi%10; //1 display1(r,a,0); r = r+2; display1(r,b,0); r = r+2; display1(r,c,0); r = r+2; display1(r,d,0); r = r+2; display1(r,e,0); r = r+2; display1(r,f,0); r = r+2; display1(r,g,1); r = r+2; display1(r,h,0); break; case 2: shuzi = shuju*100; a = (shuzi%100000000)/10000000; //10000000 b = (shuzi%10000000)/1000000; //1000000 c = (shuzi%1000000)/100000; //100000 d = (shuzi%100000)/10000; //10000 e = (shuzi%10000)/1000; //1000 f = (shuzi%1000)/100; //100 g = (shuzi%100)/10; //10 h = shuzi%10; //1 display1(r,a,0); r = r+2; display1(r,b,0); r = r+2; display1(r,c,0); r = r+2; display1(r,d,0); r = r+2; display1(r,e,0); r = r+2; display1(r,f,1); r = r+2; display1(r,g,0); r = r+2; display1(r,h,0); break; case 3: shuzi = shuju*1000; a = (shuzi%100000000)/10000000; //10000000 b = (shuzi%10000000)/1000000; //1000000 c = (shuzi%1000000)/100000; //100000 d = (shuzi%100000)/10000; //10000 e = (shuzi%10000)/1000; //1000 f = (shuzi%1000)/100; //100 g = (shuzi%100)/10; //10 h = shuzi%10; //1 display1(r,a,0); r = r+2; display1(r,b,0); r = r+2; display1(r,c,0); r = r+2; display1(r,d,0); r = r+2; display1(r,e,1); r = r+2; display1(r,f,0); r = r+2; display1(r,g,0); r = r+2; display1(r,h,0); break; } } // 向LCD写数据 void WRITE_DAT(unsigned char addr,unsigned char dat) /*Write display data to LCD*/ { unsigned char i,k; GP1CLR = BIT22; // _CS = 0; k=0xa0; for(i=0;i!=3;i++) /*Write CMD code:101*/ { if((k&0x80)==0) GP1CLR = BIT20;//_DAT=0; else GP1SET = BIT20; //_DAT=1; GP1CLR = BIT21; // _WR = 0; GP1SET = BIT21; // _WR = 1; k=k<<1; } k=addr<<2; for(i=0;i!=6;i++) //Write RAM address: xxA5~A0 { if((k&0x80)==0) GP1CLR = BIT20;//_DAT=0; else GP1SET = BIT20; //_DAT=1; GP1CLR = BIT21; // _WR=0; GP1SET = BIT21; // _WR=1; k=k<<1; } k=dat>>4; for(i=0;i!=4;i++) /*Write Display data :xxxxD3~D0*/ { if((k&0x01)==0) GP1CLR = BIT20;//_DAT=0; else GP1SET = BIT20; //_DAT=1; GP1CLR = BIT21; // _WR=0; GP1SET = BIT21; // _WR=1; k=k>>1; } k=dat; for(i=0;i!=4;i++) /*Write Display data :xxxxD3~D0*/ { if((k&0x01)==0) GP1CLR = BIT20;//_DAT=0; else GP1SET = BIT20; //_DAT=1; GP1CLR = BIT21; // _WR=0; GP1SET = BIT21; // _WR=1; k=k>>1; } GP1SET = BIT20+BIT21+BIT22; // _CS = 1;_WR = 1;_DAT = 1; } // 用于清除LCD void DIS(unsigned char dat) { unsigned char j; for(j=0;j!=11;j++) { WRITE_DAT(j*2,dat); } } // LCD初始化 void SETUP_LCD(void) { unsigned char i,k; GP1CLR = BIT22; // _CS = 0; k=0x80; for(i=0;i!=3;i++) //Write CMD code:100 { if((k&0x80)==0) GP1CLR = BIT20;//_DAT=0; else GP1SET = BIT20; //_DAT=1; GP1CLR = BIT21; // _WR = 0; GP1SET = BIT21; // _WR = 1; k=k<<1; } WRITE_COM(0x01); /*Enable system*/ WRITE_COM(0x18); /*0x18为CLOCK SOURCE IS 256kRC ON CHIP 0x14为外部32KHz晶振*/ WRITE_COM(0x29); /*BIAS=1/3 DUTY=1/4*/ WRITE_COM(0x03); /*Display on*/ DIS(0x00); GP1SET = BIT20+BIT21+BIT22; // _CS = 1;_WR = 1;_DAT = 1; } // 向LCD写命令子程序 void WRITE_COM(unsigned char com) /*Write a command to LCD*/ { unsigned char i,k; k=com; for(i=0;i!=9;i++) /*Write CMD */ { if((k&0x80)==0) GP1CLR = BIT20;//_DAT=0; else GP1SET = BIT20; //_DAT=1; GP1CLR = BIT21; // _WR=0; GP1SET = BIT21; // _WR=1; k=k<<1; } } // 延时 公式14+(3x+5)*(y+3)*z 最大延迟4.5658s 取值255,255,255 延迟1s 取值255,255,56 void delay3(unsigned char x,unsigned char y,unsigned char z) { unsigned char a; unsigned char b; do{ b=y; do{ a=x; do{ }while(--a); }while(--b); }while(--z); } __irq __arm void IRQ_Handler(void) { unsigned long IRQSTATUS = 0; IRQSTATUS = IRQSTA; //读出中断状态寄存器值 if ((IRQSTATUS & BIT10) == BIT10) //判断ADC1转换完成触发中断 { Temp2 = ADC0DAT; //读出主ADC转换结果 Temp= ADC1DAT; //读出辅助ADC转换结果 } }
