第二版重点修改了有关知识点的叙述,尽量实用和简洁,删除了部分不经常用的器件的叙述,增加了部分实用项目的关键技术例程及解读,对TI公司具有无线通信功能的51单片机进行了简单的介绍。书中C51的介绍着重在与标准C语言的不同之处,读者应该在具备一定C语言编程知识的基础上阅读本书内容。书中大部分章节附有习题,以供读者练习。本书附件提供教学用PPT、实验的源代码的电子文档,供读者参考。
单片微型计算机简称单片机,是典型的嵌入式微控制器。随着电子技术的飞速发展,目前的单片机已经集成了A/D、D/A转换器,存储器,I2C,CAN、SPI总线接口及一些专用外设,形成了SoC(System on Chip)型的单片机,或称为系统级芯片,也有称片上系统,在工业控制、机电一体化、通信终端、智能仪表、家用电器等诸多领域中得到了广泛应用,已成为传统机电设备进化为智能化机电设备的重要手段。因此高等理工科院校师生和工程技术人员了解和掌握SoC型的单片机原理和应用技术是十分必要的。
目前单片机已经形成很多种类,C8051F系列单片机就是一种典型的SoC型单片机,原是Cygnal公司的产品,该公司于2003年并入Silicon Laboratories公司。C8051F系列单片机具有与MCS51完全兼容的指令内核,采用流水线处理(pipe line)技术,不再区分时钟周期和机器周期,能在执行指令期间预处理下一条指令,提高了指令执行效率。而且大部分C8051F单片机具备控制系统所需的模拟和数字外设,包括看门狗、ADC、DAC、电压比较器、电压基准输出、定时器、PWM、定时器捕捉和方波输出等,并具备多种总线接口,包括UART、SPI、SMBUS(与I2C兼容)总线以及CAN总线等。C8051F系列单片机采用Flash ROM技术,集成JTAG,支持在线编程和调试。C8051F系列单片机诸多特点和优越性,使其广受单片机系统设计工程师青睐,成为很多测控系统设计的首选机型。
本书以C8051F020为讲述对象,是因为该单片机为C8051F系列单片机中功能较全、*具有代表性的一款。熟悉了C8051F020单片机工作原理和编程方法后,可较快地对C8051F系列的其他单片机上手编程。事实上,模拟和数字外设以及各种总线具有共性,因而本书也可作为其他厂商单片机的参考资料,书中例程稍加修改,即可应用于其他单片机。而且本书大部分代码采用C51语言编写,这也是单片机应用的发展方向,同时增强了程序的可读性和可移植性。
书中对于C51的介绍着重在与标准C语言的不同之处,读者应该在具备一定C语言编程知识的基础上阅读本书内容。书中大部分章节附有习题,以供读者练习。本书配套提供教学用PPT、实验的源代码的电子文档(请访问清华大学出版社网站获取),供读者参考。
此次再版重点修改了有关知识点的叙述,尽量实用和简洁,删除了部分不经常用的器件的叙述,增加了部分实用项目的关键技术例程及解读,对TI公司具有无线通信功能的51单片机进行了简单的介绍。
本书由鲍可进担任主编,书中第1章、第2章、第5章由鲍可进编写,第4章由赵念强编写,第3章由赵念强、申屠浩编写、第6章由申屠浩、赵念强编写、第7章由陈向益、鲍可进编写、第8章由陈向益编写,鲍可进对全书进行了修改并统稿。
在编写过程中,我们参考了有关书刊、资料,在此对有关作者一并表示感谢。
由于水平有限,书中不妥之处在所难免,恳请读者批评指正。
编者
2016年9月
第5章
模/数和数/模转换器
A/D转换器简写为ADC(Analog to Digital Converter),是一种能把模拟量转换成相应的数字量的电子器件。D/A转换器简写为DAC(Digital To Analog Converter),与A/D转换器相反,它能把数字量转换成相应的模拟量。在单片机控制系统中,经常需要用到A/D和D/A转换器。它们的功能及其在实时控制系统中的地位如图51所示。由图可见,被控实体的过程信号可以是电量(如电流、电压等),也可以是非电量(如温度、压力、传速等),其数值是随时间连续变化的。各种模拟量都可以通过变送器或传感器变换成相应的数字量送给单片机。单片机对过程信息进行运算和处理,把过程信息进行当地显示或打印等,同时将处理后的数字量送给D/A转换器,转换成相应的模拟量去对被控系统进行控制和调整,使系统处于*佳工作状态。
图51单片机实时控制系统示意图
上述分析表明: A/D转换器在单片机控制系统中主要用于数据采集,向单片机提供被控对象的各种实时参数,以便单片机对被控对象进行监视和控制决策; D/A转换器用于模拟控制,通过机械或电气手段对被控对象进行调整和控制。因此,A/D、D/A转换器是架设在单片机和被控实体之间的桥梁,在单片机控制系统占有极其重要的地位。
C8051F020是混合信号型单片机,在片内集成了模/数(A/D)和数/模(D/A)转换电路。下面分别进行叙述。
5.1模/数转换器
A/D是将模拟量转换成数字量的器件。模拟量可以是电压、电流等电信号,也可以是声、光、压力、湿度、温度等随时间连续变化的非电的物理量。非电的模拟量可通过合适的传感器(如光电传感器、压力传感器、温度传感器)转换成电信号。
C8051F020片内包含一个9通道的12位的模数转换器ADC0和8通道8位的模数转换器ADC1。
5.1.1模数转换原理和性能指标
1. 转换原理
A/D转换器的种类很多,根据转换原理可以分计数式、并行式、双积分式、逐次逼近式等。计数式A/D转换器结构简单,但转换速度也很慢,所以很少采用。并行A/D转换器的转换速度*快,但因结构复杂而造价较高,只用于那些转换速度极高的场合。双积分式A/D转换器抗干扰能力强,转换精度也很高,但速度不够理想,常用于数字式测量仪表中。计算机中广泛采用逐次逼近式A/D转换器作为接口电路,它的结构不太复杂,转换速度也较高。下面仅对逐次逼近式和双积分式A/D转换器的转换原理作简单介绍。
图52逐次逼近式A/D原理框图
1) 逐次逼近式A/D转换器
逐次逼近式A/D也称逐次比较法A/D。它由结果寄存器、D/A、比较器和置位控制逻辑等部件组成,原理框图如图52所示。
这种A/D采用对分搜索法逐次比较、逐步逼近的原理来转换,整个转换过程是个“试探”过程。控制逻辑先置1结果寄存器*高位Dn-1然后经D/A转换得到一个占整个量程一半的模拟电压Vs,比较器将此Vs和模拟输入电压Vx比较,若Vx>Vs则保留此位Dn-1(为1),否则清0Dn-1位。然后控制逻辑置1结果寄存器次高位Dn-2,连同Dn-1一起送D/A转换,得到的Vs再和Vx比较,以决定Dn-2位保留为1还是清0,以此类推。*后,控制逻辑置1结果寄存器*低位D0,然后将Dn-1、Dn-2、……、D0一起送D/A转换。转换得到的结果Vs和Vx比较,决定D0位保留为1还是清0。
至此,结果寄存器的状态便是与输入的模拟量Vx对应的数字量。
2) 双积分式的A/D转换器
双积分式也称二重积分式,其实质是测量和比较两个积分的时间,它的工作原理如图53所示,一个是对模拟输入电压积分的时间T0,此时间往往是固定的; 另一个是以充电后的电压为初值,对参考电源Vref反向积分,积分电容被放电至零所需的时间Ti(Vref与Vi符号相反)。反向积分的斜率是固定的。模拟输入电压Vi与参考电压Vref之比,等于上述两个时间之比。由于Vref、T0固定,而放电时间Ti可以测出,因而可计算出模拟输入电压的大小。
图53双积分式A/D转换器工作原理图
由于T0、Vref为已知的固定常数,因此反向积分时间Ti与输入模拟电压Vi在T0时间内的平均值成正比。输入电压Vi愈高,VA愈大,Ti就愈长。在Ti开始时刻,控制逻辑同时打开计数器的控制门开始计数,直到积分器恢复到零电平时,计数停止。则计数器所计出的数字即正比于输入电压Vi在T0时间内的平均值,于是完成了一次A/D转换。
由于双积分型A/D转换是测量输入电压Vi在T0时间内的平均值,所以对常态干扰(串模干扰)有很强的抑制作用,尤其对正负波形对称的干扰信号,抑制效果更好。
双积分型的A/D转换器具有电路简单、抗干扰能力强、精度高等优点。但转换速度比较慢,常用的A/D转换芯片的转换时间为毫秒级。例如12位的积分型A/D芯片ADCET12BC,其转换时间为1ms。因此适用于模拟信号变化缓慢,采样速率要求较低,而对精度要求较高,或现场干扰较严重的场合。例如常在数字电压表中采用该芯片进行A/D采样。
2. 性能指标
衡量A/D性能的主要参数是:
1) 分辨率(resolution)
分辨率是指输出的数字量变化一个相邻的值所对应的输入模拟量的变化值; 取决于输出数字量的二进制位数。一个n位的A/D转换器所能分辨的*小输入模拟增量定义为满量程值的2-n倍。例如,满量程为10V的8位A/D芯片的分辨率为10V×2-8=39mV; 而16位的A/D是10V×2-16=153μV。
2) 满刻度误差(full scale error)
满刻度误差也称增益误差,即输出全1时输入电压与理想输入量之差。
3) 转换速率(conversion rate)
转换速度是指完成一次A/D转换所需时间的倒数,是一个很重要的指标。A/D转换器型号不同,转换速度差别很大。选用A/D转换器型号视应用需求而定,在被控系统的时间允许的情况下,应尽量选用便宜的逐次比较型A/D转换器。
4) 转换精度(conversion accuracy)
A/D转换器的转换精度由模拟误差和数字误差组成。模拟误差是比较器、解码网络中的电阻值以及基准电压波动等引起的误差,数字误差主要包括丢失码误差和量化误差,前者属于非固定误差,由器件质量决定,后者和A/D输出数字量的位数有关,位数越多,误差越小。
5.1.2C8051F020的ADC0功能结构
C8051F020的ADC0子系统就是一个100ksps、12位分辨率的逐次逼近寄存器型ADC。ADC0的*高转换速度为100ksps,其转换时钟来源于系统时钟分频,分频值保存在寄存器ADC0CF的ADCSC位。C8051F020的ADC0子系统功能框图如图54所示,它包括一个9通道的可编程模拟多路选择器(AMUX0)、一个可编程增益放大器(PGA0)和一个100ksps、12位分辨率的逐次逼近寄存器型ADC,ADC中集成了跟踪保持电路和可编程窗口检测器。AMUX0、PGA0、数据转换方式及窗口检测器都可用软件通过特殊功能寄存器来控制。ADC0所使用的电压基准将在5.3节专门介绍。只有当ADC0控制寄存器中的AD0EN位被置1时ADC0子系统(ADC0、跟踪保持器和PGA0)才被允许工作。当AD0EN位为0时,AD0C子系统处于低功耗关断方式。
图54ADC0子系统功能框图
从ADC0的功能框图可以看出,ADC0的运行主要与图上标的10个SFR有关。8个外部输入的模拟量可以通过配置寄存器AMX0CF设定为单端输入或双端输入; 8个外部输入的模拟量和一个内部温度传感器量通过通道选择寄存器AMX0SL设定在某一时刻通过多路选择器; 从多路选择器出来的模拟量通过配置寄存器ADC0CF设定ADC转换速度和对模拟量的放大倍数; 由控制寄存器ADC0CN对ADC进行模拟量转换的启动、启动方式、采样保持、转换结束、数字量格式等进行设定; 12位的转换好的数字量存放在数据字寄存器ADC0H、ADC0L中; ADC0中提供了可编程窗口检测器,通过上下限寄存器ADC0GTH、ADC0GTL、ADC0LTH、ADC0LTL设定所需要的比较极限值。
在进行模拟量转换前设定好以上SFR,CPU就按设定好的模式在模拟量转换好时用指令读出数据寄存器中的数字量或在中断服务程序中读取数字量,然后再进行下一次的转换。ADC0的电气特性见附录C。
5.1.3模拟多路选择器和PGA
模拟多路选择器AMUX(Analog Multiplexer)中的8个通道用于外部测量,而第九通道在内部被接到片内温度传感器。这9个模拟通道通过通道选择寄存器AMX0SL和配置寄存器AMX0CF进行选择和配置,可以将AMUX输入对编程为工作在差分或单端方式。这就允许用户对每个通道选择*佳的测量技术,甚至可以在测量过程中改变方式。在系统复位后AMUX的默认方式为单端输入。表51给出了每种配置下各通道的功能。
配置寄存器AMX0CF的格式如下:
其中,各位的含义如下:
位7~4——未使用。读= 0000b; 写=忽略。
位3(AIN67IC)——AIN6、AIN7输入对配置位。
0: AIN6和AIN7为独立的单端输入。
1: AIN6和AIN7为(分别为)+、-差分输入对。
位2(AIN45IC)——AIN4、AIN5输入对配置位。
0: AIN4和AIN5为独立的单端输入。
1: AIN4、AIN5为(分别为)+、-差分输入对。
位1(AIN23IC)——AIN2、AIN3输入对配置位。
0: AIN2和AIN3为独立的单端输入。
1: AIN2、AIN3为(分别为)+、-差分输入对。
位0(AIN01IC)——AIN0、AIN1输入对配置位。
0: AIN0和AIN1为独立的单端输入。
1: AIN0、AIN1为(分别为)+、-差分输入对。
注: 对于被配置成差分输入的通道,ADC0数据字格式为2的补码。
通道选择寄存器AMX0SL的格式如下:
其中,各位的含义如下:
位7~4——未使用。读= 0000b; 写=忽略。
位3~0(AMX0AD3~0)——AMUX0地址位。
0000~1111,根据表51选择ADC输入的通道。
表51模拟通道配置
AMX0AD30
000000010010001101000101011001111xxx
AMX0CF
位3~0
0000AIN0AIN1AIN2AIN3AIN4AIN5AIN6AIN7温度传感器
0001+ (AIN0)
- (AIN1)AIN2AIN3AIN4AIN5AIN6AIN7温度传感器
0010AIN0AIN1+ (AIN2)
- (AIN3)AIN4AIN5AIN6AIN7温度传感器
0011+ (AIN0)
- (AIN1)+ (AIN2)
- (AIN3)
AIN4AIN5AIN6AIN7温度传感器
0100AIN0AIN1AIN2AIN3+ (AIN4)
- (AIN5)AIN6AIN7温度传感器
0101+ (AIN0)
- (AIN1)AIN2AIN3+ (AIN4)
- (AIN5)AIN6AIN7温度传感器
0110AIN0AIN1+ (AIN2)
- (AIN3)+ (AIN4)
- (AIN5)AIN6AIN7温度传感器
0111+ (AIN0)
- (AIN1)+ (AIN2)
- (AIN3)+ (AIN4)
- (AIN5)AIN6AIN7温度传感器
1000AIN0AIN1AIN2AIN3AIN4AIN5+ (AIN6)
- (AIN7)温度传感器
1001+ (AIN0)
- (AIN1)AIN2AIN3AIN4AIN5+ (AIN6)
- (AIN7)温度传感器
1010AIN0AIN1+ (AIN2)
- (AIN3)AIN4AIN5+ (AIN6)
- (AIN7)温度传感器
1011+ (AIN0)
- (AIN1)+ (AIN2)
- (AIN3)AIN4AIN5+ (AIN6)
- (AIN7)温度传感器
1100AIN0AIN1AIN2AIN3+ (AIN4)
- (AIN5)+ (AIN6)
- (AIN7)温度传感器
1101+ (AIN0)
- (AIN1)AIN2AIN3+ (AIN4)
- (AIN5)+ (AIN6)
- (AIN7)温度传感器
1110AIN0AIN1+ (AIN2)
- (AIN3)+ (AIN4)
- (AIN5)+ (AIN6)
- (AIN7)温度传感器
1111+ (AIN0)
- (AIN1)+ (AIN2)
- (AIN3)+ (AIN4)
- (AIN5)+ (AIN6)
- (AIN7)温度传感器
在表51中可看出,从多路选择器出来的哪一个通道和单端或差分输入由通道选择寄存器AMX0SL和配置寄存器AMX0CF进行选择和配置,表左边的垂直方向表示配置寄存器AMX0CF低4位值,指出各通道的单端还是差分输入,表上边的水平方向表示通道选择寄存器AMX0SL的低4位,选择9路输入的中的某一路。
PGA(Programmable Gain Amplifier)即可编程增益放大器,它对AMUX输出信号的放大倍数由ADC0配置寄存器ADC0CF中的AMP0GN2~0确定。PGA增益可以用软件编程为0.5、1、2、4、8或16,复位后的默认增益为1。注意,PGA0的增益对温度传感器也起作用。
配置寄存器ADC0CF的格式如下:
其中,各位的含义如下:
位7~3 (AD0SC4~0)——ADC0 SAR转换时钟周期控制位。
SAR转换时钟来源于系统时钟,由下面的方程给出
AD0SC=SYSCLKCLKSAR0-1
其中AD0SC表示AD0SC4~0中保持的数值,CLKSAR0表示所需要的ADC0 SAR时钟(注: ADC0 SAR时钟应小于或等于2.5MHz)。
位2~0 (AMP0GN2~0)——ADC0内部放大器增益(PGA)。
000: 增益= 1
001: 增益= 2
010: 增益= 4
011: 增益= 8
10x: 增益= 16
11x: 增益= 0.5
5.1.4ADC的工作方式
1. 转换过程
ADC0的转换过程由控制寄存器ADC0CN来设置和控制的。
控制寄存器ADC0CN的格式如下:
其中,各位的含义如下:
位7 (AD0EN)——ADC0使能位。
0: ADC0禁止。ADC0处于低耗停机状态。
1: ADC0使能。ADC0处于活动状态,并准备转换数据。
位6 (AD0TM)——ADC跟踪方式位。
0: 当ADC被使能时,除了转换期间之外一直处于跟踪方式。
1: 由AD0CM1~0定义跟踪方式。
位5 (AD0INT)——ADC0转换结束中断标志。该标志必须用软件清0。
0: 从*后一次将该位清0后,ADC0还没有完成一次数据转换。
1: ADC完成了一次数据转换。
位4 (AD0BUSY)——ADC0忙标志位。
读:
0: ADC0转换结束或当前没有正在进行的数据转换。AD0INT在AD0BUSY的下降沿被置1。
1: ADC0正在进行转换。
……