ADC 模数转换实验

2023-11-04

           生活中的模拟信号,如温度、声音、压力等,需要转换为更方便储存、处理和发射的数字形式。 51 单片机无法直接操作这些模拟量,其系统内部时运算都是数字量 0 和 1,因此必须将模拟量转换成数字量。数字量,指的是用一系列 0 和 1 组成的二进制代码表示某个信号大小的量。用数字量表示一个模拟量时,数字位数可以多也可以少,位数越多表示精度越高, 位数越少表示精度越低。

ADC 简介

           模数转换器ADC(analog to digital converter),是指将一个模拟信号转变为数字信号。单片机在采集模拟信号时,通常都需要在前端加上 A/D 芯片。

           ADC 的主要技术指标:

分辨率

           分辨率是指,对于允许范围内的模拟信号,输出离散数字信号值的个数。这些信号值通常用二进制数来存储,因此分辨率经常用比特(bit)作为单位,且离散值的个数是 2 的幂指数。

           例:12 位 ADC 的分辨率就是 12 位,或者说分辨率为满刻度的 \frac{1}{2^{12}}。 一个 10V 满刻度的 12 位 ADC 能分辨输入电压变化的最小值为:

10\cdot \frac{1}{2^{12}}= 0.00244v=2.4mv

转换误差

           转换误差通常是以输出误差的最大值形式给出,表示 A/D 模/数转换器实际输出的数字量理论输出数字量之间的差别,常用最低有效位的倍数表示。例如给出相对误差:\leq \pm \frac{LSB}{2},表示实际输出的数字量和理论上的输出数字量之间的误差小于最低位的半个字,LSB为最小数字量的模拟变化量。

转换速率

           转换速率是指能够重复进行数据转换的速度,即每秒 A/D 模/数转换的次数。一次 A/D 转换所需的时间包括稳定时间。

ADC 转换原理

           ADC将模拟量转换为数字量,通常需要经过 4 个步骤:采样、保持、 量化和编码。

           采样:是指将一个时间上的连续信号转换为时间上的离散信号(类似于推导微积分的时候采用的方法)。如下图所示:

            保持:是指存储采样结果,直到下次采样。通常将采样器和保持电路统称为采样保持电路

            量化是指将采样电平归化为与之接近的离散数字电平。

            编码是指将量化后的结果按照一定数制形式表示。

            将采样电平(模拟值)转换为数字值(0或1),主要有两类方法:直接比较型与间接比较型。

  • 直接比较型:就是将输入模拟信号直接与标准的参考电压比较,从而得到数字量。常见的有并行 ADC 和逐次逼近型 ADC。
  • 间接比较型:输入模拟量不是直接与参考电压比较,而是将二者变为中间的某种物理量在进行比较,然后将比较所得的结果进行数字编码。常见的有双积分型 ADC。

           通常使用的方法是逐次逼近型 ADC 和双积分型 ADC 。

逐次逼近型 ADC

          如下图所示,A/D 转换器由比较器、D/A 转换器、缓冲寄存器和控制逻辑电路组成:

              原理:从高位到低位逐次试探比较,就像用天平秤物体,从重到轻逐级增减砝码进行试探。逐次逼近法的转换过程是:初始化时将逐次逼近寄存器(图中锁存缓存器)各位(D7~D0)清零,转换开始时,先将逐次逼近寄存器最高位D7置 1,送入 D/A 转换器,经 D/A 转换后生成的模拟量送入比较器,称为 U0,与送入比较器的待转换的模拟量 Ux 进行比较,若 U0<Ux,该位 1 被保留,否则被清除。然后再将逐次逼近寄存器次高位D6置 1,将寄存器中新的数字量送 DA 转换器,输出的 U0 再与 Ux 比较,若 U0<Ux,该位 1 被保留,否则被清除。重复此过程,直至逼近寄存器最低位D0。转换结束后, 将逐次逼近寄存器中的数字量送入缓冲寄存器(图中N位寄存器),将得到数字量的输出。逐次逼近的操作过程是在一个控制电路的控制下进行的。 

双积分型 ADC

              如下图所示, A/D 转换器由电子开关、积分器、比较器和控制逻辑等部件组成:

                原理:将输入电压变换成与其平均值成正比时间间隔,再把此时间间隔转换成数字量,属于间接转换。双积分法 A/D 转换的过程:先将开关接通待转换的模拟量 Vi,Vi 采样输入到积分器,积分器从零开始进行固定时间 T 的正向积分\int_{0}^{T},时间 T 到后,开关再接通与 Vi 极性相反的基准电压 Vref,将 Vref 输入到积分器,进行反向积分\int_{T}^{0},直到输出为 0V 时停止积分。Vi 越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数值,就是输入模拟电压 Vi 所对应的数字量,从而实现了 AD 转换。

 XPT2046 芯片简介

                XPT2046 是一款 4 线制电阻式触摸屏控制器,内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置。除此之外, 还可以测量加在触摸屏上的压力。内部自带 2.5V 参考电压,可以作为辅助输入、温度测量和电池监测之用,电池监测的电压范围可以从 0V 到 6V。XPT2046 片内集成有一个温度传感器。在 2.7V 的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。XPT2046 采用微小的封装形式:TSSOP-16,QFN-16 和 VFBGA-48。 工作温度范围为-40℃~+85℃。与 ADS7846、TSC2046、AK4182A 完全兼容。

主要特性

  • 工作电压范围为 1.5V~5.25V
  • 支持 1.5V~5.25V 的数字 I/O 口
  • 内建 2.5V 参考电压源
  • 电源电压测量( 0V~6V)
  • 内建结温测量功能
  • 触摸压力测量
  • 采用 3 线制 SPI 通信接口
  • 具有自动省电功能

芯片管脚说明

                XPT2046 是一种典型的逐次逼近型模/数转换器(SAR ADC),包含采样、保持、模数转换、串口数据输出等功能。同时芯片集成有一个 2.5V 的内部参考电压源、温度检测电路,工作时使用外部时钟。XPT2046 可以单电源供电,电源电压范围为 2.7V~5.5V。参考电压值直接决定 ADC 的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入参考电压(要求外部参考电压源输出阻抗低)。X、Y、Z、VBAT、Temp 和 AUX 模拟信号经过片内的控制寄存器选择后进入 ADC,ADC 可以配置为单端或差分模式。选择 VBAT、Temp 和 AUX 时应该配置为单端模式;作为触摸屏应用时,应该配置为差分模式,这可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换精度。单端和差分模式输入配置如下图所示:

                 XPT2046 数据接口是串行接口,其典型工作时序如下图所示,图中展示的信号来自带有基本串行接口的单片机或数据信号处理器。处理器和转换器之间的的通信需要 8 个时钟周期,可采用 SPI、SSI 和 Microwire 等同步串行接口。一 次完整的转换需要 24 个串行同步时钟(DCLK)来完成。

                  前 8 个时钟用来通过 DIN 引脚输入控制字节。当转换器获取有关下一次转换的足够信息后,接着根据获得的信息设置输入多路选择器和参考源输入,并进入采样模式,如果需要,将启动触摸面板驱动器。3 个多时钟周期后,控制字节设置完成,转换器进入转换状态。这时,输入采样-保持器进入保持状态,触摸面板驱动器停止工作(单端工作模式)。接着的 12 个时钟周期将完成真正的模数转换。如果是度量比率转换方式(SER/DFR=0),驱动器在转换过程中将一直 工作,第 13 个时钟将输出转换结果的最后一位。剩下的 3 个多时钟周期将用来完成被转换器忽略的最后字节(DOUT 置低)。

                  在对 XPT2046 进行控制时,控制字节由 DIN 输入的控制字命令格式如下所示:

                  如果采用单端模式测量 X 坐标、Y 坐标和触摸压力,则需要添加一个外部参考电压,并且 XPT2046 的电源也必须来自这个外部参考源。需要特别注意的一点是,当使用单端模式时,输入 ADC 的电压不能超过内部参考电压,尤其是当工作电压大于 2.7V 的时候。

                  注意:差分模式仅用于 X 坐标、Y 坐标和触摸压力的测量,其它测量要求采用单端模式。

                  如果想要更详细的了解XPT2046 芯片其工作原理,可以查看芯片资料链接: https://pan.baidu.com/s/1OxNovNPMV0DAVFxfoaZ10A?pwd=6wr6 提取码: 6wr6 。

硬件部分

        使用到硬件资源如下:

  1. 动态数码管
  2. ADC 模块

        动态数码管电路在前面动态数码管实验中介绍过,不再重复。ADC 模块电路如下图所示:

         ADC 模块电路独立,XPT2046 芯片的控制管脚接至 J33 端子上,XPT2046 芯片的 ADC 输入转换通道分别接入了 AD1 电位器、NTC1 热敏传感器、GR1 光敏传感器,还有一个外接通道 AIN3 接在 DAC 模块的 J52 端子上供外部模拟信号检测。

         可以使用任意单片机管脚连接XPT2046 芯片的控制管脚,使用 P3.4 管脚与芯片的 DIN 管脚连接,P3.5 管脚与芯片的 CS 管脚连接,P3.6 管脚与芯片的 CLK 管脚连接,P3.7 管脚与芯片的 DOUT 管脚连接。

软件部分

         所要实现的功能是:数码管上显示 AD 模块采集电位器的电压值。

         程序框架如下:

  1. 编写数码管显示功能
  2. 编写 ADC 转换函数
  3. 编写主函数

 数码管显示

#include "smg.h"

//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void smg_display(u8 dat[],u8 pos) //dat[]形参的实际参数为gsmg_code[ ],pos形参的实际参数为i-pos_temp
{
 	u8 i=0;
	u8 pos_temp=pos-1;//数码管显示位置

	for(i=pos_temp;i<8;i++)
	{
	 	switch(7-i)//位选
		{
		 	case 0:LSC=1;LSB=1;LSA=1;break;
			case 1:LSC=1;LSB=1;LSA=0;break;
			case 2:LSC=1;LSB=0;LSA=1;break;
			case 3:LSC=1;LSB=0;LSA=0;break;
			case 4:LSC=0;LSB=1;LSA=1;break;
			case 5:LSC=0;LSB=1;LSA=0;break;
			case 6:LSC=0;LSB=0;LSA=1;break;
			case 7:LSC=0;LSB=0;LSA=0;break;
		}
		SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据
		delay_10us(100);//延时一段时间,等待显示稳定
		SMG_A_DP_PORT=0x00;//消音
	}
}

ADC 读写函数

         根据XPT2046 时序图可知,XPT2046 完成一个完整的转换需要 24 个串行时钟,也就是需要 3 个字节的 SPI 时钟。XPT2046 前 8 个串行时钟,是接收 1 个字节的转换命令,接收到转换命令了之后,然后使用 1 个串行时钟的时间来完成数据转换(当然在编写程序的时候,为了得到精确的数据,可以适当的延时一下) ,然后返回 12 个字节长度(12 个字节长度也计时 12 个串行时 钟)的转换结果。然后最后 4 个串行时钟返回 4 个无效数据,可以忽略。                                                xpt2046_read_adc_value 函数就是按照这个时序实现。至于 xpt2046_wirte_data 和 xpt2046_read_data 函数是 IO 口模拟的 SPI 读写时序,与 DS1302 的读写是一样的。

#include "xpt2046.h"
#include "intrins.h"

void xpt2046_write_data(u8 dat)//XPT2046写数据,dat:写入的数据
{
 	u8 i;
	
	DCLK=0;
	_nop_();//该函数是在51单片机中用的延时函数,表示执行一条没有什么意义的指令,延时一个指令周期
	for(i=0;i<8;i++)
	{
	 	DIN=dat>>7;//先传高位再传低位
		dat<<=1;//为下一次(DIN=dat>>7)做准备,把次高位移到最高位,然后右移7位,将次高位传输
		DCLK=1;//CLK产生一个上升沿,从而写入数据
		_nop_();
		DCLK=0;
		_nop_();
	}
}

u16 xpt2046_read_data(void)//XPT2046读数据
{
 	u8 i;
	u16 dat=0;

	DCLK=0;
	_nop_();
	for(i=0;i<12;i++)//循环12次,每次读取一位,大于一个字节数,所以返回值类型是u16
	{
	 	dat<<=1;
		DCLK=1;
		_nop_();
		DCLK=0;//DCLK产生一个下降沿,从而读取数据
		_nop_();
		dat|=DOUT;//先读取高位,在读取低位
	}
	return dat;
}

u16 xpt2046_read_adc_value(u8 cmd)//XPT2046读AD数据,cmd:指令
{
 	u8 i;
	u16 adc_value=0;

	DCLK=0;
	CS=0;//使能xpt2046
	xpt2046_write_data(cmd);//发送命令字
	for(i=6;i>0;i--);//延时等待转换结果
	DCLK=0;
	_nop_();
	DCLK=1;//发送一个时钟,清除BUSY
	_nop_();
	adc_value=xpt2046_read_data();
	CS=1;//关闭XPT2046
	return adc_value;
}

主函数

         主函数代码首先调用外设头文件,然后定义一些变量存储 AD 值和电压值,进入 while 循环,读取光敏传感器的 AD 值,根据 XPT2046 单端模式输入配置表可知,要采集 Vbat通道的信号,则配置值为 0XA4。得到 AD 值后,可按照如下公式计算电压值:

Vref*ADC_Value/分辨率

         其中 Vref 是参考电压,XPT2046 接入的是 5V,ADC_Value 是读取的 AD 值, 分辨率是 ADC 的位数(2^{12}=4096)。

#include "public.h"
#include "smg.h"
#include "xpt2046.h"

void main()
{	
	u16 adc_value=0;
	u8 adc_buf[4];

	while(1)
	{				
		adc_value=xpt2046_read_adc_value(0xA4);//测量光敏电阻
		adc_buf[0]=gsmg_code[adc_value/1000];
		adc_buf[1]=gsmg_code[adc_value%1000/100];
		adc_buf[2]=gsmg_code[adc_value%1000%100/10];
		adc_buf[3]=gsmg_code[adc_value%1000%100%10];
		smg_display(adc_buf,5);		
	}		
}

         源代码链接:链接: https://pan.baidu.com/s/1nLIbTWupXMcM53VYYYFrfQ?pwd=abwt 提取码: abwt 

现象

        光线较暗时:

         光线明亮时:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ADC 模数转换实验 的相关文章

  • Linux用普通用户输入命令报错-fork 资源不可用

    解决办法 修改最大限制打开文件数 vi etc security limits d 修改为65535 修改完之后重启应用服务器 系统正常访问
  • 服务器centos系统相关备注

    Install the UFW package using yum sudo yum y install ufw 开放端口 sudo ufw default allow outgoing sudo ufw allow 7000 tcp su
  • 解决Ubuntu16.04ping www.baidu.com不通的问题

    想要安装一个包 发现Ubuntu16 04不能上网 在终端ping百度 发现不通 问题如下 解决方法 1 检查你是否有IP信息 使用命令ifconfig 如果没有IP 则参照我的上一篇文章 获取IP 2 如果有IP 则进行下一步 执行以下命
  • 其他总结(四)--win10手动一小时四小时一天重新打开wifi

    win10出现这种个情况 是因为你吧笔记本的wifi关了 可以按fn F 这里的 号指你笔记本上的含有wifi信号开关的那个F键 我的是F2 重新开启就可以连接了 还可以用其他方式打开 https jingyan baidu com alb
  • Python语言—爬虫之旅

    活动地址 毕业季 进击的技术er 一 目前是大几 学习的专业是 本专业让你Get到哪些新技能 二 从哪个瞬间开始让你决定学习编程语言 三 进入大学敲下的第一行代码是什么 四 目前学习中最大的收获难是 五 大学期间的学习目标是 对未来的职业规
  • 使用pandas对xlsx文件的基本操作

    起因 因最近实习期间 要求查看 xlsx文件中数据是否有误 由于数据较多 想用python去执行 结果发现网上对xlsx文件操作或是太旧 大多难以应用 所以自己整理了一下 以备自己后用 模拟一个测试数据集data test xlsx文件 文

随机推荐

  • Broken pipe异常分析和常用锁的命令

    错误描述 ClientAbortException java io IOException Broken pipe 这种就是获取不到连接了 连接已经断开了 出现这种问题的可能性 1 连接太多 到了最大连接数 每个连接处理的速度太慢 而导致处
  • COLMAP导出相机外参(bin文件转txt文件)

    官方给出的images txt如下图 Image list with two lines of data per image 每张图像数据占两行 IMAGE ID QW QX QY QZ TX TY TZ CAMERA ID NAME 图像
  • 基于mykernel完成多进程的简单内核

    学号 476 实验资源 https github com mengning linuxkernel 1 实验环境准备 使用个人电脑的parallels desktop ubuntu虚拟机 1 安装qemu sudo apt get inst
  • DCT变换 / DWT变换 ----课堂笔记

    之前也学过 但没有个具体总结 忘差不多了 DCT变换 一 DCT变换的全称是离散余弦变换 DCT 主要用于数据或者图像的压缩 由于DCT能够将空域的信号转换到频域上 因此具有良好的去相关性的性能 DCT变换本身是无损的且具有对称性 对原始图
  • 分支创建&查看&切换

    1 初始化git目录 创建文件并将其推送到本地库 git init echo 123 gt hello txt git add hello txt git commit m first commit hello txt git init I
  • hive分区与分桶

    为什么要分桶 获得更高的查询处理效率 在分区数量过于庞大以至于可能导致文件系统崩溃时 或数据集找不到合理的分区字段时 我们就需要使用分桶来解决问题了 分区中的数据可以被进一步拆分成桶 不同于分区对列直接进行拆分 桶往往使用列的哈希值对数据打
  • 什么是模式识别(简单易懂)

    1 大脑有一种偏好 叫模式化 这也是源于大脑具有的一个重要功能 模式识别 大脑不是把每个信息点全部处理后再进行识别 而是迅速抓住几个重要特征 然后与大脑中的已有模式对比 只要差不多 就套用 比如 我们可以在一张很多人的合影中迅速识别出某个特
  • 解决开启防火墙后,服务器不能ping通,网站不能访问的问题

    1 解决能ping通的设置 控制面板 Windows防火墙 高级设置 入站规则 然后右键启用这个选项就可以了 2 解决网站不能访问的设置 控制面板 Windows防火墙 高级设置 点击入站规则 新建规则 这样就将80端口加入到入站规则中 实
  • CPU与GPU上检测pytorch是否安装成功

    文章目录 python学习 0 安装pytorch 1 验证pytorch已经安装成功 1 1确定pytorch版本 1 2 测试pytorch基础功能 1 3 在GPU上测试pytorch 1 4使用实例代码测试 python学习 pyt
  • 历史与AES算法

    AES算法早期体现 应该追溯到明朝科举制时期 当然 这种算法不是用来答题的 而是用来作弊的 假如 张三是明朝某大户人家的公子哥 他除了以后要继承遗产外 还要考虑一个光宗耀祖的问题 但在古代 解决这个问题的唯一办法就是通过科举 可张三天生喜欢
  • VM ubuntu所在的移动硬盘意外接触不良,虚拟机异常退出后无法重启

    我的VM版本为VMware Workstation 17 Pro Ubuntu版本为22 04 一次因为虚拟机所在的移动硬盘接触不良 异常退出 重启主机后启动虚拟机 先是ubuntu ubuntu高级选项等选项让我选 然后在我选择了ubun
  • linux---sed命令

    sed命令目录 一 sed命令概念 二 sed命令的格式 1 在命令行定义编辑器命令 2 在命令行使用多个编辑器命令 3 从文件中读取编辑器命令 三 更多的替换选项 1 替换标记 有4种可用的替换标记 2 替换字符 四 使用地址 在sed编
  • 07FFMPEG的AVCodec结构体分析

    07FFMPEG的AVCodec结构体分析 概述 该结构体位于libavcodec库中的codec h中 注意 非公共区域的字段我可能不会翻译 因为翻译也不知道说什么 还是保留着原文更好 其它的结构体分析同理 1 AVCodec 结构体 t
  • 银联支付(亲测成功)

    银联支付 SDK使用 测试流程 此文为银联入门 比较简单 不涉及springboot springcloud 普通web就可以 作者是eclipse 下载demo开发包 https open unionpay com upload down
  • 朴素贝叶斯解决天气问题

    朴素贝叶斯是一种基于贝叶斯定理的分类方法 该算法是有监督的学习算法 解决分类问题 在该算法中 我们假设给定目标值时 属性之间相互条件独立 即 贝叶斯定理 对于分类问题 样本x属于类别y的概率 其中 P y 是指未使用数据训练分类器之前的y的
  • 机器学习方法篇(9)------梯度提升决策树GBDT

    每周一言 生命在于运动 无论脑力还是体力 导语 前面第3 4两节介绍了决策树 由于决策树简单有效 可解释性强 因此被包装成了一些更为高效的机器学习算法 其中最为知名的就是梯度提升决策树GBDT Gradient Boosting Decis
  • 使用RoboForm自动填写表单

    日常工作中 我们也许经常要填写一些内容一模一样的表格 很是讨厌 这里使用RoboForm可以自动填充表格 大大提高我们的工作效率 一 自动填登录页面密码 比如我想登录 右击空白处 选择 RoboForm工具栏 就可以在网页下端显示该工具栏
  • 实训十四:FTP服务器搭建

    实训十四 FTP服务器 2017 年 6 月 6 日编写 今日公布出来 一 搭建FTP服务器 检查网络是否正常 查看 和 连通性 查看主机名称 查看是否已经自动挂载光盘 清楚到光盘挂载的目录 进入挂载安装包中 查看ftp的RPM包 并是安装
  • LeetCode——1798. 你能构造出连续值的最大数目

    一 题目 给你一个长度为 n 的整数数组 coins 它代表你拥有的 n 个硬币 第 i 个硬币的值为 coins i 如果你从这些硬币中选出一部分硬币 它们的和为 x 那么称 你可以 构造 出 x 请返回从 0 开始 包括 0 你最多能
  • ADC 模数转换实验

    生活中的模拟信号 如温度 声音 压力等 需要转换为更方便储存 处理和发射的数字形式 51 单片机无法直接操作这些模拟量 其系统内部时运算都是数字量 0 和 1 因此必须将模拟量转换成数字量 数字量 指的是用一系列 0 和 1 组成的二进制代