欣欣学习网,老工程师带你学习单片机技术,欢迎来坐坐。
首  页 | 学习NIOSII | 学习C51 | 学习CPLD | 51+CPLD实验板 | | | MY-RTOS

 实验板首页
 安装QuartusII软件
 安装USB-Blaster驱动
 安装CH340C驱动
 安装Keil uVision软件
 运行Hello World例程
 新建Keil uVision工程
 在Flash中运行程序
 恢复CPLD中的出厂逻辑
 安装调试代理程序
 硬件架构分析
 实现LCD驱动接口
 实现数码管驱动接口
 实现4x2键盘接口
 使用ADC采集拟量
 使用EEPROM保存数据
 使用UART通信
 红外遥控信号解码
 用作USB转232/485
 相关软件与文档


使用ADC采集模拟量


实验板上集成TI公司的8bit逐次逼近式数模转换器(ADC)--TLC0832。

图(1)

该ADC有如下特性:

1. 转换分辨率为8位

2. 单一5V电源供电

3. 两路单端模似信号输入,或一路差分信号输入

4. 模似输入信号的电压范围为0V - 5V

5. 数字输入、输出信号兼容TTL和CMOS标准

6. 最高时钟频率600KHz,对应的模数转换时间为13.3uS

7. 失调误差为 +/-1 LSB

模数转换器TLC0832和单片机之间采用4线的SPI接口,其时序如图(2)所示。

图(2)

S1S0通道数输入方式CH0CH1
001差分+-
011差分-+
102单端输入 
112单端 输入

表(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 ----> CS

P1.5 <---- DO

P1.6 ----> DI

P1.7 ----> CLK

注:P1.4兼做AT24CXX的WP信号,所以ADC和AT24CXX不能在同一时间访问。

对应的ADC示例代码如下:

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;      // 以便在数码管上看到采集的结果
          

完整的范例程序可点击 这里 下载,范例程序的使用方法可参见:Hello World 程序




管理员信箱: stonewayqi@hotmail.com

欣 欣 学 习 网

粤ICP备2023138008号