【STC单片机学习】第十六课:AD和DA转换

【朱老师课程总结 侵删】

第一部分、章节目录

1.16.1.AD转换及其相关背景知识

1.16.2.原理图和数据手册

1.16.3.结合例程分析时序

1.16.4.代码实践

1.16.5.串口直接显示电压值

1.16.6.DA转换


第二部分、章节介绍

1.16.1.AD转换及其相关背景知识1
    本节对整个课程做介绍,并且主要讲了模拟量和数字量这两个概念以及AD转换相关概念,
    主要是量程、精确度、分辨率、位数、转换速度等,并且举例说明了这些课程的联系。
1.16.2.原理图和数据手册
    本节看原理图、确定接线,并且对照数据手册查看其中的关键点。
1.16.3.结合例程分析时序
    本节重点分析数据手册中的时序图,并且通过对照官方例程来对比学习。
1.16.4.代码实践
    本节参考官方例程来建立工程、写时序代码,通过 ADC 转换电路采集电位器电压值,将采集转换后的 AD 值通过串口显示。
1.16.5.串口直接显示电压值
    本节对串口输出部分进行调整,使之直接显示电压值,这种方式可以使调试和输出更加直观
1.16.6.DA转换
    本节讲解DA转换的概念,以及开发板原理图中DA转换的演示原理、实例代码等。

第三部分、随堂记录

1.16.1.AD转换及其相关背景知识

1.16.1.1、基本概念
(1)什么是AD转换?A(A,analog,模拟的,D,digital,数字的<二进制的>)

  • 模拟量:现实世界是模拟的,连续分布的,无法被分成有限份;例如,声音、电压、温度、电流等
  • 数字量:计算机能够处理的物理量,计算机世界是数字的,离散分布的,是可以被分成有限份的;
  • AD转换就是从模拟量转化成数字量。例如:电压在现实中是个连续量,在计算机中是个数字量,只不过精度不一样!
  • 下面这张图介绍了AD和DA转换
  • 实现AD转换的电路叫作模数转换器,也是ADC(Analog-digital converter)

(3)什么情况下需要AD转换?
就是我们研究数据是模拟量的时候,比如说:重力、温度、声音等等

1.16.1.2、AD转换中的主要概念

(1)数字位数:模拟量转换成的数字量用多少位二进制数表示。位数越多精度越高,位数越少表示的精度就越低。
(2)量程:模拟量输入范围,模拟量的范围是AD芯片本身的一个参数。实际工作时给AD的电压信号不能超过这个电压范围。
(3)分辨率,数字位数越多,则每个格子表示的电压值越小,将来算出来的模拟电压值就越精确,分辨率越高。

  • 分辨率 = 量程/(2^位数)

(3)精度,简单理解就是转换出来到底有多准,这个和数字位数有关联,精度越高,说明转换之后的数字量越接近于模拟量。

(5)转换速率,AD转换的时间
举个栗子:
输入电压范围0-5V,假设AD转换输出数字位数是10(把整个范围分成了1024个格子),则精度是0.1V量程为0-5V分辨率为:(5-0)/1024=0.00488V
譬如一次AD转换后得到的数字量是1010101010(682),则对应的电压值为:0.00488*682=3.32816V,考虑精度后为3.3V

1.16.1.3、AD转换的原理

  • 在 A/D 转换器中,因为输入的模拟信号在时间上是连续的,而输出的数字信号代码是离散的,所以 A/D 转换器在进行转换时,必须在一系列选定的瞬间(时间坐标轴上的一些规定点上)对输入的模拟信号采样,然后再把这些采样值转换为数字量。
  • 所以A/D转换要经历“采样保持—量化—编码”三个步骤!

(1)采样定理
采样脉冲频率为fs,输入模拟信号x(t)频率为fmax,必须满足

才能保证输出的数字信号y(t)不失真!

通常fs=(2.5-3)fmax,因为每次把采样电压转换为相应的数字量都需要一定的时间,所以在每次采样以后,必须把采样电压保持一段时间。

(2)量化
任何一个数字量的大小,都是以某个最小数量单位的整倍数来表示的。因此,在用数字量表示模拟量时,也必须把它化成这个最小数量单位的整倍数,这个转化过程就叫做量化。

  • 最小数量单位叫作量化单位,用△表示
  •  既然模拟电压是连续的,那么它就不一定能被△整除,因而不可避免地会引入误差,我们把这种误差称为量化误差。在把模拟信号划分为不同的量化等级时,用不同的划分方法可以得到不同的量化误差。


一种量化单位是1/8,量化误差达△
一种量化单位是2/15,量化误差达△/2

(3)编码
n个二进制数,可以表示2^n个量化级。上面两种量化方法,量化级都是8,所以都用三位二进制数编码!

1.16.1.4、AD转换在系统中存在的方式
(1)CPU外部扩展专用AD芯片
(2)CPU内部集成AD模块(内部外设)

  • 有的单片机直接就有模拟引脚,在内部进行AD转换!

STC51单片机是外部拓展了专用的AD芯片XPT2046 

1.16.2.原理图和数据手册

1.16.2.1、原理图和接线
ADC模块原理图:

芯片详细介绍看数据手册!xpt2046中文数据手册

(1)ADC模块和MCU接线
为了方便接线,接线如下:

  • CLK接P1.3:时钟信号输入
  • CS接P1.2  :低电平有效
  • DI接P1.1   :用于输入控制命令
  • DO接P1.0 :输出转化后的数字信号

这里相当于把三线式IO变成了DI和DO,CE变成了CS片选

(2)3种模拟电压变化原理

  • AINx是模拟输入接口,通过选择哪一路输入可以选择VBAT 、Temp和AUX三种信号输入模式,经过片内的控制寄存器选择后进入ADC.
    根据上面原理图,不难看出:
  • AIN0(X+)靠滑动变阻器控制电压变化
  • AIN1(Y+)靠热敏电阻NTC
  • AIN2(VBAT)靠光敏电阻

1.16.2.2、数据手册

MCU通过DI向ADC模块发送控制字节,用来启动转换,寻址,设置 ADC 分辨率,配置和对XPT2046 进行掉电控制,转换后通过DO口输出给MCU

控制字节数据格式:

  • bit7:起始位S——必须为1
  • bit6-4:地址——(A2、A1 和 A0)选择多路选择器的现行通道(AIN0、AIN1、AIN2、AIN3)
引脚

A2 A1 A0

对应模式
AIN0 001/011 X+ 滑动变阻器控制电压
AIN1 101 Y+ 热敏电阻NTC
AIN2 010 VBAT 靠光敏电阻
AIN3 110 AUXIN 

                  

  • bit3:模式选择位——设置采样位数。0表示12bit,1表示8bit,一般都用12bit
  • bit2:控制参考源模式——为1表示用单端模式,为0表示差分模式。此处用单端模式
  • bit1-0:power down模式使能,00表示使能。当PD0=0时,A2A1A0 = 011,不能再选择滑动变阻器控制电压
控制位命令初始值
7 6 5 4 3 2 1 0
1 x x x 0 1 0 0


于是我们不难得出,我们可以通过DI发送如下控制命令:

  • 读AIN0:0b10010100    = 0x94    
  • 读AIN1:0b11010100    = 0xD4    
  • 读AIN2:0b10100100     = 0xA4
  • 读AIN3:0b11100100    = 0xE4

1.16.3.结合例程分析时序

1.16.3.1、时序图



(1)这个时序和SPI通信-DS1302如出一辙:链接
(2)读写(和DS1302一样)

  • 上升沿MCU写入XPT2406,先放数据,再给上升沿
  • 下降沿MCU从XPT2406读出,在下降沿之后就可以读取到数据

(3)读写都是高位在前
(4)注意写和读的交接点BUSY时间段

  • 用于采样保持—量化—编码
  • 给个延时就行了!

1.16.3.2、官方例程分析
\51例程\22、AD和DA\数码管显示AD值\电位器AD值

(1)写指令SPI_Write
(2)读12位数字值SPI_Read
(3)写+读形成一个完整AD转换周期:Read_AD_Data,读取的是数字量

1.16.4.代码实践

分别使用三种信号输入模式,通过串口打印,观察得到的AD值

1.16.4.1、参考例程写代码
1.16.4.2、添加串口输出调试
1.16.4.3、实践
(1)电位器做模拟量输入源
(2)热敏电阻做模拟量输入源
(3)光敏电阻做模拟量输入源

1.16.5.串口直接显示电压值

1.16.5.1、关键点
(1)直接显示电压值,而不是采样AD值

  • 电压值 = (AD_Val/4096)*5000mV = 1.22*val mV
  • 上面的电压值本质上还是AD值,要转成对应的ASCII码再去发送
    void uart_send_vol(u16 val)
    {
    	float index = 1.22;
    	float voltage = index * (float)val;
    	u16 vol_display = (u16)voltage;
    	
    	u8 str[4];
    	u8 i = 0;
    	
    	//取出个十百千位
    	for(i = 0;i<4;i++)
    	{
    		str[i] = vol_display%10;
    		vol_display = vol_display/10;
    	}
    	
    	for(i = 0;i<4;i++)
    	{
    		uart_send_byte(str[3-i]+48);
    		if(i==0)
    		uart_send_byte('.');
    		_nop_();
    	}
    	uart_send_byte('V');
    }
    

(2)以文本方式显示,而不是十六进制方式

完整程序:AD串口打印 

1.16.6.DA转换

1.16.6.1、DA转换相关概念
(1)何为DA转换
数字量——>模拟量
(2)DA转换的意义和用途(函数信号发生器)
(3)DA转换的原理

数字量是二进制代码数位组合而来的,每位都有一定的权重,在D/A转换中,怎么样把这些权重以合适的方法表示出来是转换的关键为了让数字量转换成模拟量,必须将每一位代码按其权重的大小转换为相应的模拟量,然后再把这些模拟量相加。D/A转换的示意图如下:
在这里插入图片描述

即输入相应的二进制数,得出一个模拟量的输出,而作为一个三位的转换,模拟量与数字量的对应关系可以用下图来表示。在右图中D分别对应了相应的V0​
在这里插入图片描述

1.16.6.2、原理图和案例分析

(1)运算放大器(放大+隔离)
(2)PWM数字信号
(3)其实不接LM358,直接用IO口连接LED实验现象也一样的
(4)真正的DA一般是专用芯片或者CPU内置模块,给数字值输出平滑模拟量

本节课程序下载链接:AD转换

本节课结束!

猜你喜欢

转载自blog.csdn.net/qq_27148893/article/details/110450835