历史上的今天
返回首页

历史上的今天

今天是:2024年10月05日(星期六)

正在发生

2018年10月05日 | 单片机AD转换汇总

2018-10-05 来源:eefocus

目录

一、电流检测AD采样值处理的高效方法

二、AD转换N次采样去最大最小求平均算法


 --------------------------------------------------

一、电流检测AD采样值处理的高效方法

在电机控制软件的编写过程中,经常要处理由AD采样回来的电流值。由于电流有正有负,电流传感器输出地电压也是以0为中点,而一般AD的输入只能为正电压,所以电流传感器出来的电压量需要通过加减运算电路加上一个偏移值再送入AD,以保证进入AD的值恒为正。

这里AD以TI的2812的片内AD为例,其输入范围是0~3V,电流传感器以LEM的LA25NP为例,量程25A,通常采用的电路是将LEM传感器的输出经过一个100欧的电阻接到地,获得一个以0为中点的电压信号,然后在送入比例运算电路,在比例运算电路的另一个输入端加入1.5V的偏移量,这样在满量程范围内使输入AD的电压信号始终保持在0~3V之内。电流为0的时候送入AD的电压是1.5V

在程序中进行电流运算时,一般要把AD采样结果取回来,然后再减去1.5V的偏移值,这样的到一个有符号数,然后再进行运算。

今天在阅读TI提供的电机驱动库代码时,发现里边使用了一种高效的处理方法,代码很简单,是这样的:

DatQ15 = AdcRegs.ADCRESULT0^0x8000;

2812的AD是12位的,AD采样结果存储在高12位。因此当AD满量程时,ADCRESULT0中的值是0xfff0。

这段代码仅仅通过一个按位异或运算就将AD的值减去了1.5V的偏移,并变成了有符号数。

至于具体为什么,举例说明,当电压为3V时,采样值是0xfff0,异或运算后高位的1变成了0,其余位不变,其结果是7ff0,如果将最高位看做符号位,那么有效位是11位。


 --------------------------------------------------

二、AD转换N次采样去最大最小求平均算法

  1. #include "STC15.H"

  2. #include "delay.h"

  3. #include "STCAD.H"

  4. #include "IO.C"

    void AD_Init()             //AD初始化
    {
        P1M1=0xF0;             //设置相应的I/O口为高阻     P1.4-P1.5-P1.6-P1.7
        P1M0=0x00;
        ADC_RES=0;             //
        ADC_RESL=0;             //ADC转换结果寄存器清0
        P1ASF=0xF0;             //设置相应的I/O口为ADC模拟通道       P1.4-P1.5-P1.6-P1.7
        ADC_CONTR |= ADC_POWER;        //打开AD转换电源
        ADC_CONTR |= ADC_SPEEDH;    //设置AD转换速度
        delay(1);
    }

    uint ADC_result(uchar x)          //AD转换结果
    {
        uint result;
        ADC_CONTR &= 0xF8;             //清通道
        ADC_CONTR |= x;                 //切换通道,x为通道,如x=5,就是P1.5
        delay_us(30);                 //切换通道延时
        ADC_CONTR |= ADC_START;         //开启AD转换
        delay_us(4);                      //
        while(!(ADC_CONTR & ADC_FLAG));       //等待AD转换结束
        ADC_CONTR &= ~ADC_FLAG;               //清除AD转换结束标志位
        result = ADC_RES << 2;                       //ADC高8位结果左移2位
        result = result | ADC_RESL;               //合成10位转换结果
        return result;                       //返回转换结果
    }

    uint U(uchar x)                                   //测量电压40次去除最大最小求平均
    {
        uint U[40],min,max,S;
        uchar i;

        for(i=0;i<40;i++)
        {
            U[i]=ADC_result(x);                         //获取x通道ADC结果
        }

        for(i=1,min=U[0];i<=39;i++)
        {
            if(U[i]
        }

        for(i=1,max=U[0];i<=39;i++)
        {
            if(U[i]>max)  max=U[i];
        }                                        //求最大值

        for(i=0,S=0;i<=39;i++)  S+=U[i];
        S=S-min-max;
        S /= 38    ;                                 //减去最大最小求平均
        return S;                                 //返回计算结果
    }

 --------------------------------------------------



推荐阅读

史海拾趣

DEWALT公司的发展小趣事

DEWALT公司始终将技术创新作为企业发展的核心动力。在创始人雷蒙得伟的领导下,公司不断投入研发,推出了一系列具有创新性的电动工具产品。这些产品不仅具有高效、耐用的特点,还满足了不同用户的需求。通过不断的技术创新和产品拓展,DEWALT公司逐渐在电动工具行业中占据了重要地位。

东晨(DC)公司的发展小趣事

东晨(DC)公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和引进工作。公司建立了完善的培训体系,为员工提供全面的职业发展和技能培训。同时,公司还积极引进优秀人才,通过股权激励等措施留住人才。这些措施为公司的持续发展提供了有力的人才保障。

BOPLA公司的发展小趣事

BOPLA公司成立于XXXX年,初期主要致力于电子开关、熔断器等基础电子元件的研发与生产。创始人凭借对电子行业的深厚理解和敏锐的市场洞察力,带领公司逐步在竞争激烈的市场中站稳脚跟。通过不断的技术创新和品质提升,BOPLA的产品逐渐获得了客户的认可,为公司后续的发展奠定了坚实的基础。

D3 Semiconductor公司的发展小趣事

D3 Semiconductor自创立之初,就致力于半导体技术的研发与创新。公司凭借其独特的超结金属氧化物半导体场效应晶体管(MOSFET)技术,在功率电子市场上迅速崭露头角。这项技术在硬开关应用中展现出了同类最佳性能,为通讯、企业计算、不间断电源(UPS)和太阳能等领域提供了高效可靠的解决方案。D3 Semiconductor的这一技术突破不仅赢得了市场的认可,也为公司后续的发展奠定了坚实的基础。

C&K Switches公司的发展小趣事

C&K Switches公司一直致力于技术创新和研发。它不断投入资金和资源,研发出了一系列具有高性能和可靠性的开关产品。这些产品不仅提高了设备的运行效率和稳定性,还降低了故障率和维修成本。同时,C&K还积极与合作伙伴和客户进行技术交流和合作,共同推动电子行业的发展。这种技术突破和创新精神使得C&K在激烈的市场竞争中保持领先地位。

Globaltech Semiconductor Co Ltd公司的发展小趣事

为了保持技术领先地位,Globaltech持续加大研发投入,建立了先进的研发中心和测试实验室。公司不断引进国内外顶尖的研发人才,并与多所知名高校和研究机构建立产学研合作关系。这些努力使得Globaltech在电源管理IC领域取得了多项技术突破,并成功拓展了产品线,涵盖了ESD保护器件、MOSFET等多个领域。这些新产品不仅丰富了公司的产品线,也为客户提供了更加全面的解决方案。

问答坊 | AI 解惑

倾情奉献:MSP430汇编指令集(中文),详解带实例!

倾情奉献:MSP430汇编指令集(中文),详解带实例!…

查看全部问答>

关于ExpandEnvironmentStrings的问题

请问给为在WinCE下面可以 用ExpandEnvironmentStrings吗? 如果不可以怎么解决? 谢谢了!…

查看全部问答>

我用API写了一个从一台数字天平串口中读取数据的函数,为一串16进制数组,请问如何转换为天平的读数?

我读取的数据和用“串口调试助手”读取的数据一样,为下列一串16进制字符: 00 00 80 00 80 00 80 F8 78 3C 0F 80 78 3C 0F 00 80 00 80 00 80 F8 78 3C F0 00 80 00 80 78 00 80 78 00 80 80 F8 80 F8 F8 80 80 78 C0 F8 F8 80 00 80 00 80 F8 80 ...…

查看全部问答>

数据段从FLASH往SDRAM里拷贝

44binit.s 中的 数据段从FLASH往SDRAM里拷贝的 那段 我怎么也没懂    我对那段程序的分析结果是这样的: 如果代码段和数据段的存放空间是连在一起的 ,那么要做的工作只是把ZI段清0.否则, 把 夹在 代码段和数据段之间的 那部分代码 往 ...…

查看全部问答>

介绍一个单片教程给大家,写的很不错的哦。

本教程适合广大单片机爱好者,高校在校大学生。也适合硬件设计工程师对单片机的学习, 了解.我也是从网上下载的,看完了,和大家分享一下…

查看全部问答>

Wince的具体移植和使用过程

不知道这个版块有没有高手,可以讲一下关于Wince的使用,以便帮助初学者了解Wince。从而带动这个版块的活跃程度…

查看全部问答>

近期程序.STM32+SIM300.短信远程控制

很菜的程序.可是还是调了好几天..需要做远程控制的童鞋拿去吧~最近在看GPRS通信.奈何我没有外网IP....打算休息几天.过阵子再看.PS埋怨句.边准备考研.边学STM32.还要对付一周20来节的课.真的挺累的 …

查看全部问答>

cpld与fpga的一点疑问

小弟新手,再看cpld和fpga的区别的时候看到这个: ⑦在编程方式上,CPLD主要是基于E2PROM或FLASH存储器编程,编程次数可达1万次,优点是系统断电时编程信息也不丢失。CPLD又可分为在编 程器上编程和在系统编程两类。FPGA大部分是基于SRAM编程,编 ...…

查看全部问答>