模数转换器就是将模拟输入量转换成离散的数字量输出;有四个过程,分别是——采样、保持、量化、编码;比较关注转换速率和分辨率;还有AD转换器的分类等等……俺也不知道哈哈哈哈哈哈哈哈哈
百度百科——模数转换
模数转换原理
AD转换基础知识
ADC083x数据表:ADC083x datasheet
根据这个数据手册,可以知道ADC083x系列不同的地方在于通道的不同,0831只有一个通道,故不需要DI输入通道选择;0832有CH0和CH1;0834有CH0、CH1、CH2、CH3;
ADC0831先启动数据转换,然后根据数据手册,过一定时钟周期,就能输出数据(MSB在前):
图2紫色框对应图1内容,图1的①②③在下面代码有注释,ADC0831的驱动程序如下:
unsigned char ad_conv(void){
unsigned char i,com;
//①
CS=1;
CLK=0; _nop_(); _nop_();
//②
CS=0; _nop_(); _nop_();//CS置低,启动转换
CLK=1; _nop_(); _nop_();
//③
CLK=0; _nop_(); _nop_();//第一个下降沿,准备输出数据
CLK=1; _nop_(); _nop_();
//采集数据
for(i=8;i>0;i--){
CLK=0; //第二至九个下降沿
com<<=1;//左移,先采最高位
if(DO)com=com|0x01;//采当前数据
CLK=1;
_nop_();
_nop_();
}
CS=1;
return com;
}
Proteus中加入AT89C52、ADC0831、数码管显示、光强传感器,仿真结果如下:
ADC0834有四个通道,需要通过DI端口在不同的时钟周期输入不同的数据来实现端口的选择,见下图:
首先要在4个上升沿,通过DI端口输入4个信号,表示开始转换、选择极性、选择通道;
根据时序图得到ADC0834的驱动程序:
unsigned char ad_conv1(void){
unsigned char i,com;
CS=1;
CS=0; _nop_(); _nop_();//CS置低,启动转换
CLK=0; _nop_(); _nop_();
//选择通道——根据Table4 修改DI值,选择不同的通道
//以下代码是选择的CH3
//上升沿1——start bit
DI=1; _nop_(); _nop_(); //启动,准备输出数据
CLK=1; _nop_(); _nop_();
CLK=0; _nop_(); _nop_();
//上升沿2——SGL/DIF
DI=1;
CLK=1; _nop_(); _nop_();
CLK=0; _nop_(); _nop_();
//上升沿3——ODD/SIGN
DI=1;
CLK=1; _nop_(); _nop_();
CLK=0; _nop_(); _nop_();
//上升沿4——SELECT
DI=1;
CLK=1; _nop_(); _nop_();
//下降沿 准备开始采集数据
DI=1;
CLK=0; _nop_(); _nop_();
CLK=1; _nop_(); _nop_();
for(i=8;i>0;i--){
CLK=0; //下降沿 采集数据
com<<=1;//左移,先采最高位
if(DO)com=com|0x01;//采当前数据
CLK=1;
_nop_();
_nop_();
}
CS=1;
return com;
}
仿真如下:
选择通道CH3就是光强传感器,通过LM016L显示。
哈哈哈哈哈……(结束!✌