查看: 1959|回复: 3

[其他] 每天解决一个问题24:AD采集一段代码分析

[复制链接]

该用户从未签到

33

主题

292

帖子

0

高级会员

Rank: 4

积分
600
最后登录
2016-4-19
发表于 2015-9-26 22:19:48 | 显示全部楼层 |阅读模式
地址:https://www.eefocus.com/luo_xinli/blog/14-08/305172_d5794.html

     昨天见到一位朋友的AD采集代码,这段代码在他们公司产品中已经使用的。当然是正确的。我们来分析一下他的实现方法。

  • 选择采集端口,采集端口电压,保存在 temp_l 、 Min_Value、  Max_Value中
  • 采集端口电压7次,每次采集的值与   Min_Value、  Max_Value比较。如果小于 Min_Value将其值赋给 Min_Value,如果大于 Max_Value将其值赋给 Max_Value。并且将其值累加到numtemp 值中。
  • numtemp 减去 Min_Value、 Max_Value,结果除于5.该结果就是本次采集的电压值。

      这段代码的中心目的就是,采集7个值,去掉最大和最小的值,然后求平均值即可。过程很简单,流程图就不给出了。代码如下:

/********************************************************
函数名: read_ad_inputs
功能  : 采集电压  充电或者是电池的电压
参数  : 无
返回值: 无
**********************************************************/
UINT read_ad_inputs(BYTE PORT)
{
       char i = 0;
        unsigned long numtemp = 0;                                                 
        UINT Max_Value = 0;
        UINT Min_Value = 0;
        UINT temp = 0,ams = 0,temp_l = 0;
        init_adc();                                                   //重新初始化AD

        switch(PORT)
        {
//                case Charge_ADV:                                        //采集充电电压
//                                        AMX0P  = 0x0D;                          //正输入极为P25
//                break;
                case BATT_ADV:                                                //电池电压
                                        AMX0P  = 0x0E;                        //P26为AD正输入端
                break;
                case TEMPE:
                                        REF0CN |= 0x04;                    //内部温度传感器工作
                                        AMX0P   = 0x1E;                           //正输入端选择内部温度传感器

                default:
                break;
        }

        Delay_ms(2);                                                 //等待稳定
        AD0INT  = 0;                              //清除转换完成标志
    AD0BUSY = 1;                             //initiate conversion
        while (AD0INT == 0);                     //等待转换完成
          temp = ADC0H;                                                 //高字节
       ams  = ADC0L;                                                 //低字节
        temp   = temp<<8;
        temp_l = temp+ams;

        Min_Value = temp_l;                                   //取一次参考值
        Max_Value = temp_l;

        for(i = 0; i < 7; i++)
        {       
                AD0INT  = 0;                    //清除转换完成标志
            AD0BUSY = 1;                    //initiate conversion
                while (AD0INT == 0);            //等待转换完成
       
                  temp= ADC0H;                                         //高字节
            ams = ADC0L;                                         //低字节
                temp   = temp<<8;
                temp_l = temp+ams;
                                       
                if(temp_l >= Max_Value)                        //取最大值
                {
                        Max_Value = temp_l;                       
                }
                if(temp_l <= Min_Value)                        //取最小值
                {
                        Min_Value = temp_l;
                }                                                                //累加
                numtemp += temp_l;       
        }
        numtemp -= Max_Value;                                //减去最大和最小两个值
        numtemp -= Min_Value;

        if(numtemp > 0xFFFF)                                //超出为错误,否则求平均数并返回值
        {
                temp_l = 0xFF;
        }
        else
        {
                temp_l = numtemp/5;
        }               
        return temp_l;
}

我知道答案 目前已有3人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-26 23:01:10 | 显示全部楼层
    谢谢分享
    freescaleic.org.png
    回复

    使用道具 举报

    该用户从未签到

    33

    主题

    292

    帖子

    0

    高级会员

    Rank: 4

    积分
    600
    最后登录
    2016-4-19
     楼主| 发表于 2015-9-27 16:12:36 | 显示全部楼层

    又在刷金币
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-7-6 18:29
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    0

    主题

    212

    帖子

    0

    高级会员

    Rank: 4

    积分
    901
    最后登录
    2025-4-17
    发表于 2017-1-31 21:44:47 | 显示全部楼层

    谢谢楼主分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 08:03 , Processed in 0.094628 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表