35. AD_DA
- 35.1. AD/DA介绍
•AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号
•DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号
•AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理提供了可能
下图:光敏电阻,热敏电阻NTC,麦克风(驻极体话筒),扬声器(DA)
- 35.2. 硬件电路模型
•AD转换通常有多个输入通道,用多路选择开关连接至AD转换器,以实现AD多路复用的目的,提高硬件利用率
AD一般转换电压,一般正比关系0~5V等同数字量0~255数值(8位) ,
•AD/DA与单片机数据传送可使用并口(速度快、原理简单),也可使用串口(接线少、使用方便)(串口使用类似I2C传送)
•可将AD/DA模块直接集成在单片机内,这样直接写入/读出寄存器就可进行AD/DA转换,单片机的IO口可直接复用为AD/DA的通道(DA一般没有多路输出,例如PWM实现类似DA的功能)
-
35.3. 硬件电路
-
上图开发板上原理电路,右图PWM
-
上图ADC0809芯片和DAC0832芯片图
-
ADC0809介绍:START开始转换,EOC结束转换,CLOCK时钟信号,OE输出使能,ADDA~ADDC对应8路IN输入选择,A/D转换(内部核心转换电路)
-
DAC0832介绍:D0~D7是8位数字输入,8位输入寄存器+8位DAC寄存器构成多路输入;
-
35.4. 运算放大器
•运算放大器(简称"运放")是具有很高放大倍数的放大电路单元。内部集成了差分放大器、电压放大器、功率放大器三级放大电路,是一个性能完备、功能强大的通用放大电路单元,由于其应用十分广泛,现已作为基本的电路元件出现在电路图中
(一般三极管放大电路搭建麻烦,工作点很难稳定,没有什么驱动能力,带负载后压降很厉害,很复杂,运放作为通用模块)
(运放的特点,输入电阻很大,输出端有输出能力,内部放大倍数认为无穷大)
•运算放大器可构成的电路有:电压比较器、反相放大器、同相放大器、电压跟随器、加法器、积分器、微分器等
•运算放大器电路的分析方法:虚短、虚断(负反馈条件下)
(右侧LM358运放单元)
-
35.5. 运放电路
-
电压比较器:开环情况下使用,IN+>IN-则OUT=VCC,反之OUT=GND;因为放大的是输入的差值,利用放大倍数无穷大作为电压比较器;
-
反向放大器:放大倍数用R2与R1调整,例如输入V=0.1V进入放大器负,此时输出也为放大后的V-负值电压,反馈到输入端将原先0.1V拉低到零以下,此时放大器输出为放大后的V+正直电压。。。反复上述过程进入稳态输出为0.(用虚短原理,放大器输入正负都是接地,反向输入电阻无穷大没有电流流入,则VIN/R1+VOUT/R2=0,在放大器负极入口位置电流为0,由此得出VOUT=-(R2/R1)XVIN,反向放大,如果需要输出负的电压,就需要接正负双电源,如+12V/-12V, )
-
35.6. 运放电路
-
同向放大器:虚短的时候放大器的正极和负极短路,续断的情况放大器负极电流输入为0,则有放大器负极端对地的电流为VIN/R1,此电流与流过R2电流相同,则VOUT=VIN+VIN(R2/R1)=(1+R2/R1)XVIN,且为同向放大器,无需双电源;
-
电压跟随器:放大倍数为1,但有功率驱动的能力,VOUT=VIN,是同向放大器R1=无穷大的情况。
-
35.7. DA原理
•T型电阻网络DA转换器:
- DA转换具体电路
- 右侧放大器正极接地,根据虚短原理,V负=V正=GND,防止对放大器之前的电路产生影响;
- 上述原理图中最右侧两个2R的电阻为并联,并联后的阻值为R,再与I1流过的R串联,再与I1向下流入的2R并联后再与I2向右流过的R串联。。。经过计算最终I=Vref/R,但是I1=2xI0,I2=2xI1=4I0。。。最终I=2xI7=256xI0,实现对电流的类似2进制位权;
- 当2R下面的开关拨到0位置的时候,I接地,VO=0,相应2R下面开关置1的时候,相应位置的电流流向放大器反向输入端,结合Rfb构成反向放大电路,流入的电路I01为上述电阻开关置1后的电流值的汇总累加,实现类似256级电流值
-
上述公式需要加负号,反向放大电路;
-
35.8. DA原理
•PWM型DA转换器:
-
PWM信号:过R1与C1(低通滤波器),上图2阶低通滤波器,低通滤波器去除电路中的交流信号就只有直流信号了;
-
35.9. AD原理
- AD基本原理是用一个已知的电压和未知的电压(需要模拟的模拟量)进行比较,无限接近这个未知电压;
- AD逐次逼近的原理,每次取1/2,缩小范围;例如,对5V电压进行256位细分,则2.5V电压对应128,对应2进制1000 0000, 再比较电压如果比2.5V小,再对2.5V进行细分64,对应2进制0100 0000,如此反复从高到底确定输出的D,判断8次;就是逐次逼近的方法。
-
35.10. AD/DA性能指标
•分辨率:指AD/DA数字量的精细程度,通常用位数表示。例如,对于5V电源系统来说,8位的AD可将5V等分为256份,即数字量变化最小一个单位时,模拟量变化5V/256=0.01953125V,所以,8位AD的电压分辨率为0.01953125V,AD/DA的位数越高,分辨率就越高
•转换速度:表示AD/DA的最大采样/建立频率,通常用转换频率或者转换时间来表示,对于采样/输出高速信号,应注意AD/DA的转换速度
-
35.11. XPT2046
35.12. XPT2046时序
- SPI的通讯,CS片选,用于多设备通讯,独立走线;
- 三根线:CLK,DIN,DOUT
- 过程,先CS片选,上升沿输入,下降沿输出
36. AD模数转换&DA数模转换
-
36.1. 需要制作一个程序在LCD1602显示屏上面显示如下信息,LCD的第一行显示 ADJ, NTC, RG, 第二行显示对应的可调电阻, 光敏电阻和热敏电阻的阻值并实时更新,相当于将可调电阻,光敏电阻和热敏电阻的模拟量值转换为数字量值,实现AD转换,因为Proteus中暂时没有针对国产AD芯片XPT2046的仿真芯片,所以仅列出开发板测试程序;
-
36.2. 设计思路是先写出XPT2046的模块程序,返回芯片转换后的数值,然后在主程序中直接通过LCD1602显示;
-
XPT2046.c如下
#include <REGX52.H>
sbit XPT2046_CS=P3^5;
sbit XPT2046_DCLK=P3^6;
sbit XPT2046_DIN=P3^4;
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; XPT2046_DCLK=0; if(XPT2046_DOUT){ADVAlue|=(0x8000>>i);} } XPT2046_CS=1; if(Command&0x08) //判断是否是12位模式 { return ADVAlue>>8; //右移8位,否则右侧8位为0,共16位 } else { return ADVAlue>>4; }
}
-
XPT2046.h如下
#ifndef XPT2046_H
#define XPT2046_H#define XPT2046_XP_8 0x9c //X+路
#define XPT2046_YP_8 0xdc //Y+路
#define XPT2046_VBAT_8 0xac //Y+路
#define XPT2046_AUX_8 0xec //Y+路#define XPT2046_XP_12 0x94 //X+路
#define XPT2046_YP_12 0xd4 //Y+路
#define XPT2046_VBAT_12 0xa4 //Y+路
#define XPT2046_AUX_12 0xe4 //Y+路unsigned int XPT2046_ReadAD(unsigned char Command);
#endif
主程序为:
#include <REGX52.h>
#include "LCD1602.h"
#include "delay_xms.h"
#include "XPT2046.h"
unsigned int Advalue;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"ADJ NTC RG");
while(1)
{
Advalue=XPT2046_ReadAD(XPT2046_XP_8);
LCD_ShowNum(2,1,Advalue,3);
Advalue=XPT2046_ReadAD(XPT2046_YP_8);
LCD_ShowNum(2,5,Advalue,3);
Advalue=XPT2046_ReadAD(XPT2046_VBAT_8);
LCD_ShowNum(2,9,Advalue,3);
delay_xms(10);
}
}