文章目录
- 前言
- 一、介绍部分
- 介绍AD/DA
- 硬件电路模型
- 硬件电路
- ADC模块
- DAC模块
- ADC0809
- DAC0832
- 运算放大器(运放)
- 运放电路
- DA原理
- 两种不同的DA转换器
- AD原理
- 部分AD/DA性能指标
- XPT2046介绍
- 主要功能
- XPT2046时序结构
- 控制字节解释
- 单端模式配置表
- 二、实例
- 使用AD读取单片机上四种电阻的值
- 配置XPT2046.c
- 主函数测试
- 使用DA实现呼吸灯
前言
模数转换,即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; // 不给电
}
}