AD、DA介绍

AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号

DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号

AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理提供了可能

硬件电路模型

在这里插入图片描述

AD转换通常有多个输入通道,用多路选择开关连接至AD转换器,以实现AD多路复用的目的,提高硬件利用率

AD/DA与单片机数据传送可使用并口(速度快、原理简单),也可使用串口(接线少、使用方便)

可将AD/DA模块直接集成在单片机内,这样直接写入/读出寄存器就可进行AD/DA转换,单片机的IO口可直接复用为AD/DA的通道

硬件电路

运算放大器

运算放大器(简称“运放”)是具有很高放大倍数的放大电路单元。内部集成了差分放大器、电压放大器、功率放大器三级放大电路,是一个性能完备、功能强大的通用放大电路单元,由于其应用十分广泛,现已作为基本的电路元件出现在电路图中
运算放大器可构成的电路有:电压比较器、反相放大器、同相放大器、电压跟随器、加法器、积分器、微分器等
运算放大器电路的分析方法:虚短、虚断(负反馈条件下)

在这里插入图片描述

LM358芯片:内部有两个运算放大器

在这里插入图片描述

AD/DA性能指标

分辨率:

指AD/DA数字量的精细程度,通常用位数表示。例如,对于5V电源系统来说,8位的AD可将5V等分为256份,即数字量变化最小一个单位时,模拟量变化5V/256=0.01953125V,所以,8位AD的电压分辨率为0.01953125V,AD/DA的位数越高,分辨率就越高

转换速度:

表示AD/DA的最大采样/建立频率,通常用转换频率或者转换时间来表示,对于采样/输出高速信号,应注意AD/DA的转换速度

XPT2046

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

即开发板上的AD转换芯片用的是一种触摸屏芯片,运放电路比较复杂,使用芯片则可以直接忽略其内部逻辑,按照设定的时序即可通过芯片将模拟量转换为数字量

AD转换:XPT2046时序

类似于SPI通信

在这里插入图片描述

XTP2046.c文件

#include <REGX52.H>

sbit XPT2046_DIN   = P3^4;
sbit XPT2046_CS    = P3^5;
sbit XPT2046_DCLK  = P3^6;
sbit XPT2046_DOUT  = P3^7;

unsigned int XPT2046_ReadAD(unsigned char Command)
{
	unsigned char i;
	unsigned int ADvalue = 0;
	//初始化
	XPT2046_DCLK = 0;
	//发送指令
	XPT2046_CS = 0;
	for(i = 0;i < 8; i++)
	{
		XPT2046_DIN = Command & (0x80>>i);
		XPT2046_DCLK = 1;	//时钟线给上升沿则发送数据
		XPT2046_DCLK = 0;
	}
	//读取数据
	for(i = 0;i < 16; i++)
	{
		XPT2046_DCLK = 1;		//跳过时序图中BUSY高电平的部分,来到读取开始的时序
		XPT2046_DCLK = 0;
		if(XPT2046_DOUT)
		{
			ADvalue |= (0x8000 >>i);	//读取数据,数据是十六位的
		}
	}
	XPT2046_CS = 1;
	//返回数字量
	if(Command & 0x08 == 1)		//取出MODE位判断
	{
		return ADvalue>>8;	//因为数据读的是16位,当MODE位是1时,选择8位为转换分辨率,所以要右移8位得到真实数值
	}
	else
	{
		return ADvalue>>4;	//当MODE位是0时,选择12位为转换分辨率,16-12=4,就右移4位得到数据 
	}
}

main.c文件

#include <REGX52.H>
#include "LCD1602.h"
#include "XPT2046.h"
#include "Delay.h"

unsigned int ADvalue;

void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"AD1  NTC1  GR1");
	
	while(1)
	{
		ADvalue = XPT2046_ReadAD(XPT2046_AIN0_8);	//调用读取AD函数,并传入控制命令,对电位器的模拟量进行转换
		LCD_ShowNum(2,1,ADvalue,3);
		
		ADvalue = XPT2046_ReadAD(XPT2046_AIN1_8);	//调用读取AD函数,并传入控制命令,对热敏电阻的模拟量进行转换
		LCD_ShowNum(2,6,ADvalue,3);
		
		ADvalue = XPT2046_ReadAD(XPT2046_AIN2_8);	//调用读取AD函数,并传入控制命令,对光敏电阻的模拟量进行转换
		LCD_ShowNum(2,12,ADvalue,3);
		Delay(100);
	}
}

指令的设置

在这里插入图片描述

其中A2-A0取值如下图

在这里插入图片描述

XTP2406.h文件

#ifndef __XPT2046_H__
#define __XPT2046_H__

/*宏定义,控制字的控制位,其中A2、A1、A0看对应电路图中的AIN0、AIN1、AIN2、AIN3,
看数据手册的单端模式输入配置(SER!DFR = 1)
AIN0  ==	X+		==	XP
AIN1  ==	Y+		==	YP
AIN2  ==	VBAT
AIN3  ==	AUX
*/

//MODE为1,选择8位为转换分辨率
#define XPT2046_AIN0_8 0x9C			//1001 1100
#define XPT2046_AIN1_8 0xDC			//1101 1100
#define XPT2046_AIN2_8 0xAC			//1010 1100
#define XPT2046_AIN3_8 0xEC			//1110 1100

//MODE为0,选择12位为转换分辨率
#define XPT2046_AIN0_12 0x94		//1001 0100
#define XPT2046_AIN1_12 0xD4		//1101 0100
#define XPT2046_AIN2_12 0xA4		//1010 0100
#define XPT2046_AIN3_12 0xE4		//1110 0100

unsigned int XPT2046_ReadAD(unsigned char Command);
#endif

DA转换:其实就是PWM,把PWM的代码改一下端口就行

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐