打印
[国产单片机]

海尔单片机采用三个普通IO模拟实现AD检测程序

[复制链接]
5926|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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;
}
/****************************************************************************************
*函数:
*作用:
*说明:
****************************************************************************************/

相关帖子

沙发
zd420325| | 2012-2-27 12:49 | 只看该作者
楼主说一下设计思路啊,总比空写些代码要好,没几个人会认真看完代码的.虽然我也是用海尔MCU的,虽然我知道应用笔记上面有关于一个IO口模拟AD,但是你的思路是什么呢?

使用特权

评论回复
板凳
l4157| | 2012-2-27 21:51 | 只看该作者
兄弟,我也想在一个项目上用海尔有单片机,请问芯片EMC性能如何?C编译器好不好用呀?谢谢!

使用特权

评论回复
地板
l4157| | 2012-3-2 11:50 | 只看该作者
谢谢,打算用海尔做一个项目试试

使用特权

评论回复
5
int3| | 2012-3-3 09:26 | 只看该作者
需要工具和样品找我

使用特权

评论回复
6
Ryanhsiung| | 2012-3-5 15:59 | 只看该作者

海尔还是挺用心的,上次到书点看到的书~!我们应该支持一下国产单片机。

但是我觉得海尔应该免费送一些开发工具!!

使用特权

评论回复
7
Ryanhsiung| | 2012-3-5 16:06 | 只看该作者
楼主说一下设计思路啊,总比空写些代码要好,没几个人会认真看完代码的.虽然我也是用海尔MCU的,虽然我知道应用笔记上面有关于一个IO口模拟AD,但是你的思路是什么呢? ...
zd420325 发表于 2012-2-27 12:49

刚百度了一下,本质就是对电容进行充电,然后检测充电时间!
   一个IO口进行充电。
   一个接要测的电阻。
   一个接精密电阻。(这个电阻用于于被测电阻比对)

使用特权

评论回复
8
壹佰| | 2012-3-5 16:24 | 只看该作者
顶,原来海尔也有单片机

使用特权

评论回复
9
xiqi022220| | 2012-3-9 16:05 | 只看该作者
7# Ryanhsiung 是啊,这本书是海尔原厂出的,上次我们去培训的时候,还每人给我们发了一本呢

使用特权

评论回复
10
l4157| | 2012-3-12 13:59 | 只看该作者
6# int3
原以为RF3148支持HAIER,然后发现是假支持,呵呵,你有没有什么烧写器支持HR7P171?

使用特权

评论回复
11
110xia| | 2012-3-12 23:19 | 只看该作者
又一个PIC的善哉

使用特权

评论回复
12
zd420325| | 2012-3-31 14:19 | 只看该作者
这哥们儿貌似我见过,那天我也拿了一本.不过大多是抄datasheet的.没多大价值.看datasheet就行了. 11# xiqi022220

使用特权

评论回复
13
beanandpeach| | 2012-12-7 13:07 | 只看该作者
正好,我也在做这个,谢谢啦

使用特权

评论回复
14
readdai| | 2012-12-10 14:28 | 只看该作者
我去,在带AD模块的MCU如此便宜的今天还要用这种方式做AD检测?  ……悲

使用特权

评论回复
15
McuPlayer| | 2012-12-10 16:30 | 只看该作者
IO充放电的精度可以做到高于MCU内置的ADC

原因在于积分型的ADC的优势是精度,缺点是速度慢。
MCU内置的ADC多数是ASR的,也就是通常所说逐次逼近型的,速度远高于积分型的,分辨率12个bit算是比较高的了,精度再打点折扣。

使用特权

评论回复
16
沉默爱电子| | 2012-12-10 16:49 | 只看该作者
海尔的单片机

使用特权

评论回复
17
晓风凌殇| | 2016-2-18 11:22 | 只看该作者
学习了谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

0

粉丝