51单片机学习笔记——AD转换
一、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转换相关推荐
- 51单片机学习笔记AD/DA
AD/DA AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号.比如单片机只能识别0与5V数字信号,当输入为2.5V--模拟信号时,就需要转化为单片机所 ...
- AutoLeaders控制组—51单片机学习笔记
文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...
- [51单片机学习笔记TWO]----蜂鸣器
蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来 ...
- 51单片机学习笔记-1简介及点灯
51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...
- 基于51单片机PT100热电偶AD转换protues仿真设计
基于51单片机PT100热电偶AD转换protues仿真设计 (源码+仿真) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0023 这里写 ...
- 单片机c语言北航,【下载资料】《51单片机学习笔记》北航版
原标题:[下载资料]<51单片机学习笔记>北航版 如果手机下载有问题,请移步至电脑端,链接:https://forum.mianbaoban.cn/t/topic/36906 内容简介 本 ...
- 51单片机学习笔记2 仿真器的使用及STC89Cxx简介
51单片机学习笔记2 仿真器的使用及STC89Cxx简介) 一.连接步骤 1. 硬件连接 2. 安装软件驱动 3. 检查是否安装成功 二.仿真步骤 1. 打开一个51工程 2. 选择仿真设备 3. S ...
- 51单片机学习笔记5 流水灯实现及蜂鸣器控制
51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...
- 51单片机学习笔记1 简介及开发环境
51单片机学习笔记1 简介及开发环境 一.51单片机 1. STC89C52单片机简介 2. 命名规则 3. 封装 (1)PDIP (2)LQFP (3)PLCC (4)PQFP 二.STC8051结 ...
- AutoLeaders控制组——51单片机学习笔记(AD/DA、红外遥控)
本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...
最新文章
- 廖雪峰JS教程学习记录---字符串
- php ob flush 不管用,php ob_flush 不能每隔一秒输出
- 后台开发技术(1)--概述
- 信息流媒体变现_百度联盟陈一凡:今年联盟分成仍将破峰,未来视频变现可期...
- CodeForces - 801C Voltage Keepsake(二分)
- kaggle 相关知识汇总(转载+自己整理)
- 组合数学中的项链计数
- scara机器人本体介绍
- DaveGray推荐的视觉思维好书(一)
- 机器学习资料合计(一)
- 正确使用计算机说课稿,计算机优秀说课稿讲课讲稿.pdf
- go语言:sync.Once的用法(转)
- 利用selenium实时监测交大经管学院前沿讲座更新状态_20200527_
- 时间戳——微信保存视频时发现的问题
- 系统盘修复计算机命令,U盘启动盘修复系统的详细步骤
- Cannot get a STRING value from a NUMERIC cell
- 《全数据时代的炼金师》读书笔记(一)
- WebService 及java网络编程等基础概念(一)
- 自研还是采购BI系统?后悔知道得太晚!
- 制药企业计算机系统urs,制药设备urs.pdf