ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单片机——A/D数模转换篇

2021-04-18 13:59:42  阅读:455  来源: 互联网

标签:12 引脚 芯片 模式 时序 单片机 数模转换 数据


前言:

这个芯片的数据手册链接放在这里:xpt2046芯片手册

目录

A/D数模转换篇

1、概述

1)简介

为了满足多种需要,目前国内外各半导体器件生产厂家设计并生产出了多种多样的ADC芯片。从性能上讲,它们有的精度高、速度快,有的则价格低廉。从功能上讲,有的不仅具有A/D转换的基本功能,还包括内部放大器和三态输出锁存器;有的甚至还包括多路开关、采样保持器等,已发展为一个单片的小型数据采集系统。

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

2)芯片电路图

在这里插入图片描述
如果按照原理图这样接,将这个芯片作为A/D转换的话,有4个引脚接模拟信号输出设备,分别为:AIN0、AIN1、AIN2、AIN3。

3)各个引脚的说明

在这里插入图片描述
限于篇幅,上面列举的只是芯片手册中的冰山一角,关于**芯片手册的链接我会放于文章最前面**,想要搞懂原理的可以看看芯片手册,毕竟会看芯片手册这都是基本操作。当我们对芯片手册有了大致的了解后,我们就可以着手编程,开始操作它,从而达到我们想要的效果了。

那么如何用mcu对芯片操作呢?

首先mcu按照芯片指定的时序图,发送一系列控制字命令(芯片不同,命令格式不同,有的会含有地址数据啥的),当芯片收到一系列控制字命令后就知道mcu的目的了,然后就会做一些处理取得mcu想要的数据,最后按照时序图给muc发过去就可以了。

mcu想要从另一边的芯片里获得想要的数据,这里可以做一个比喻:就好比我想向另一个地方的人询问消息,那是不是我们可以把想要问的东西写在纸上呀?好比写信,开头先来一句——某某某你好,然后就是我找你干什么呀?——即对应一系列的控制字命令。当然写信也不是随便写的,起码你写的内容对方要看得懂是吧。就要写对方看得懂的语言——即严格遵守控制字命令格式。然后就按照一定的路线图将纸条给人带过去——即遵守时序图规则。只有这样,对方才能正确接收到,并正确的进行解读信息,最后达到你的目的。

而这一系列操,即我们在开发中所遇到的最大问题,一般都可以在芯片手册中找到答案。

下面就来一一解读上面的难题

2、控制字命令格式

控制字命令由芯片DIN引脚输入,这个芯片的控制字命令格式如下:
在这里插入图片描述
控制字命令各位描述如下:
在这里插入图片描述

  • 起始位——第一位,即 S 位。控制字的首位必须是 1,即 S= 1。在 XPT2046 的 DIN 引脚检测到起始位前,所有的输入将被忽略。

  • 地址——接下来的 3 位( A2、 A1 和 A0)选择多路选择器的现行通道,触摸屏驱动和参考源输入。下面图就介绍了哪些引脚作为输入口时,与之对应的通道地址。
    在这里插入图片描述

  • MODE——模式选择位,用于设置 ADC 的分辨率。 MODE= 0,下一次的转换将是 12 位模式;MODE= 1,下一次的转换将是 8 位模式。

  • SER/DFR非 位控制参考源模式,选择单端模式( SER/DFR非 = 1),或者差分模式( SER/DFR非 = 0),两个模式作用不同,差分模式用于触摸压力测量中;而单端模式用于其它测量中。(具体可看芯片手册)

  • PD0 和 PD1——低功率模式选择。

综上我们就相当于把信的写好了,接下来我们主要了解如何将信传递给对方了(芯片)

3、时序图详解

1)芯片时序图知识点

上时序图:
在这里插入图片描述
XPT2046 数据接口是串行接口,处理器和芯片之间的的通信需要 8 个时钟周期,可采用 SPI、 SSI 和Microwire 等同步串行接口。一次完整的转换需要 24 个串行同步时钟( DCLK)来完成。大致流程:

1、前 8 个时钟用来通过DIN引脚输入控制字节——即完成我要找谁,我要让它干什么?的事情。
2、芯片接收命令后,进入采样模式。
3、接下来的12 个时钟周期将完成真正的模数转换。因为这里选择的是12位模式,当然也可以选择8位模式,区别只是8位模式比12位模式的分辨率小,分辨率越大,测量得越精细。
其它剩余的4个时钟周期,就填充无效数据(填充零比特)。

2)软件模拟时序图

在这里插入图片描述
从时序图中知道,我们主要用到四个引脚,分别时:cs非(片选使能)、DCLK(提供时钟信号)、DIN(输入数据)、DOUT(输出数据).

1.对引脚初始化

上代码:

//初始化函数
//对CS非、DCLK、DIN三个引脚输入低电平
void xpt2046Init()
{	
	CS  = 0;
	DCLK = 0;
	DIN = 0;
}

2.发送8位控制字命令

在这里插入图片描述
我们这里选择12位的模式、单端模式、选择低功耗。参照我们的原理图,通道地址(A2 、A1 、A0)为110,选择图如下。所以最终的控制命令字为:1110 0100——0xE4
在这里插入图片描述

在这里插入图片描述
上代码:

//DIN发送控制字命令数据
//参数:要写入的具体控制字命令,从上面分析知这里传入0xE4
//注意——根据引脚说明,发送的每位数据只有当clk在上升沿后锁存
void xpt2046Write(unsigned char dat)
{
	unsigned char i;
	
	for(i=0; i<8; i++)		//准备发送8位数据
	{
		DCLK = 0;	//先将时钟线拉低,为上升沿做准备
		DIN = dat >> 7;  	//传送最高位
		dat <<= 1;			//方便下次传送此高位
		DCLK = 1;			//上升沿放置数据
	}
}

!!!注意:芯片接收到命令后,需要等待一定的时间让它测量数据,有的芯片手册会明确告诉我们等待的时间是多少,但这个芯片手册里貌似没有明说,但问题不大。我们从时序图中也可以知道这个等待时间是一个时钟周期。

3.接收对方的测量数据

这里的数据位数为12位。如果是16位的话,我们可以写一个函数,一次用于接收8位数据,然后连续接收两次就可以了,最后把数据合并。(最后多接收的4位数据反正也是0,不会影响数据大小的)

这里12位同理也可以采用这种方法。这里我采用另外一种方法:一次就把12位数据接收完。
上代码:

//DIN接收数据函数
//返回值:接收到的12位数据
//如果想一次接收8位数据,分两次接收完,只用将循环次数12修改位8即可
unsigned int xpt2046Read(void)
{
	unsigned int i, dat=0;
	
	for(i=0; i<12; i++)		//接收12位数据
	{
		dat <<= 1;		//移位,便于接收数据
		DCLK = 0;		//先将时钟线拉低,为上升沿做准备
		dat |= DOUT;	//接收数据		
		DCLK = 1;		//产生上升沿
	}
	return dat;	
}

4.打包函数,一次性获得测量值

上代码:

//芯片得到采集的数据函数
//参数:写入的控制字命令,这里可以为0xE4
//返回值:接收到的12位数据
unsigned int Read_AD_Data(unsigned char cmd)
{
	unsigned char i;
	unsigned int AD_Value;
	xpt2046Init();		//对引脚初始化
	xpt2046Write(cmd);		//写入控制字命令
	DCLK = 0;	  //发送一个时钟周期,清除BUSY
	DCLK = 1;
	delay_ms(2); 	//延时等待转换结果
	AD_Value=xpt2046Read();
	CS = 1;			//接收满12位数据后就可以使能片选信号,以结束通信
	return AD_Value;	
}

!!!所以我们在主函数里只需要调用最后一个函数Read_AD_Data();就可以实现了我们模数转换的目的

标签:12,引脚,芯片,模式,时序,单片机,数模转换,数据
来源: https://blog.csdn.net/qq_41873236/article/details/115797890

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有