yanniwang

利用ADuC7060与铂电阻电桥实现测温功能

0
阅读(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转换结果
    }

}