|
使用ADC采集模拟量
|
|
实验板上集成TI公司的8bit逐次逼近式数模转换器(ADC)--TLC0832。 |
|
图(1) |
|
6. 最高时钟频率600KHz,对应的模数转换时间为13.3uS |
|
模数转换器TLC0832和单片机之间采用4线的SPI接口,其时序如图(2)所示。 |
|
图(2) |
S1 | S0 | 通道数 | 输入方式 | CH0 | CH1 |
0 | 0 | 1 | 差分 | + | - |
0 | 1 | 1 | 差分 | - | + |
1 | 0 | 2 | 单端 | 输入 | |
1 | 1 | 2 | 单端 | | 输入 |
表(1)
|
TLC0832的通信是从CS信号的下降沿开始的。由DI管脚输入的数据在CLK信号的上升沿被TLC0832采集,输出数据从DO管脚在CLK的下降沿被TLC0832送出。输入数据的第1个数据位代表起始位,高电平有效。第2个和第3个数据位是控制位,其逻辑值的含义见表(1)。输入数据从第4个数位开始为无效数据,TLC0832不予理会。 |
|
输出数的第1个数据位在CLK信号的第3个下降沿从DO管脚送出,该位为起始位,其逻辑电平为低电平。在CLK信号第4个下降沿送出转换结果的D7位,即最高位。在CLK信号接下来的几个下降沿处,依次送出转换结果的D6位-D0位,再依次送出转换结果的D1位-D7位。也就是,转换结果会以两种次序各传送1次,先是以MSB在前的次序传送1次,再以LSB在前的次序传送1次。需要注意的是,D0位只传1次。 |
|
在CS信号由低电平跳变为高电平后,输出端子DO变为高阻驱动,本次通信结束。整个模数转换过程是在通信期间同步完成的。TLC0832在CLK信号的第4个上升沿处启动模数转换。随后,在每个CLK信号的上升沿处都会有1个数据位被转换出来。转换出来的数据位,会在随后CLK信号的下降沿从DO管脚送出。直到将D0位转换并送出后,模数转换过程结束。如果在TLC0832以MSB次序传送转换结果期间就已经将数据接收并保存,则不必再等待后面的传输,可直接将CS信号拉到高电平,结束本次通信。 |
|
TLC0832直接由89C52管理,其通信管脚与89C52的连接方式如下: |
|
注:P1.4兼做AT24CXX的WP信号,所以ADC和AT24CXX不能在同一时间访问。 |
|
ADCK = 0; // 将CLK信号拉低,以便送出上升沿
ADCS = 0; // 将CS信号拉低,开始通信
ADDI = 1; // 将DI信号拉高,输入起始位
ADCK = 1; // 第1个CLK上升沿,送入起始位
ADCK = 0; // 第1个CLK下降沿
ADDI = 1; // 将DI拉低,令S1=0,模似信号单端输入
ADCK = 1; // 第2个CLK上升沿,将S1送入
ADCK = 0; // 第2个CLK下降沿
if(KEY != 0) ADDI = 1; // 根据有无按键按下,决定S0的值
else ADDI = 0; // 有按键按下,令S0=1,采信CH1的信号
// 没有,则令S0=0,采集CH0的信号
ADCK = 1; // 第3个CLK上升沿,将S0送入
ADCK = 0; // 第3个CLK下降沿
for(x = 0; x < 8; x ++) // 随后的8个CLK下降沿会有数据位送出
{ // MSB在前,D7 - D0
ADCK = 1; // CLK上升沿
ADCK = 0; // CLK下降沿
RdData <<= 1; // 将接收数据左移1位,准备接收新的数据位
if(ADDO != 0) // 如果DO送出的数据位是"1"则
RdData |= 0x01; // 将接收数据的最低位置"1"
} // 重复接收,直到8位都收到
ADCS = 1; // 将CS信号拉高,结束本次通信
dis[1] = RdData&0x0f; // 将采集的数据送到LED数码管的缓存
dis[0] = RdData>>4; // 以便在数码管上看到采集的结果
|
| |
|
|
|