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;
}
以上程序,调试可用。