介绍AD
AD转换(Analog to Digital Conversion,模数转换)是将连续的模拟信号转换为离散的数字信号的过程。这个过程在各种电子设备中都非常重要,特别是在涉及传感器、音频信号、视频信号等需要进行数字化处理的领域。
个人理解:就是将连续变换的函数,以离散的形式表达出来,(如正弦波转方波)。一般情况下就是单通道的模拟信号,转多通道的数字信号!
AD转换的主要步骤:
-
采样:
- 对模拟信号在特定的时间间隔进行采样。采样率是每秒采集的样本数,通常以赫兹 (Hz) 为单位表示。根据采样定理(奈奎斯特定理),采样率必须至少是信号最高频率的两倍,以避免混叠效应。
-
量化:
- 将采样得到的连续信号幅度值转换为离散的数值。量化会产生一个误差,称为量化误差,因为模拟信号是连续的,而数字信号是离散的。
-
编码:
- 将量化后的离散幅度值用二进制数字表示,以便在计算机中进行处理或存储。编码的精度取决于使用的位数,位数越高,表示信号的精度越高。
示例:
假设我们有一个音频信号,采样率为 44.1kHz(即每秒采集 44100 个样本),并使用 16 位来表示每个采样点的幅度。AD转换会定期从模拟音频波形中采样,将每个样本的幅度值量化为 16 位的数字,并以二进制形式表示。
关键概念:
- 采样率:决定了信号被捕获的频率。
- 量化精度:决定了信号幅度的精度,位数越高,信号越精确。
- 混叠:当采样率低于奈奎斯特频率时,高频信号会被错误地采样,导致失真。
通过AD转换,模拟信号可以被计算机处理或传输,从而应用在数字化处理任务中,如音频录制、图像处理、传感器数据采集等场景。
常见的的AD转化电路
通过驱动触摸屏的芯片来做AD(51单片机)
(自己查数据手册)
AD实验
#include "xpt2046.h"
#include "intrins.h"/*******************************************************************************
* 函 数 名 : xpt2046_wirte_data
* 函数功能 : XPT2046写数据
* 输 入 : dat:写入的数据
* 输 出 : 无
*******************************************************************************/
void xpt2046_wirte_data(u8 dat)
{u8 i;CLK = 0;_nop_();for(i=0;i<8;i++)//循环8次,每次传输一位,共一个字节{DIN = dat >> 7;//先传高位再传低位dat <<= 1;//将低位移到高位CLK = 0;//CLK由低到高产生一个上升沿,从而写入数据_nop_(); CLK = 1;_nop_();}
}/*******************************************************************************
* 函 数 名 : xpt2046_read_data
* 函数功能 : XPT2046读数据
* 输 入 : 无
* 输 出 : XPT2046返回12位数据
*******************************************************************************/
u16 xpt2046_read_data(void)
{u8 i;u16 dat=0;CLK = 0;_nop_();for(i=0;i<12;i++)//循环12次,每次读取一位,大于一个字节数,所以返回值类型是u16{dat <<= 1;CLK = 1;_nop_();CLK = 0; //CLK由高到低产生一个下降沿,从而读取数据_nop_();dat |= DOUT;//先读取高位,再读取低位。 }return dat;
}/*******************************************************************************
* 函 数 名 : xpt2046_read_adc_value
* 函数功能 : XPT2046读AD数据
* 输 入 : cmd:指令
* 输 出 : XPT2046返回AD值
*******************************************************************************/
u16 xpt2046_read_adc_value(u8 cmd)
{u8 i;u16 adc_value=0;CLK = 0;//先拉低时钟CS = 0;//使能XPT2046xpt2046_wirte_data(cmd);//发送命令字for(i=6; i>0; i--);//延时等待转换结果CLK = 1;_nop_();CLK = 0;//发送一个时钟,清除BUSY_nop_();adc_value=xpt2046_read_data();CS = 1;//关闭XPT2046return adc_value;
}