51单片机学习记录-13-AD/DA 模数/数模转换(SPI通信)

1 AD/DA介绍

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

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

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

2 硬件电路模型

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

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

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

AD只能读取电压,对电压进行转化,下方电阻变化会影响连接AD点的变化,然后通过AD转化为数字量,模拟量与数字量成正比

DA通过单片机输出一个数字量,然后DA处理为模拟量

3 硬件电路

(1)ADC模块

运用触摸屏,串行通信

PCF8591芯片(I2C总线)

IN共8路开关通过ADDx三个引脚选择一道进入。上方START开始转化,EOC转化结束,CLOCK时钟信号。通过AD转化为电信号,再通过锁存器进行输出缓存,最后通过OE输出使能把8位数据输出

(2)DAC(PWM)模块

用P21端口输出PWM波形

DAC0832芯片

右图左上方输入8位数据,经过两个缓存器,在经过DA转换器再输出

1 运算放大器

运算放大器(简称“运放”)是具有很高放大倍数的放大电路单元。内部集成了差分放大器、电压放大器、功率放大器三级放大电路,是一个性能完备、功能强大的通用放大电路单元,由于其应用十分广泛,现已作为基本的电路元件出现在电路图中

运算放大器可构成的电路有:电压比较器、反相放大器、同相放大器、电压跟随器、加法器、积分器、微分器等

运算放大器电路的分析方法:虚短、虚断(负反馈条件下)

2 运放电路

2.1 电压比较器

        

        

        若IN+>IN-则输出VCC,若IN+<IN-则输出GND

2.2 反向放大器

        

        

        如果没有反馈,功能为比较器,+>-则输出+,+<-则输-

        若IN为0.1V,则->+,输出-的最大,-的最大通过R2进行反馈,相当于下拉抑制0.1V,使0.1V下降,下降到0V以下时-<+,就把电压上拉,不断进行最后达到稳态(会造成虚短和虚断)

2.3 同向放大器

        

        

2.4 电压跟随器

        

        

        提高驱动能力

3 DA原理

(1)T型电阻网络DA转换器:用开关量输出模拟信号

D0-D7为8位输入数字量,给高电平,开关0接左1接右,最后是放大器输出

Rfb为反馈电阻,连接到-端,若V+=V-,则两端接在GND,不影响上方网络

每个支路电阻都为2R,所有总阻值为R。I1=2I0,每个左边的电流都为右边的二倍,I7=128I0

若开关置1,所有电流加到输入电流I,I=2I7=256I0,则I0=I/256。I=Vref/R,则I0=Vref/(256R)

(2)PWM型DA转换器:

R1与C1组成RC滤波器,接GND为低通滤波器,可以过滤交流分量,剩下直流分量,再加个电压跟随器,最后输出DA

4 AD原理

逐次逼近型AD转换器:

信号通过选择开关进入经过比较器,通过DAC输出已知电压比对,使未知信号与已知信号接近相等,间接得知未知信号的数字量,最后通过输出缓存器输出电压

5 AD/DA性能指标

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

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

6 XPT2046(4线制电阻式触摸屏控制器)

7 XPT2046时序

SPI通信:

CS片选,DCLK时钟,DIN(MISO)数据输入,DOUT(MOSI)数据输出(DCLK,DIN,DOUT可共用,通过CS片选)

首先片选CS拉低,其次DCLK上升沿输入下降沿输出,最后结束CS拉高

程序源码 AD

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

unsigned int ADValue;

void main(void)
{
	LCD_Init();
	LCD_ShowString(1,1,"ADJ  NTC  GR");
	while(1)
	{
		ADValue=XPT2046_ReadAD(XPT2046_XP);		//读取AIN0,可调电阻
		LCD_ShowNum(2,1,ADValue,3);				//显示AIN0
		ADValue=XPT2046_ReadAD(XPT2046_YP);		//读取AIN1,热敏电阻
		LCD_ShowNum(2,6,ADValue,3);				//显示AIN1
		ADValue=XPT2046_ReadAD(XPT2046_VBAT);	//读取AIN2,光敏电阻
		LCD_ShowNum(2,11,ADValue,3);			//显示AIN2
		Delay(100);
	}
}
XTP2046.c
#include <REGX52.H>
#include <INTRINS.H>

//引脚定义
sbit XPY2046_DIN=P3^4;
sbit XPY2046_CS=P3^5;
sbit XPY2046_DCLK=P3^6;
sbit XPY2046_DOUT=P3^7;

/**
  * @brief  ZPT2046读取AD值
  * @param  Command 命令字,范围:头文件内定义的宏,结尾的数字表示转换的位数
  * @retval AD转换后的数字量,范围:8位为0~255,12位为0~4095
  */
unsigned int XPT2046_ReadAD(unsigned char Command)
{
	unsigned char i;
	unsigned int Data=0;
	XPY2046_DCLK=0;
	XPY2046_CS=0;
	for(i=0;i<8;i++)
	{
		XPY2046_DIN=Command&(0x80>>i);
		XPY2046_DCLK=1;
		XPY2046_DCLK=0;
	}
	for(i=0;i<16;i++)
	{
		XPY2046_DCLK=1;
		XPY2046_DCLK=0;
		if(XPY2046_DOUT){Data|=(0x8000>>i);}
	}
	XPY2046_CS=1;
	return Data>>8;
}

程序源码 DA

main.c
#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"

sbit DA=P2^1;

unsigned char Counter,Compare;	//计数值和比较值,用于输出PWM
unsigned char i;

void main()
{
	Timer0_Init();
	while(1)
	{
		for(i=0;i<100;i++)
		{
			Compare=i;			//设置比较值,改变PWM占空比
			Delay(10);
		}
		for(i=100;i>0;i--)
		{
			Compare=i;			//设置比较值,改变PWM占空比
			Delay(10);
		}
	}
}

void Timer0_Routine() interrupt 1
{
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	Counter%=100;	//计数值变化范围限制在0~99
	if(Counter<Compare)	//计数值小于比较值
	{
		DA=1;		//输出1
	}
	else				//计数值大于比较值
	{
		DA=0;		//输出0
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值