单片机ADC消抖处理 温度转换




前言

单片机在实际读取AD值时,读到的值是不稳定的,在不断的变化,如果不经过处理,直接使用,是很难获得其准确的值,因此我们需要对其进行消抖滤波处理。


滤波

一般来说AD值的不稳,我们可以将一段时间读取到的数值取平均值,为了防止数值突变的影响,我们可以减去最大和最小值。

我们10ms读取一次AD值,取10次AD值的平均值即可。

static u16_t s_wMaxAdVal = 0; // AD最大值
static u16_t s_wMinAdVal = 1023; // AD最小值
static u16_t s_wSumAdVal = 0; // AD和
static u16_t s_wAdFiltVal = 0; // 滤波后的值
static u8_t s_nAdCnt = 0;

void AdFilter(u16_t wAdData)
{
   
  if (wAdData > s_wMaxAdVal)
  {
   
    wMaxAdVal = wAdData;
  }
  if (wAdData < s_wMinAdVal)
  {
   
    s_wMinAdVal = wAdData;
  }
  s_nAdCnt++;
  if (s_nAdCnt <= 10)
  {
   
    s_wSumAdVal += wAdData;
  }
  else
  {
   
    s_nAdCnt = 0;
    s_wSumAdVal -=  (s_wMaxAdVal + s_wMinAdVal);
    s_wAdFiltVal = s_wSumAdVal >> 3; // 除以8
    /* 重新计算最大最小值 */
    s_wMaxAdVal = 0;
    s_wMinAdVal = 1023;
    s_wSumAdVal = 0;
  }
}

该函数中s_wAdFiltVal的值即是滤波后的AD值。


温度转换

通常我们可以使用热敏电阻来检测温度,但是热敏电阻的阻值和温度的关系一般不可以通过数学表达式来描述,而是根据热敏电阻的规格书中阻值和温度的关系表来查找。

因此我们需要在程序中编写查找与AD值对应的温度。


硬件简述

NTC硬件图
简单的分压计算,通过温度与阻值的关系表,计算出温度与AD值关系表。


下面列出一个计算好的关系表:

#define RT_NUM 160
#define MINTEMP 0
const 
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值