基于AD7705的PT100测温电路调试

admin 2025-05-05 131人围观 ,发现20个评论

1、我采用的是恒流源电路进行试验,恒定电流1ma,不能太大,否则PT100自己本身会发热影响测量效果,恒流源电路现在Multisim上面进行仿真,仿真通过之后焊接电路板进行测试;测试我采用的办法是加热或冰冻PT100,让它的电阻进行变化,然后再测量三极管下面的那个电流采样电阻两端的电压,只要这两端的电压恒定不变,并且符合预期,那么恒流源就OK;PT100接在下图中R6的位置上,0-200Ω之间变化,仿真都能通过。

在Multisim上面进行仿真通过

2、电压基准我一开始用的是TL431搭的电路,测试了一下感觉有点漂,然后上淘宝上买了一个AD584回来,试了一下,也就那样,将就着用吧,反正做着玩的。做出来的实物如下图所示:

AD7705在面包板上

3、AD584用的12V电源供电,短接1-3脚,输出2.5V电压;2.5V的电压同时给AD7705和恒流源运放供电。

4、主程序代码如下,参考了AD官网上源码和博客上另外一个哥们的代码;单片机用的是STM32,72M主频。

intmain(void)

{

SystemInit();

SYSTICK_Init();

GPIO_Config();

TIM2_Config();

Init_AD7705(1);

while(1)

{

if(Time24000)

{

Time2=0;

temp_adc=0;

//for(i=0;i5;i++)

//{

//temp_adc=(temp_adc+Get_Adc(0));

//delay_us(1);

temp_adc=GetData7705_CH1();

//}

//temp_adc=temp_adc/5;

dis_data_mem[0]=temp_adc%10;

dis_data_mem[1]=(temp_adc/10)%10;

dis_data_mem[2]=(temp_adc/100)%10;

dis_data_mem[3]=(temp_adc/1000)%10;

}

if(Time2_SMG_CNT5)

{

Time2_SMG_CNT=0;

SMG_Turn++;

if(SMG_Turn3)SMG_Turn=0;

switch(SMG_Turn)

{

case0:

H1_0;

H2_0;

H3_0;

H4_0;

sbyte(dis_data_mem[0]);

H1_1;

H2_0;

H3_0;

H4_0;

break;

case1:

H1_0;

H2_0;

H3_0;

H4_0;

sbyte(dis_data_mem[1]);

H1_0;

H2_1;

H3_0;

H4_0;

break;

case2:

H1_0;

H2_0;

H3_0;

H4_0;

sbyte(dis_data_mem[2]);

H1_0;

H2_0;

H3_1;

H4_0;

break;

case3:

H1_0;

H2_0;

H3_0;

H4_0;

sbyte(dis_data_mem[3]);

H1_0;

H2_0;

H3_0;

H4_1;

break;

}

}

}

}

/****************************************************//*

74LS164sonebytedata

*//****************************************************/

voidsbyte(unsignedcharbyte)

{

u8num,d,bit;

num=smg_table[byte];

for(d=0;d8;d++)

{

HC164_CLK_0;

delay_us(10);

bit=(num0x80);

if(bit)

{

HC164_DATA_1;

}

else

{

HC164_DATA_0;

}

delay_us(10);

HC164_CLK_1;

num=(num1);

}

}

5、AD7705的设置代码如下:

voidwritetoreg(unsignedcharbyteword)//ThesubroutinewritebytewordtothecorrespondingregistersofAD7709

{

unsignedchartemp;

inti;

//CS=0;

temp=0x80;

for(i=0;i8;i++)

{

if((tempbyteword)==0)

DIN_0;

elseDIN_1;

SCLK_0;

SCLK_1;

temp=temp1;

}

//CS=1;

}

voidAD7705_WriteByte(unsignedcharDst_Addr)

{

delay_us(20);

writetoreg(Dst_Addr);

delay_us(100);

}

voidInit_AD7705(u8chnanel)

{

u8i;

for(i=0;i150;i++)

{

AD7705_WriteByte(0xff);//chixuDINgaodianpinxiecaozuo,huifuAD7705jiekou

}

delay_ms(1);

switch(chnanel)

{

case1:

AD7705_WriteByte(0x20);/*peizhiclockregister*/

AD7705_WriteByte(0x00);/*2.4576MHz(CLKDIV=0)??4.9152MHz(CLKDIV=1),CLK??“0”?*/

AD7705_WriteByte(0x10);/*selectconfigregisterchnanel1*/

AD7705_WriteByte(0x60);//shuangjixing,16beizengyi,wuhuanchong,lvboqigongzuo,zijiaozhun

break;

case2:

AD7705_WriteByte(0x21);

AD7705_WriteByte(0x0f);

AD7705_WriteByte(0x11);

AD7705_WriteByte(0x4c);//

break;

default:

break;

}

}

u16GetData7705_CH1(void)

{

u8j=0;

u16temp1=0;

Init_AD7705(1);

delay_ms(1);

AD7705_WriteByte(0x38);//SelectCH1DATARegester

while(DRDY){}

for(j=0;j16;j++)

{SCLK_0;

SCLK_1;

if(DOUT==0)

temp1=temp11;

else

{temp1=temp11;

temp1=temp1+0x01;}

}

returntemp1;

}

/*?AD7705????????channel*/

u16GetData7705_CH2(void)

{

u16temp2=0;

u16DataL=0;

u16DataH=0;

Init_AD7705(2);//?????2

delay_ms(1);

AD7705_WriteByte(0x38);//??CH2??????

while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4==1));//??????AdDrdy=0

//CS_ADC_LOW();//????

delay_us(20);

//DataH=SPIx_ReadWriteByte(0xff);

//DataL=SPIx_ReadWriteByte(0xff);

delay_us(100);

//CS_ADC_HIGH();//????

DataH=DataH8;

temp2=DataH|DataL;

returntemp2;

}

以上程序,调试可用。

猜你喜欢
    不容错过