基于单片机内部的ADC知识系统总结

您所在的位置:网站首页 51单片机所有中断源 基于单片机内部的ADC知识系统总结

基于单片机内部的ADC知识系统总结

2023-08-09 16:44| 来源: 网络整理| 查看: 265

基于单片机内部的ADC,相关知识梳理 编写这篇文章的初衷一、什么是ADC?二、ADC的工作原理1.采集数据2.了解概念1) AD位数2) 分辨率3) INL:Interger NonLiner——积分非线性度4) DNL:Differencial NonLiner——差分非线性度5)转换速率 3.单片机内部ADC1)单片机采集信号处理数据过程2)单片机采集信号处理数据的原理3)相关寄存器的理解a.ADC_CONTR寄存器b.P1ADF寄存器c.ADC转换结果调整寄存器位ADRJd.ADC转换结果寄存器位ADC_RES、ADC_RESLe.中断允许寄存器IEf. 设置单片机P1的IO口状态 P1M0、P1M1 三、ADC的代码实现初始化ADC函数代码采集ADC函数的代码读入数据的代码 总结

编写这篇文章的初衷

当我第一次学习51单片机的AD采集时,网上找到的资源参差不齐,当然最终还是理解了工作原理,每一行代码是什么意思,但是当我过段时间想要再次梳理一遍的时候我发现我并没有过系统的整理,导致我想要再系统的学习就会略显吃力。 所以我准备以我自己的理解的尽量的让这个文章通俗易懂,无论您是第一次接触这方面的小白也好,或是这方面的技术大牛仅仅是想再回想一下AD采集里的某一个细节,都可以在这篇文章中有所收获,这也是我写这篇文章的初衷了。

一、什么是ADC?

可能在第一次学习到ADC对这方面或多或少的有些蒙,那么让我们先从字面意思来理解一下吧:ADC(Analog-to-Digital Converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。

Analog: 直接翻译过来就是模拟,也就是说是模拟信号,这里我们就要了解一个概念了什么是模拟信号?其实并不难理解,模拟信号就是将电路模拟成信号,电信号有电压、电流等因素等等;Digital:直接翻译过来就是数字的,也就是数字信号,那我们又要了解一个概念了,什么是数字信号?其实它比模拟信号还要容易理解,将电路的信号模拟成数字信号,通常情况下高电平就表示1,低电平就表示0;Converter:当我们了解了前面两个概念之后,您或许有一些似懂非懂的意思了,那么这翻译过来就是模拟信号转变成数字信号呗!没错就是这样,我们通过相应的采集装置,采集到的值为电压的大小,此时我们就需要用到我们的模数转换来将它转换成数字信号了。

让我们总结一下: 在仪器检测系统中,常常需要将检测到的连续变化的模拟量如:温度、压力、流量、速度等转换为离散的数字量,才能进行计算处理。

这些模拟量通过传感器转换为电信号后,就需要通过一定的处理变成数字量,实现模拟量到数字量转换的设备,我们通常称为ADC,也叫做A/D。

看完之后您可能会想知道这ADC它的工作原理是如何实现的,或者是我该如何快速的使用它呢?先别着急让我们继续看下去!

二、ADC的工作原理

提示:如果您仅仅是想要知道我该如何使用ADC,那么可以直接跳过这一段。 在这一段中我想把我对ADC工作原理的理解系统的展示出来,它或许会让您对ADC工作原理能有一个更清晰的认知,如果真是这样也达到了我的目的所在了。

1.采集数据

采集数据其实并不算是ADC的工作,ADC的工作是将采集到的模拟信号转换为数字信号,这我就不过多赘述了。 采集数据需要用到相应的传感器,那什么是传感器呢?

传感器就是能够检测相应的环境因素来输出相应的数据。

其实传感器有很多种,返回的有模拟量也有的返回数据量,而我们所要用到的当然就是返回模拟量的传感器啦!

传感器通过采集到的环境值来返回一个电压信号时,这时候就需要我们ADC来将返回过来的电压信号转变为我们可以运算的数据了。

2.了解概念

这段内容是为下面的数据转换做个基础 下面来说一个例子:

一个温度传感器在0℃的时候所对应产生2.5V的电压,那么单片机是无法直接知道此时的电压是2.5v的,单片机本身只能知道电平是高还是低。因此这个2.5V的电压就需要经过ADC转换为数字量,如果是用8位分辨率的ADC、参考电压为5V,那么转换结果就是127,也就是0x7F,这样的话,单片机就可以判断这个温度是否过高或者过低,就能进行运算和控制了。

1) AD位数

表明这个该AD采集共有2n个刻度,也就是说如果一个8位的AD,它最终输出的数值是在0~255之间的值。

2) 分辨率

分辨率是AD采集数据输出数值的单位,例如5.1V的参考电压,系统采用8位的AD,那么分辨率就是:5.1/255 = 0.02V。

3) INL:Interger NonLiner——积分非线性度

它表示了ADC器件在所有的数值上对应的模拟值,和真实值之间误差最大的那一点的误差值。单位:LSB 比如:1LSB,测得数字值是100,对应电压是2v,实际电压可能是1.98V~2.02V。

4) DNL:Differencial NonLiner——差分非线性度

它表示了ADC相邻两刻度之间最大的差异,比如DNL= 2LSB,测量A点电压度数是100,那么代表了2V,B点电压是200,代表4V,表面看他们相差4-2=2V,实际相差大概是1.96V~2.04V。

5)转换速率

是指完成一次从模拟转换到数字的所需要的时间的倒数。也就是一秒内可以转换多少次。

积分型的AD的转换时间是毫秒级,属于低速的AD转换。逐次比较型AD是微秒级的AD转换,属于中速的AD转换。并行/串行的AD可达到纳秒级,属于高速AD。 3.单片机内部ADC

因为本人平常用的都是STC12C5A60S2的单片机,那么这里就拿该单片机举例

下面是STC12C5A60AD/S2系列单片机的A/D转换介绍

STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1 口(P1.7~P1.0),有8路10 位高速A/D转换器,速度可达到250KHz(25万次/秒)。8路电压输入型A/D,可做滁度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型I/0口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的口可继续作为I/0口使用。

1)单片机采集信号处理数据过程

下图是单片机将模拟信号转换成数字信号 单片机将模拟信号转换成数字信号

2)单片机采集信号处理数据的原理

下图是单片机ADC的原理 单片机采集信号处理数据的原理

3)相关寄存器的理解

下面是在单片机中所用到的寄存器,了解了ADC相关的寄存器能够极大的帮助我们学会如何使用单片机的ADC。

a.ADC_CONTR寄存器

在单片机采集信号处理数据的原理的图中我们已经看见了ADC_CONTR这个寄存器的结构了,下面就让我们看看它到底是什么意思! ADC_CONTR寄存器各引脚的标志

ADC_POWER: 是单片机开启ADC 电源控制位;0:关闭ADC 电源;1:打开A/D转换器电源 建议进入空闲模式和掉电模式前,将ADC电源关闭,可降低功耗。启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。 SPEED1,SPEED0: 用来控制单片机ADC的转换速度 SPEED1SPEED0ADC时钟周期0090011801036011540 ADC_FLAG:

转换标志位:每次当AD转换结束完成后,这个位就会自动置"1",需要手动将这一位重新置"0"。

ADC_START:

转换启动位:每当手动将其置"1"后,AD转换开始,当AD转换结束后这个位就会自动置"0"。

CHS2/CHS1/CHS0: 用来表示采集端口选择 CHS2CHS1CHS0ADC输入通道000ADC0(P1^0)001ADC1(P1^1)010ADC2(P1^2)011ADC3(P1^3)100ADC4(P1^4)101ADC5(P1^5)110ADC6(P1^6)111ADC7(P1^7) b.P1ADF寄存器

P1ADF寄存器:就是专门的选择ADC转换的引脚 注:ADC_CONTR的后三位(CSH0、CSH1、CSH2)也是选择AD转换引脚的,所以在配置的时候这两个寄存器得相互对应起来才行 P1ADF寄存器 比如我想让P1^7口作为ADC口,那么让P1ADF中的P1^7置为1,其他位置为0即可。

例:假如我想配置P17为AD输入,那就让ADC_CONTR = 7就行了 因为十进制的7正好对应二进制的0111; 而P1ADF寄存器就简单的用P1ADF = (0x01 //ADC_POWER:为宏定义(#define ADC_POWEER 0x80)及 1000 0000 //ADC_SPEEDLL:为宏定义(#define ADC_SPEEDLL 0X00)用来控制单片机ADC的转换速度 //ch:为输入的形参,表示进行P1中哪一个端口的ADC 范围在(0~2【与初始化几个端口有关】) //ADC_START:为宏定义(#defien ADC_START 0X08)转换启动位: // 每当手动将其置"1"后,AD转换开始,当AD转换结束后这个位就会自动置"0"。 ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//开启ADC,采集P1^ch引脚的值 _nop_(); _nop_(); _nop_(); _nop_(); //给予四个时钟周期的延迟 //ADC_FLAG:为宏定义(#define ADC_FLAG 0X10) while (!(ADC_CONTR & ADC_FLAG)); //检测是否ADC完成 ADC_CONTR &= ~ADC_FLAG; //转换标志位:手动将其置0 //ADC_RES为ADC转换结果寄存器,存储转换后的结果 return ADC_RES; //将转换后的结果输出 } 读入数据的代码

代码如下:

#include void main(){ char ad_Data0,ad_Data1,ad_Data2; EA = 0;// 关闭总中断 Init_ADC();//ADC初始化 EA = 1;//开启总中断 while(1){ ad0 = GetADCResult(0);//采集P1^0的AD值 ad1 = GetADCResult(1);//采集P1^1的AD值 ad2 = GetADCResult(2);//采集P1^2的AD值 Delay(100);//延时缓冲 } } 总结

本文章对单片机内部ADC使用的知识进行了相应的梳理,如果有任何疑问的地方欢迎在文章下面留言,我都会一一回复的,希望本篇文章能有或多或少的帮助到您~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3