51单片机学习笔记(十) - AD/DA转换


一、AD/DA基本介绍

一、基本概念

  1. A是指analog、模拟的;D是指digital、数字的。
  2. 现实世界是模拟的,连续分布的;计算机世界是数字的,离散分布的,是可以被分成有限份的;
  3. AD转换就是把一个物理量从模拟的转换成数字的;DA就是将数字量转换成模拟量。

二、A/D转换的意义

  1. 自然界多数是模拟量,而计算机计算只能是数字量,所以为了借助计算机的工具研究计算模拟量,就需要将模拟量转换成计算机能识别的数字量;
  2. D/A是A/D转换的逆过程,是计算机将数字量转换成模拟量输出,但是此种模拟量严格意义上也不是连续的,也是可以分为有限份数的。
  3. A/D,D/A转换可以理解为数字量和模拟量的一个通信。也可以理解为物理世界和数字世界的交流。

A/D,D/A的转换原理,在数字电路相关课程里会有更详细的介绍,在这里我们无需展开细说,只需知道如何使用即可。感兴趣可以参考数字电路相关知识。


二、A/D,D/A转换中的主要概念

  1. 位数: AD转换后转出来的数由几位二进制来表示。位数越多,越细腻,精度越高。例如:10位,代表可以将模拟量分成1024份,12位,代表可以将模拟量分成4096份;
  2. 量程:AD转换器可以接受的模拟量的范围。跟芯片制造有关系,如果超过量程,超量程部分可能会被阉割,重则将芯片烧毁;
  3. 分辨率:AD转换器转出来的二进制数,每一格表示多少。例如:10位,分辨率是1/1024,12位,分辨率是1/4096;
  4. 转换速率:就是完成一次A/D,D/A转换所耗费的时间。实际应用中,转换速率越快越好,随之成本会越高。适合项目使用即可;

举例说明:

条件:电压量程范围0-5V,A/D,D/A转换位数是10位,精度是0.01V
分辨率为:(5-0)/2exp(10)=0.00488V
例如一次A转换中数字量是1010101010,计算转换中模拟量的过程如下:
11010101010对应的十进制数是6822、数字量对应的模拟电压是[682/2exp(10)]*5V =[682/1024]*5 = 3.33V

三、A/D,D/A转换在系统中存在的方式

  • CPU外部扩展专用A/D,D/A芯片;
  • CPU内部集成A/D,D/A模块(内部外设)

早期的单片机基本都是在外部扩展,新的高级一些的单片机是内部集成的;
51单片机内部没有集成,所以使用的是外部扩展,使用ET2046芯片,并用SPI接口通信


四、A/D转换原理图及ET2046芯片介绍

1、原理图

在这里插入图片描述

2、ET2046芯片介绍

1、主要特点

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

2、引脚功能说明
在这里插入图片描述
3、ET2046控制字
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、开发板接线

1、SPI接线

  • XPT_DO -> P3^7; //SPI输出;
  • XPT_CLK -> P3^6; //SPI时钟;
  • XPY_DI -> P3^4; //SPI输入;
  • XPT_CS -> P3^5; //SPI片选。

2、模拟输入量

  • AIN0靠滑动变阻器分压变化;
  • AIN1靠热敏电阻NTC分压,温度变化电阻变化,导致分压变化;
  • AIN2靠光敏电阻分压。

五、ET2046芯片SPI时序分析

1、时序图

在这里插入图片描述

2、SPI写时序代码实现

void Et2046_Wirte_Data(unsigned char dat)
{
	unsigned char i;
	CLK = 0;
	_nop_();
	for(i = 0; i < 8; i++)
	{
		DIN = dat >> 7;               //先传高位
		dat <<= 1;                    //将低位移到高位
		CLK = 0;                     
		_nop_();
		CLK = 1;                      //CLK产生一个上升沿,写入数据
		_nop_();
	}
}

3、SPI读时序代码实现

unsigned int Et2046_Read_Data(void)
{
	unsigned int value = 0;
	unsigned char i;
	CLK = 0;
	_nop_();
	for(i = 0; i < 12; i++)         //12位AD,每次读取一位
	{
		value <<= 1;                 //注意该条语句放置的位置
		CLK = 1;
		_nop_();
		CLK = 0;                     //CLK由高到低产生一个下降沿,从而读取数据
		value |= DOUT;               //先读取高位
	}
	return value;
}

4、ET2046读取采样代码实现

unsigned int Et2046_Read_Adc_Value(unsigned char cmd)
{
	unsigned int adc_result = 0;
	unsigned char i = 6;
	CLK = 0;
	CS = 0;                                     //使能ET2046
	Et2046_Wirte_Data(cmd);
	while(i) i--;
	CLK = 1;                                    //发送一个时钟,清除BUSY
	_nop_();
	CLK = 0;
	adc_result = Et2046_Read_Data();
	CS = 1;                                     //关闭ET2046
	return adc_result;
}

5、一些宏定义

#define CMD_READ_AIN0 0x94          //电位器
#define CMD_READ_AIN1 0xD4          //NTC
#define CMD_READ_AIN2 0xA4          //光敏电阻
#define CMD_READ_AIN3 0xE4          //外部输入

sbit DOUT = P3^7;	  //输出
sbit CLK  = P3^6;	  //时钟
sbit DIN  = P3^4;	  //输入
sbit CS   = P3^5;	  //片选

六、D/A转换

1、基本概念

  1. 概念
    数模转换器,又称D/A转换器,简称DAC,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它是把连续的模拟信号转变为离散的数字信号的器件。

  2. 应用
    函数信号发生器、数字转换模拟参考信号

2、开发板原理图

在这里插入图片描述
1、通过PWM1的占空比,经过运放的积分电路,会生成不同的电压;
2、这里勉强算是一个DA,可以通过定时器和IO输出来实现,故代码省略。

总结

1、本节介绍了A/D,D/A转换的相关概念;
2、重点介绍并代码实现了SPI的时序;
3、定义局部变量的时候,最好先初始化为0;
4、简单介绍了DA实现的原理。

  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值