AD/DA(模数数模转换)

本文介绍了模数转换器ADC和数模转换器DAC的基本原理,重点讲解了ADC0809和DAC0832这两种老器件以及XPT2046的性能指标和使用实例,涉及AD读取电阻值和使用DAC实现简单呼吸灯的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

模数转换,即Analog-to-Digital Converter,常称ADC,是指将连续变量的模拟信号转换为离散的数字信号的器件,比如将模温度感器产生的电信号转为控制芯片能处理的数字信号0101,这样ADC就建立了模拟世界的传感器和数字世界的信号处理与数据转换的联系。反之,能把数字信号转换为模拟信号的电路称为数模转换器 (Digital to Analog Converter,简称为DAC或D/A转换器)


`

一、介绍部分

介绍AD/DA

硬件电路模型

在这里插入图片描述

硬件电路

ADC模块

在这里插入图片描述

DAC模块

在这里插入图片描述

这里以两个老器件学习

ADC0809

在这里插入图片描述

DAC0832

在这里插入图片描述

运算放大器(运放)

理想的运放电路分析有两大重要原则贯穿始终,即“虚短”与“虚断”。
“虚短”的意思是正端和负端接近短路,即V+=V-,看起来像“短路”;
“虚断”的意思是流入正端及负端的电流接近于零,即I+=I-=0,看起来像断路(因为输入阻抗无穷大)

在这里插入图片描述

运放电路

在这里插入图片描述
在这里插入图片描述

DA原理

两种不同的DA转换器

在这里插入图片描述

两个滤波器效果更好,让留下的直流点电更平滑

在这里插入图片描述

AD原理

逐次逼近:对8位依次判断,若小于这个值则置0判断下一位,若大于这个值则置1继续判断下一位

在这里插入图片描述

部分AD/DA性能指标

在这里插入图片描述

XPT2046介绍

主要功能

在这里插入图片描述

XPT2046时序结构

上升沿写入,下降沿输出

在这里插入图片描述

控制字节解释

本单片机AD为单端模式
在这里插入图片描述

详解
在这里插入图片描述

单端模式配置表

在这里插入图片描述

二、实例

使用AD读取单片机上四种电阻的值

配置XPT2046.c

#include <REGX52.H>
#include "Delay.h"

// 引脚定义
sbit XPT2046_CS = P3^5;
sbit XPT2046_DCLK = P3^6;
sbit XPT2046_DIN = P3^4;
sbit XPT2046_DOUT = P3^7;

/**
   * @brief		XPT2046读取ad
   * @param		Command 写入的命令地址
   * @retval	ADValue 返回的AD值
   */
unsigned int XPT2046_ReadAD(unsigned char Command){
	unsigned int ADValue = 0;
	unsigned char i;
	XPT2046_DCLK = 0;
	XPT2046_CS = 0;
	for(i=0;i<8;i++){
		XPT2046_DIN = Command & (0x80 >> i);		// 写入命令
		XPT2046_DCLK = 1;			// 高电平写入
		XPT2046_DCLK = 0;			// 复位
	}
	// Delayms(1);							// 时序忙等时间
	for(i=0;i<16;i++){
		XPT2046_DCLK = 1;	
		XPT2046_DCLK = 0;		
		if(XPT2046_DOUT){
			ADValue |= (0x8000>>i);
		}
	}
	XPT2046_CS = 1;						// 结束时序
	if(Command & 0x08){
		return ADValue>>8;
	}else{
		return ADValue>>4;
	}
}

主函数测试

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

unsigned int ADValue;
void main(){
	LCD_Init();
	LCD_ShowString(1,1,"ADC");
	while(1){
		ADValue = XPT2046_ReadAD(XPT2046_XP_12);
		LCD_ShowNum(2,1,ADValue,4);
		ADValue = XPT2046_ReadAD(XPT2046_YP_12);
		LCD_ShowNum(2,6,ADValue,4);
		ADValue = XPT2046_ReadAD(XPT2046_VBAT_12);
		LCD_ShowNum(2,11,ADValue,4);
		ADValue = XPT2046_ReadAD(XPT2046_AUX_12);
		LCD_ShowNum(1,11,ADValue,4);
		Delayms(100);
	}
}

使用DA实现呼吸灯

大部分情况可以直接使用PWM代替DA,所以应用并不广泛

#include <REGX52.H>
#include "Delay.h"
#include "Time0Init.h"

sbit DA = P2^1;

unsigned char Counter,Compare;	// 周期、比较值
unsigned char KeyNum,i;
void main(){
	Time0_Init();
	while(1){
		for(i=0;i<100;i++){
			Compare = i;
			Delayms(10);
		}
		for(i=100;i>0;i--){
			Compare = i;
			Delayms(10);
		}
	}
}

// 中断函数
void Timer0_Routine() interrupt 1
{	
	TL0 = 0xA4;				//设置定时初始值
	TH0 = 0xFF;				//设置定时初始值
	Counter++;
	// 设置周期
	if(Counter>=100){
	  Counter = 0;
	}	
	//	与比较值进行比较
	if(Counter<Compare){
		DA = 1;			// 给电
	}else{
		DA = 0;			// 不给电
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值