一、绪论
最近研究怎么实现一个高度稳定的热源,家里没有PT1000,也没有高精度的AD,只有PT100和陈年的几个单片机,怎么办?方法总比困难多,经过搜罗,终于找到AD神器一片,STC12C5A60S2,可以同时实现8路10位AD,这么好的资源怎能放弃?好,开工。
二、电路设计
工欲善其事,必先利其器。先找原理图吧,经过搜罗和评估,认为这张图可信度高一些,看了下,两级运放放大,刨去固有的电压降低0.7+0.7=1.4,用5V的电源,至少可以将模拟电压信号固定在0.5~3.5伏,如果把惠斯通电桥调零到20-50度,1024的分辨率,精度理论可以在0.03,算了吧,能到0.1稳定下来就不错了。。。TL431产生稳定的电桥电源2.5v。
三、KEIL5 使用C51开发
打开KEIL5,才发现KEIL5默认没有KEIL C51支持,懒得下载和安装KEIL4,就下载了个c51v959.exe,安装完了,在使用STC-ISP安装STC单片机的支持就可以了。如图。
完了后记得破解才能用。
四、ADC采集与显示
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
BYTE ch = 0;
BYTE result =0;
WORD wresult =0;
BYTE num[]={'0','1','2','3','4','5','6','7','8','9'};
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
void InitADC()
{
P1ASF = 0xff;
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2);
}
WORD GetADCResult(BYTE ch)
{
WORD result = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= ~ADC_FLAG;
ADC_RESL &=0x03;
result=ADC_RES*4+ADC_RESL;
return result;
}
void main(void)
{
P1M0 = 0x00;
P1M1 = 0x00;
Uart_Init();
InitADC();
Y_LAMP=1;
G_LAMP=1;
R_LAMP=1;
SendString("start service...\r\n");
while (1)
{
wresult = GetADCResult(0);
SendString("value=");
SendData(num[wresult/1000]);
SendData(num[wresult%1000/100]);
SendData(num[wresult%100/10]);
SendData(num[wresult%10]);
SendString("\r\n");
delaytime(20000);
}
}
五、效果展示
上面的数据没有处理,大家可以看到,从常温368-484是我用手攥了下PT100产生的。其实利用这种滑窗调节法,可以大大提高指定温度范围的精度。
更新:如果想做精度较高的低温窄带标准温度源的话,可以参考一下车载小型冰箱,拆开看看就可以了,呵呵,昨天偶把李宁送的车载冰箱拆开看了看,TEC模块,还有驱动,都有的,再加上一层保温,就可以解决了,这种半导体温度源,就是稳定下来稍微慢了点。