本帖最后由 McuPlayer 于 2012-2-26 22:36 编辑
海尔单片机采用三个普通IO模拟实现AD检测程序
声明:参考了张明峰老师在PIC一书上的例子!之后做了一些修改,并实际测试。不要喷我偶@,不管怎样吸收就好#,大家感觉可以的话,顺便帮忙顶顶海尔芯片哈~~~
前言:对于没有AD功能的海尔小芯片来说(如58L,59L等),往往也有需要实现AD检测的功能,下面利用RC充放电实现传感器未知电阻的检测,适用于量产。经测试温度精度能够做到+-1度以内。
三个普通IO模拟实现AD检测
硬件:
RX(sensor)
RF(100K欧)
Rtest(100欧)
三个io对应三个电阻,然后均连接到同一个104贴片电容上。
///////////////////////////////////////////////头文件定义io///////////////////////////////////////////////////////
#define V_Rf PA1
#define V_test PA2
#define V_Rx PA3
#define Pin_Rf PAT1
#define pin_test PAT2
#define Pin_Rx PAT3
bank1 ulong Rx_time_r;
bank1 ulong Rf_time_r;
bank1 uint Rx_r;
static uint AD_fact_r;//AD实际
static uchar AD_temperature_r;//AD温度
static uint AD_data_r;//AD数据
static uint AD_datamax_r;//AD最大值
static uint AD_datamin_r;//AD最小值
static uint accumulate_AD_r;//累加值
static uint current_AD_r;//当前值
static uint difference_AD_r;//差值
static uchar AD_counter_r;
//不同的传感器下面的表要更改的@~@
const uint temptab[]={
1576,1498,1425,1356,1290,1228,1169,1114,1062,1012,965,921,879,839,801,
765,731,698,668,638,611,584,559,535,513,491,470,449,430,412,
394,378,362,347,332,319,306,293,281,270,259,249,240,230,221,
213,204,197,189,182,175,168,162,156,150,144,139,134,128,124,
119,115,111,107,103,100,96,92,89,86,83,80,78,75,73,
70,68,66,63,61,59,57,55,54,52,50,49,47,46,44,
43,42,40,39,38,37,36,35,34,33,33,33,33,33,33,//100+5
};
////////////////////////////////////////以下为主程序AD转化功能///////////////////////////////////////
/***********************************************************************************
*函数:上电AD转化
*作用:
*说明:
***********************************************************************************/
void poweron_AD_convert(void)
{
delaynop(20);
full_charge();
Rx_discharge();
full_charge();
Rf_discharge();
full_discharge();
caculate_Rx();
AD_fact_r=Rx_r;
AD_examine();
fact_temperature_r=AD_temperature_r;
if(fact_temperature_r>99)
{
fact_temperature_r=99;
}
delaynop(20);
AD_datamax_r=0;
AD_datamin_r=0xffff;
}
/***********************************************************************************
*函数:AD转化
*作用:将AD采集的数值转化为实际温度
*说明:注意AD的采集滤波
***********************************************************************************/
void AD_convert(void)
{
if(AD_10ms_r<5)
{
return;
}
AD_10ms_r=0;
delaynop(20); //delay a little while
full_charge();
Rx_discharge();
full_charge();
Rf_discharge();
full_discharge();
caculate_Rx();
AD_data_r=Rx_r;
nop();
if(AD_data_r>=current_AD_r)
{
difference_AD_r=AD_data_r-current_AD_r;
}
else
{
difference_AD_r=current_AD_r-AD_data_r;
}
if(difference_AD_r<100)
{
if(AD_datamax_r<=AD_data_r)
{
AD_datamax_r=AD_data_r;
}
if(AD_datamin_r>=AD_data_r)
{
AD_datamin_r=AD_data_r;
}
AD_counter_r++;
accumulate_AD_r+=AD_data_r;
}
else
{
current_AD_r=AD_data_r;
accumulate_AD_r=0;
AD_counter_r=0;
AD_datamax_r=0;
AD_datamin_r=0xffff;
}
if(AD_counter_r>=18)
{
AD_counter_r=0;
accumulate_AD_r=(accumulate_AD_r-AD_datamax_r)-AD_datamin_r;
accumulate_AD_r>>=4;
AD_fact_r=accumulate_AD_r;
accumulate_AD_r=0;
AD_datamax_r=0;
AD_datamin_r=0xffff;
AD_examine();
}
}
/***********************************************************************************
*函数:AD检查
*作用:检查温度是否超温
*说明:
***********************************************************************************/
void AD_examine(void)
{
uchar T_temp;
if(malfunction_f)
{
return;
}
if((AD_fact_r>9500)||(AD_fact_r<15))
{
heating_f=0;
preservation_f=0;
malfunction_f=1;
bad_sensor_f=1;
relay=0;
return;
}
if(AD_fact_r<33)
{
AD_fact_r=33;
}
if(AD_fact_r>1576)
{
AD_fact_r=1576;
}
for(T_temp=0;T_temp<100;)
{
if(AD_fact_r<temptab[T_temp])
{
T_temp++;
}
else
{
if(AD_fact_r>temptab[T_temp])
{
if((temptab[T_temp-1]-AD_fact_r)>=(AD_fact_r-temptab[T_temp]))
{
T_temp--;
}
}
break;
}
}
AD_temperature_r=T_temp;
}
////////////////////////////////////////////以下为RC充放电子序//////////////////////////////////////////////
/****************************************************************************************
*函数: 充满电
*作用:
*说明:
****************************************************************************************/
void full_charge(void)
{
Pin_Rf=1;
Pin_Rx=1;
pin_test=0;
V_test=1;
delaynop(100);
}
/****************************************************************************************
*函数: Rx放电
*作用:
*说明:
****************************************************************************************/
void Rx_discharge(void)
{
Rx_time_r=0;
pin_test=1;
Pin_Rx=0;
V_Rx=0;
while(V_test)
{
Rx_time_r++;
}
Pin_Rx=1;
}
/****************************************************************************************
*函数: Rf放电
*作用:
*说明:
****************************************************************************************/
void Rf_discharge(void)
{
Rf_time_r=0;
pin_test=1;
Pin_Rf=0;
V_Rf=0;
while(V_test)
{
Rf_time_r++;
}
Pin_Rf=1;
}
/****************************************************************************************
*函数: 全释放电
*作用:
*说明:
****************************************************************************************/
void full_discharge(void)
{
pin_test=0;
V_test=0;
delaynop(100);
}
/****************************************************************************************
*函数: 计算电阻Rx
*作用:
*说明:Tx/Rx=Tf/Rf
****************************************************************************************/
void caculate_Rx(void)
{
Rx_r=(1000*Rx_time_r)/Rf_time_r;
}
/****************************************************************************************
*函数:
*作用:
*说明:
****************************************************************************************/ |