一、AD转换器的分类

直接A/D转换器
  • 并行比较型

    优点:转换速度快,内含寄存器,无需附加采样-保持电路。
    缺点:需要很多电压比较器和触发器,高分辨率较难制造。

  • 反馈比较型

    分为计数型和逐次比较型,计数型又称为双积分型。
    其中,计数型且转换速度不高,转换时间长,但价格便宜;逐次比较型使用对分搜索法,因此转换速度要比计数型快很多。(ADC0804和XPT2046都属于逐次比较型)

间接A/D转换器
  • V-T(电压-时间)
  • V-F(电压-频率)

二、A/D转换器主要参数指标

1.分辨率

分辨率为A/D转换器对输入信号的分辨能力,其计算公式如下,其中n为A/D转换器的位数:
分辨率=12n分辨率=\frac{1}{2^{n}}分辨率=2n1​
当A/D转换器支持输入负电压时,第一位代表正负,则分辨率的计算公式为:
分辨率=12n−1分辨率=\frac{1}{2^{n-1}}分辨率=2n−11​
可以求得模拟电压的最小值如下, 满刻度为输入的模拟电压最大值:
变化最小值=满刻度×分辨率变化最小值=满刻度\times 分辨率变化最小值=满刻度×分辨率

2.转换误差

转换误差表示A/D转换器实际输出的数字量与理论输出量的区别。分为量化误差、偏移误差和满刻度误差。其中偏移误差和满刻度误差合称为非线性误差。

3.转换精度

转换精度为实际模拟量输入与理论模拟输入之差的最大值。对于A/D转换器而言,可以在每个阶梯的水平中点进行测量,它包括了所有误差。

4.转换时间

即完成一次A/D转换所需要的时间(包括稳定时间)。而转换时间的倒数为转换速率,即每秒转换的次数。

三、ADC0804

概况

ADC0804是逐次比较型A/D转换器,共有20个引脚,分辨率为8位,输入电压范围为0-5V,模数转换时间大约100us。价格便宜,应用广泛。

1.引脚详情

引脚 名称 解释
1 CS‾\overline{CS}CS 片选信号输入端,当输入低电平,表明A/D被选中
2 RD‾\overline{RD}RD 读信号输入端,低电平输出端有效
3 WR‾\overline{WR}WR 写信号输入端,低电平启用A/D转换
4 CLK 时钟信号输入端
5 INTR‾\overline{INTR}INTR A/D转换结束信号,低电平表示转换完成
6-7 VIN(+),VIN(-) 两模拟信号输入端,可接收单极性,双极性和差模输入信号
8 AGND 模拟信号地
9 VREF/2 参考电平输入端,决定量化单位
10 DGND 数字信号地
11-18 DB7-DB0 具有三态特性的数字信号输出口
19 CLKR 内部时钟发生器外接电阻端
20 VCC(VREF) 芯片输入电源,为5V
2.时序图
  • 启动时序图
  • 读取时序图
3.例程:电位器A/D转换
#include<reg52.h>
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;sbit dula = P2^6;     //U1锁存端
sbit wela = P2^7;      //U2锁存端
sbit adwr = P3^6;      //A/D的WR端口
sbit adrd = P3^7;      //A/D的RD端口u8 code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
u8 bai,shi,ge;              //用于显示AD转换后的值void AD_Init();                //A/D初始化函数
void AD_read();             //A/D读取函数
void delay(u16);            //延时函数
void display(u8,u8,u8);     //数码管显示函数void main()
{AD_Init();while(1){    AD_read();}
}void AD_Init()             //A/D初始化函数
{wela=1;P0=0x7f;              //置CS片选为0,启动ADC0804wela=0;
}void AD_read()             //A/D读取函数
{u8 i,adval;         //循环变量i,读取变量advaladwr=1;                   //WR口先为高电平_nop_();              //_nop_函数位于intrins.h头文件中,作用是延时一个机器周期的时间adwr=0;                  //延时一段时间后,WR口置低_nop_();              //又延时一段时间后adwr=1;                  //WR口拉高 ADC0804被启动//由于连续读取数据,因此CS片选不必要反复操作//由于INTR由硬件控制,因此也不需要操作for(i=10;i>0;i--)     //TX-1C实验板AID工作频率较低,所以启动转换要多留点时间用来转换display(bai,shi,ge);//把显示部分放这里的原因也是为了延长转换时间P1=0xff;             //读取P1口之前先给其写全1adrd=1;                 //先使RD拉高_nop_();                //延时一段时间adrd=0;                    //RD拉低_nop_();              //再延时一段时间adval=P1;             //AD数据读取赋给P1口adrd=1;                   //马上把RD拉高bai=adval/100;            //分出百,十和个位shi=adval% 100/10;ge=adval% 10;
}   void delay(u16 ms)                  //延时函数
{u16 i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);
}void display(u8 bai,u8 shi,u8 ge)  //数码管显示函数
{/*百位*/dula=1;P0=table[bai];dula=0;P0=0xff;wela=1;P0=0x7e;wela=0;delay(5);/*十位*/dula=1;P0=table[shi];dula=0;P0=0xff;wela=1;P0=0x7d;wela=0;delay(5);/*个位*/dula=1;P0=table[ge]; dula=0;P0=0xff;wela=1;P0=0x7b;wela=0;delay(5);
}

总结:代码是在郭天祥书中摘取后加入自己的想法进行的修改,做注释,增加可读性同时使每一步与时序图相对应。但由于博主手头没有相应的硬件,无法测试代码可行性。仅帮助理解ADC0804转换的过程。

四、XPT2046

概况

XPT2046本是电阻触控屏控制器,由于触摸控制器需要测量电压,因此可以作为A/D转换器使用。采用了逐次比较型A/D转换器,共有16个引脚,分辨率为12位,输入电压范围为0-6V。

1.引脚图与控制寄存器
  • 引脚图为QFN-16封装方式

引脚 名称 解释
1 BUSY 忙时信号线,当CS‾\overline{CS}CS为高电平时为高阻状态
2 DIN 串行数据输入端。当CS‾\overline{CS}CS为低电平时,数据在DCLK上升沿锁存进来
3 CS‾\overline{CS}CS 片选信号。控制转换时序和使能串行输入输出寄存器,高电平时ADC掉电
4 DCLK 外部时钟信号输入端
5 VCC 电源输入端
6-9 XP,YP,XN,YN 信号输入端
10 GND 接地端
11 VBAT 电池监视输入端
12 AUX ADC辅助输入通道
13 VREF 参考电压输入/输出
14 IOVDD 数字电源输入端
15 PENIRQ‾\overline{PENIRQ}PENIRQ​ 笔接触中断引脚
16 DOUT 串行数据输出端。数据在DCLK的下降沿移出,当CS‾\overline{CS}CS高电平时为高阻状态
  • 控制寄存器
位序号 D7 D6 D5 D4 D3 D2 D1 D0
位符号 S A2 A1 A0 MODE SERDFRSER\sqrt{DFR}SERDFR​ PD1 PD0
位序号 名称 解释
7 S 开始位。S=1表示新的控制字节到来,S=0表示忽略PIN引脚数据
6-4 A2-A0 通道选择位
3 MODE MODE=1为8位转换分辨率,MODE=0为12位转换分辨率
2 SERDFRSER\sqrt{DFR}SERDFR​ SERDFRSER\sqrt{DFR}SERDFR​=1为单端输入方式,SERDFRSER\sqrt{DFR}SERDFR​=0为差分输入方式
1-0 PD1-PD0 低功率模式选择位,一般采用低功率模式,赋值00

注:
由于博主使用的是普中单片机开发板,且XPT2046仅作为AD转换器使用,因此仅使用单端模式,控制A0,A1,A2三个位即可,其余位较为固定。

控制位 A2 A1 A0 输入端口 外部设备
0x94/0xB4 0 0/1 1 X+ 电位器
0xD4 1 0 1 Y+ 热敏电阻
0xA4 0 1 0 VBAT 光敏电阻
0xE4 1 1 0 AUX 外部信号
2.时序图

3.例程:电位器A/D转换
#include<reg52.h>
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;/*AD转换器的IO口设置*/
sbit DOUT = P3^7;    //输出
sbit CLK  = P3^6;    //时钟
sbit DIN  = P3^4;    //输入
sbit CS   = P3^5;    //片选
/*数码管的IO口设置*/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 time;     //控制显示
u8 disp[4];     //存放数据的数组
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示表void datapros();           //数据处理函数
u16 SPI_Read(void);         //采用SPI协议读取数据
void SPI_Write(u8 dat);     //写入数据
u16 Read_AD_Data(u8 cmd);   //读取AD
void delay(u16);            //延时函数
void DigDisplay();          //数码管显示函数void main()
{   while(1){datapros();     //数据处理函数DigDisplay();//数码管显示函数     }
}void datapros()    //数据处理函数
{u16 temp;if(time==50)                        //每隔一段时间显示一次,时间约为time循环50次{time=0;temp = Read_AD_Data(0x94);       //写入电位器端口,修改参数可以更换模式}time++;disp[0]=smgduan[temp/1000];           //千位disp[1]=smgduan[temp%1000/100];        //百位disp[2]=smgduan[temp%1000%100/10]; //十位disp[3]=smgduan[temp%1000%100%10]; //个位
}void SPI_Write(u8 dat) //使用SPI写入数据
{u8 i;CLK = 0;             //时钟信号拉低for(i=0; i<8; i++){DIN = dat >> 7;     //放置最高位,DIN为控制寄存器dat <<= 1;           //每次写入移位CLK = 0;           //时钟信号上升沿放置数据CLK = 1;}
}u16 SPI_Read(void) //使用SPI读出数据
{u8 i;u16   dat=0;CLK = 0;                //时钟信号拉低for(i=0; i<12; i++)       //接收12位数据{dat <<= 1;         //每次写入移位CLK = 1;CLK = 0;          //时钟信号下降沿读取数据dat |= DOUT;      //由DOUT接口写入数据}return dat;
}u16 Read_AD_Data(u8 cmd)   //读AD数据
{u8 i;                  //循环变量u16 AD_Value;         //存放读出的AD数据CLK = 0;                //时钟信号拉低CS  = 0;               //片选电位拉低SPI_Write(cmd);         //写数据for(i=6; i>0; i--);    //延时等待转换结果CLK = 1;             //发送一个时钟周期,清除BUSY_nop_();                //延时一个时钟周期_nop_();              //延时一个时钟周期CLK = 0;             //时钟信号拉低_nop_();                //延时一个时钟周期_nop_();              //延时一个时钟周期AD_Value=SPI_Read(); //读出模拟值CS = 1;                 //片选电位拉高return AD_Value;        //返回读出的值
}void delay(u16 i)  //延时函数 i=1延时10us
{while(i--);
}void DigDisplay()  //数码管显示函数
{u8 i,j;for(i=0;i<4;i++){switch(i)                //位选,选择点亮的数码管{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位   }P0=disp[3-i];         //发送数据delay(100);           //间隔一段时间扫描  P0=0x00;               //消隐}
}

总结:代码是在普中科技A/D转换例程改写的。与ADC0804不同的是,由于XPT2046功能较多,使用了控制寄存器,且对比前面的郭天祥的板子,普中的板子没有使用锁存器,所以数据要一位一位的写入/读取。

51单片机学习笔记——AD转换相关推荐

  1. 51单片机学习笔记AD/DA

    AD/DA AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号.比如单片机只能识别0与5V数字信号,当输入为2.5V--模拟信号时,就需要转化为单片机所 ...

  2. AutoLeaders控制组—51单片机学习笔记

    文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...

  3. [51单片机学习笔记TWO]----蜂鸣器

    蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来 ...

  4. 51单片机学习笔记-1简介及点灯

    51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...

  5. 基于51单片机PT100热电偶AD转换protues仿真设计

    基于51单片机PT100热电偶AD转换protues仿真设计 (源码+仿真) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0023 这里写 ...

  6. 单片机c语言北航,【下载资料】《51单片机学习笔记》北航版

    原标题:[下载资料]<51单片机学习笔记>北航版 如果手机下载有问题,请移步至电脑端,链接:https://forum.mianbaoban.cn/t/topic/36906 内容简介 本 ...

  7. 51单片机学习笔记2 仿真器的使用及STC89Cxx简介

    51单片机学习笔记2 仿真器的使用及STC89Cxx简介) 一.连接步骤 1. 硬件连接 2. 安装软件驱动 3. 检查是否安装成功 二.仿真步骤 1. 打开一个51工程 2. 选择仿真设备 3. S ...

  8. 51单片机学习笔记5 流水灯实现及蜂鸣器控制

    51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...

  9. 51单片机学习笔记1 简介及开发环境

    51单片机学习笔记1 简介及开发环境 一.51单片机 1. STC89C52单片机简介 2. 命名规则 3. 封装 (1)PDIP (2)LQFP (3)PLCC (4)PQFP 二.STC8051结 ...

  10. AutoLeaders控制组——51单片机学习笔记(AD/DA、红外遥控)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

最新文章

  1. 廖雪峰JS教程学习记录---字符串
  2. php ob flush 不管用,php ob_flush 不能每隔一秒输出
  3. 后台开发技术(1)--概述
  4. 信息流媒体变现_百度联盟陈一凡:今年联盟分成仍将破峰,未来视频变现可期...
  5. CodeForces - 801C Voltage Keepsake(二分)
  6. kaggle 相关知识汇总(转载+自己整理)
  7. 组合数学中的项链计数
  8. scara机器人本体介绍
  9. DaveGray推荐的视觉思维好书(一)
  10. 机器学习资料合计(一)
  11. 正确使用计算机说课稿,计算机优秀说课稿讲课讲稿.pdf
  12. go语言:sync.Once的用法(转)
  13. 利用selenium实时监测交大经管学院前沿讲座更新状态_20200527_
  14. 时间戳——微信保存视频时发现的问题
  15. 系统盘修复计算机命令,U盘启动盘修复系统的详细步骤
  16. Cannot get a STRING value from a NUMERIC cell
  17. 《全数据时代的炼金师》读书笔记(一)
  18. WebService 及java网络编程等基础概念(一)
  19. 自研还是采购BI系统?后悔知道得太晚!
  20. 制药企业计算机系统urs,制药设备urs.pdf

热门文章

  1. windows系统镜像修复计算机,分享win10用镜像文件修复系统的方法
  2. Unity 自由视角的惯性旋转
  3. python中单引号、双引号、三单引号、三双引号用法详解
  4. 彩信文件服务器,彩信服务器怎么设置
  5. 【老生谈算法】matlab实现方位角计算源码——方位角计算
  6. illustrator cs5 2学习笔记
  7. mysql判断用户名和密码是否正确_怎样分别判断用户名和密码是否正确
  8. 2015年国内数据安全事件盘点
  9. 霹雳吧啦Wz语义分割学习笔记P1
  10. 服装尺寸 html,国家标准服装尺寸表