高精度16位AD电压表电流表解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本科毕业设计(论文)
题目:高精度16位AD转换器应用
High precision 16 bit AD converter application
学院
专业
班级
学号
姓名
诚信承诺
我谨在此承诺:本人所写的毕业论文《高精度16位AD转换器应用》均系本人独立完成,没有抄袭行为,凡涉及其他作者的观点和材料,均作了注释,若有不实,后果由本人承担。
承诺人(签名):
年月日
摘要
【摘要】本文介绍了一种基于单片机技术的新型高精度数字式电压电流表,该设计采用STC公司生产的STC89C52微处理器作为整个设计的核心单元,通过施加外围电路来实现直流电压和直流电流的精确测量,该系统的设计思想是通过输入端电阻采集被测信号,由于采集到的电压、电流信号较弱需要经运算放大器对信号进行放大,本文采用LM124对采集到的信号进行放大,经放大处理后的信号为模拟信号不能直接被单片机识别,需要将采集到的模拟电压信号送到模数转换芯片ADS1110 来进行A/D 转化,最后将转换后的数字信号送到MCU 进行数据处理并通过液晶屏幕(1602或者12864)来显示被测值。
本文对整个设计流程做了详细的阐述并制作了样机,实际测试表明该数字式电压电流表可以精确的测量直流电压,直流电流,理论设计精度可达到16位,显示精度达到0.0001,测试结果证明测试精度达到了设计要求。
【关键词】单片机;STC89C52;高精度数字电压表;数字电流表;ADS1110
High precision 16 bit AD converter application
Abstract
【ABSTRACT】Abstract: This article introduced a new digital voltmeter of high precision,which was basing on single-chip technic,the design adopted STC89C52 microprocessor produced by ATMEAL company as the core unit of the whole design,to reach the precisly measurement of volts d.c by putting peripheral circuit.,and the idea of the system was to gather the signal of the under measured volts through the inputing resister.As the volts signal gathered was very weak,it needed to be magnified,here the LM24 was used to do this. The magnified signal was taken as analog signal,which cannot be identified by single-chip,so the analog signal needed to be transferred to ADS1110 to get the A/D transferation,then the transferred signal would be conveyed to MCU for digtal processing and through LCD1602 to get the volum of the volts. The whole design process was described in details and sample was also made,and the actul test result showed this voltmeter was able to measure volts d.c very precisely,the volum can reach 0.0001,which can meet the requirement well.
【KEYWORDS】Single-chip;STC89C52;High precision digital voltmeter; ADS1110 Digital ammeter
目录
1 绪论 (6)
1.1 课题简述 (6)
1.2 课题设计目标 (6)
1.3 高精度电参数测试仪的应用前景 (7)
2 方案设计与论证 (8)
2.1 方案论述 (8)
2.2 实用意义 (8)
3 系统硬件电路设计及芯片介绍 (9)
3.1 芯片选型及功能介绍 (9)
3.1.1 STC89C52单片机主要功能及特性 (9)
3.1.2ADS1110 16位AD转换芯片主要功能及特性 (11)
3.1.3 LCD12864液晶介绍 (14)
4系统硬件电路设计 (15)
4.1 单片机主控电路设计 (15)
4.1.1 单片机最小系统电路设计 (15)
4.1.2 复位电路 (15)
4.1.3 振荡电路 (16)
4.2 电压测量电路设计 (17)
4.2.1 设计思路 (17)
4.2.2 原理图设计 (17)
4.3电流测量电路设计 (18)
4.3.1 设计思路 (18)
4.3.2 原理图设计 (18)
4.4 ADS1110 A/D转换模块设计 (19)
4.5 显示模块设计 (20)
4.5.1 显示模块电路设计 (20)
4.5.2 LCD12864与单片机接口电路 (21)
4.6 保护电路与滤波电路设计 (22)
5 系统软件设计 (23)
5.1 软件框图 (23)
5.2 软件流程图 (24)
5.3 程序撰写语言 (26)
5.4 程序主要组成 (26)
5.4.1 AD读取程序子程序 (26)
5.4.2 电压、电流及量程转换程序 (29)
5.4.3 LCD12864液晶显示程序 (32)
6 系统功能测试 (34)
6.1 测试仪器与使用方法 (34)
6.2 数据测量与分析 (34)
7 结束语 (36)
致谢 (37)
参考文献 (38)
附录 (39)
1系统整体电路图 (39)
2实物照片图 (41)
3系统源程序代码 (42)
1绪论
数字型电压表(Digital Voltmeter)简称DVM、数字电流表(Digital ammeter )简称AMP,它是采用数字化测量技术,把连续的模拟量(直流输入电压,直流输入电流)转换成不连续、离散的数字形式并加以显示的仪表,它是通过把采集到的模拟信号经过AD 转换成数字量来显示,通过数字显示开起来更加直观,避免指针式容易造成的视觉误差。
传统的指针式电压、电流表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压、电流表,由于其具有较高的精度、较强的抗干扰能力、方便实用的可扩展性、集成方便,与台式电脑进行比较简便的实时通信,仪表精度及测量范围可以根据需要来采用程序设定。
目前,由各种单片A/D 转换器构成的数字电压、电流表,已广泛用于自动测试系统、工业自动化仪表、电子及电工测量等智能化测量领域,体现出强大的生命力。
本文主要介绍采用STC89C52单片机和16位高精度AD转换芯片ADS1110来设计的高精度数字电压表,采用此方法设计的数字电压表测量精度高、反应速度快、测量范围可以在线编程设定等诸多优点,该高精度数字电压表适合在测量精度高的场合推广应用。
1.1课题简述
本课题要求设计一台高精度的数字式直流测试电压、电流表。
本设计通过数字电路和模拟电路相结合的方式来实现设计,本设计的核心由51单片机来控制实现;模拟电路部分包括电压采集电路、电流采集电路、信号放大电路、 AD转换电路组成。
单片机系统设计用来实现量程的切换控制、AD 转换后的数据处理、LCD液晶显示的控制、按键操作控制等功能。
1.2 课题设计目标
1、设计实现要求
(1)直流电压测量范围:0V~10V,相对误差<1%;
(2)直流电流测量范围:0~10mA,相对误差<1%;
(3)测试结果显示:LCD12864显示,显示精度0.001或以上。
(4)液晶显示刷新周期≤2s;
(5)使用5V 直流电源供电或其它电源设备供电;
(6)制作实物实现以上设计要求。
1.3 高精度电参数测试仪的应用前景
随着大规模集成电路技术的发展,电子各领域的集成度越来越高,这就要求对各种电子设备仪器的精度有了更高的要求,传统的指针式电压、电流表或普通的低精度的数字电压、电流表均不能完成高精度场合的测量要求,这就要求新的更高精度的数字电压表来满足这些场合的测量要求,本文正是本着这一要求来设计,本文设计的电压、电流表可以在大多数高精度要求的测量领域应用,测量精度可以根据要求来设定,最高精度可达到16位,该数字电压表稍加改善便能作为一台高精度的电压、电流测量设备来推广应用。
2 方案设计与论证
2.1 方案论述
该数字式高精度电压表的设计核心是基于单片机STC89C52系统的数据采集与计算控制,主要由单片机最小系统模块、电源电路模块、直流电压采集模块、直流电流采集模块、AD 转换模块、数据处理及显示模块组成。
(系统设计的硬件框图如图 1.1)
2.2 实用意义 本设计制作的5位电压电流表具有精度高,成本低,性能稳定。
根据笔者调查,主控芯片单片机STC89C52单片进价只为5元人民币,AD 单元ADS1110为10元人民币,LCD12864为40元人民币,电源变压器为5元,PCB 生产大概每片10元人民币左右,其它电阻、电容、排针等成本低廉且用量不大故先不计入成本之中,如上所计,整机的成本仅为70元,且所有数据均是单购价格,并非批发价格。
而现今市场上4位电压电流表光表头都需要35元以上,整机均在百元以上。
故本设计的电压电流表具有成本低廉,精度更高等优势,具有一定的实际意义。
图2-1 系统设计的硬件框图
3系统硬件电路设计及芯片介绍
3.1 芯片选型及功能介绍
3.1.1STC89C52单片机主要功能及特性
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
使用STC公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
图3-1 STC89C52电气元件图
STC89C52单片机是宏晶科技生产的单时钟、机器周期为1T的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051单片机,而且速度快8~12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D,应用于电机控制,抗干扰能力强的场合。
STC89C52的主要特点:
(1)机器周期为1T,指令代码完全兼容传统8051单片机;
(2)STC89C52系列的工作电压: 5V;
(3)工作频率范围:0~35MHz;
(4)片上集成1280字节RAM ,用户应用程序空间60K 字节;
(5)无需专用编程器或专用仿真器,可通过串口(P3.0和P3.1)直接下载用户程序,数秒即可完成;
(6)有EEPROM 功能用于存储; (7)看门狗;
(8)四个16位定时器;
(9)7路外部中断,下降沿或低电平触发中断,并新增支持上升沿中断的PCA 模块,Power Down 模式可由外部中断唤醒,INT0(P3.2),INT1(P3.3),T0(P3.4),T1(P3.5),; (10)工作温度范围:-40~+85℃(工业级),0~75℃(商业级);
(11)8路10位精度的A/D 转换,转换速度可达250K/S(每秒钟25万次)。
STC89C52管脚图如图3-2所示。
VCC :供电电压。
GND :接地。
P0 口:P0口是一个8位漏极开路的双向I/O 口。
当作为输出用时,每位能驱动8个TTL 逻辑电平。
向P0口写入命令“1”时,引脚呈现高阻状态输入。
当需要访问数据存储器和外部程序时,P0口也可以复用为低8位的地址/数据线。
当处于该种模式下时,P0口具有内上拉电阻。
P1 口:P1 口是一个8 位双向I/O 口且其具有内上拉电阻,该口能同时驱动4 个TTL 逻辑电平。
对P1 口写入命令“1
”时,内上拉电阻将端口拉高,即可作为输入端口来使用。
图3-2 STC89C52引脚图
当其为输入口时,外部被拉低的引脚由于内阻的原因,将会输出一定的电流。
P2口:P2口为一个内部上拉电阻的8 位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口作为STC89C52的一些特殊功能口,如表3-1所示:
表3-1 P3的特殊功能
3.1.2ADS1110 16位AD转换芯片主要功能及特性
由于该系统对电压测量的指标精度要求非常高,这就要求高精度的AD转换芯片来支持,普通的 8 位 A/D 芯片很难达到这一要求,故我们选择 16 位 A/D 转换芯片ADS1110做为系统的AD转换芯片。
ADS1110 是 16 位 A/D 转换,线性误差仅为 0.0015%,内部由一个带有可调增益的Σ-△模/数转换器核、一个时钟振荡器、一个 2.048V 的电压基准和一个 I2C接口组成。
同时具有功耗比较低,较高的精度,抗干扰的能力比较突出等特点,适合要求精度较高的仪
器仪表。
ADS1110是一款高性价比具有I2C总线接口的串行A/D转换器。
ADS1110已在单片机系统中应用,并用于现场。
实践证明,ADS1110和单片机组成的数据采集系统,占用I/O 端口少、功耗低,适用无电源场合。
ADS1110引脚图如下图所示:
顶视图SOT-23封装
图3-3 ADS1110引脚图
ADS1110读写操作介绍:
1)读操作:若从ADS1110中读取输出寄存器和配置寄存器的内容,需对ADS1110寻址。
从ADS1110中读取3个字节,前2个字节是输出寄存器的内容,第3个字节是配置寄存器的内容。
读操作时,只读前2个字节而不读第3个字节。
ADS1110的读操作时序如图3-4
所示
图3-4 ADS1110的读操作时序
2)写操作:为了对配置寄存器写操作,要对ADS1110寻址,并向配置寄存器写入1个字节,但不能向输出寄存器写人字节。
其写操作时序如图3-5所示。
图3-5 ADS1110的写操作
3)输出码计算:输出码是一个标量值,它与两个模拟输入端的压差成比例输出码限定在一定数目范围内。
该范围取决于代表输出码所需要的位数。
而ADS1110 的代表输出码所需要的位数又取决于数据速率(如下表所示)。
表3-2:最小和最大码
数据速率数字位数最小码最大码
15SPS 16 -32768 32767
30SPS 15 -16384 16383
60SPS 14 -8192 8191
240SPS 12 -2048 2047
对于最小码的最小输出码,可编程增益放大器PGA 的增益设置以及VIN+与VIN-的正负输入电压而言,输出码的计算公式为:
输出码= -1*最小码*PGA*((VIN+)-(VIN-))/2.048V
从上式中可以看出,若使用了负的最小输出码则须重点注意。
ADS1110 输出码为为二进制2的补码格式,因此最小的绝对值和最大的绝对值是不同得,最大的n 位码是2n-1,而最小的n 位码是–1×2n-1。
ADS1110输出的所有代码右对齐并且经过符号扩展。
这使在数据速率码较高时仅用一个16 位的累加器就可进行平均值的计算。
3.1.3LCD12864液晶介绍
由于LCD1602的只能显示英文,而不能直观的显示中文,且显示的区域也较少,故本设计使用LCD12864来显示最后的输出结果,从而满足各种情况下得需要。
LCD12864的工作电压为+5V,并自带驱动LCD所需的负电压。
全屏幕点阵,点阵数为128(列)×64(行),可显示8(行)×4(行)个(16×16点阵)汉字,也可完成图形,字符的显示。
与MCU接口采用5条位控制总线和8位并行数据总线输入输出,本设计为了节省与MCU的通讯端口,强制选择了串行通讯方式,故和单片机的通讯连线只有3条,大大降低了绘制电路图的难度。
表3-3 LCD12864引脚说明表
4系统硬件电路设计
4.1 单片机主控电路设计
4.1.1单片机最小系统电路设计
单片机最小系统电路实现对采集数据的处理和输出显示的控制,主控电路由STC89C52单片机、晶振电路、复位电路三部分组成,各部分作用如下所述,由其三部分构成的单片机最小系统电路如图4-1所示。
图4-1 单片机最小系统电
4.1.2复位电路
单片机需要正常工作,以及系统中的硬件电路可以可靠的工作,复位模块电路是必须的组成部分,复位电路最重要的是上电复位。
主控单元的电路正常工作需要的供电电源为5伏。
由于微机电路的构成均是时序电路且是数字电路,它需要一致的时钟脉冲,因此在电源刚上电时,只有当VCC达到标准电压时以及在晶振稳工作在稳定状态之后,复位信号才被撤除,单片机的各部分电路开始正常工作。
其次,复位电路还需要在单片机出现异常或者需要手动重置单片机程序时,可以通过按键等进行强行复位单片机的电路,并且复位的优先级会是最高的。
目前为止,单片机复位电路主要有四种类型:(1)微分型复位电路;(2)积分型复
位电路;(3)比较器型复位电路;(4)看门狗型复位电路。
本设计使用的复位电路图如图4-2所示:
图4-2 复位电路
4.1.3振荡电路
晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。
一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容,请注意一般IC的引脚都有等效输入电容,这个不能忽略。
本设计的晶振电路如图4-3所示:
图4-3 晶振电路
4.2 电压测量电路设计
4.2.1设计思路
被测电压通过放大器 LM124 放大,将放大后的电压值送至 ADS1110。
由于系统要求的电压测量范围太大,需进行分档处理。
现将系统要求的测量范围分成两档:100mV~1V 档、1V~10V 档,实现分档的原理是串联不同阻值的定值电阻 R 进行分压(这里并联的电阻分别为100KΩ、25KΩ),档位选择用拨键开关实现。
4.2.2原理图设计
电压测量电路由采样电阻将采集的电压信号经LM124集成运放放大后送至高精度AD转换芯片ADS1110进行AD转换,然后由MCU对信号进行数字处理,最后由液晶显示测量结果。
电压采集及信号放大电路如图4-4所示。
图4-4电压测量模块
4.3电流测量电路设计
4.3.1设计思路
被测电流通过一个定值电阻,从而会产生一个电压。
由于该电压值太小,A/D 不能直接读取,故该电压值需经放大器 LM124 放大,将放大后的电压值送至 ADS1110。
由于系统要求的电流测量范围太大,需进行分档处理。
被测电流通过一个定值电阻R,从而会产生一个电压。
现将系统要求的测量范围分成两档:100uA~1mA 档、1mA~10mA 档,实现分档的原理是并联不同阻值的定值电阻 R(这里并联的电阻分别为200Ω、2KΩ),档位选择用拨键开关实现。
4.3.2原理图设计
电流测量电路由采样电阻将采集到的电压信号送至LM124放大后再送到ADS1110进行模数转换,然后送到MCU进行数字处理,然后由液晶显示测量数据,电流采集电路如图4-5所示。
4-5电流测量模块电路
4.4 ADS1110 A/D转换模块设计
ADS1110是一种精密、可连续自校准的串行A/D转换器有差分输入和高达16位的分辨率,其串行接口为I2C总线。
STC89C52单片机通过软件模拟I2C总线实现与ADS1110的连接。
本设计采用单端输入,正输入端接外围电压采样电路的输出,负输入端接地,正负端的电压差即为需要测量的电压值。
ADS1110应用电路如图4-6所示。
图4-6 ADS1110应用电路
4.5 显示模块设计
4.5.1显示模块电路设计
方案一:采用八位共阳极 LED 数码管进行显示,利用单片机 I/O 口动态循环输出的方法,将相应的段码值输入,并开相应 LED 的三极管。
方案二:采用点阵字符型 LCD1602液晶显示,液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。
方案三:为了弥补方案二的只能显示英文字符以及显示区域过少的缺点,可以采用LCD12864液晶来显示,LCD12864可以显示中文字符,使测量时更直观,以满足各种场合的需要。
LCD12864具有汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字,格式为16x16点阵、128个字符,格式为8x16及64x256点阵显示RAM。
故本设计在显示模块电路上采用方案3。
4.5.2LCD12864与单片机接口电路
LCD16824液晶与单片机链接电路如图4-6所示
图 4-7 液晶模块电路图
4.6 保护电路与滤波电路设计
为了保证电路工作在正常的工作条件下,防止由于外部的扰动或者由于操作失误导致电路硬件被强制破坏,必须加入适当的保护电路、滤波电路以及指示电路。
1)、在开关之后串联一个IN4007二极管来防止因为操作失误导致电源接反导致单片机、运放、AD转换芯片、液晶屏幕以及其他外围元件烧坏;并且在二极管之后对地并联一个瓷片电容一个电解电容来滤除杂波,使AD芯片可以工作在一个电源供电稳定的环境下,提高精度。
(如图4-8所示)
图4-8 电源保护滤波电路
2)、在测量电压、测量电流电路接运放的前端对地并接一个5V的稳压二极管进行限幅处理,如若运放输入电压超过5V,稳压二极管强制将电压钳位在5V,这样可以保护运放,使输入运放的电压在运放的极限参数之内。
(图详询图4-4、图4-5,此处不再重复给出)3)、在AD的正输入端之前,以及供电VCC端对地并接0.1uF的瓷片电容和10uF的电解电容滤除杂波,使AD的输入电压更稳定。
(图详询图4-6,此处不再重复给出)
4)、接装电源指示灯,如果电源供电正常则LED灯显示亮,电源指示灯对后期的调试以及日后的使用有用。
(如图4-9所示)
图4-9 电源指示灯
5系统软件设计5.1 软件框图
图5-1 软件流程图
5.2 软件流程图
图5-2 软件流程图
5.3 程序撰写语言
本程序设计采用C语言设计,C语言有如下特点:
1、简洁紧凑、灵活方便
C语言一共有9种控制语句,32个关键字。
它把低级语言的实用性和高级语言的基本结构和语句完美的结合起来。
2、运算符丰富
C语言的运算符包含的范围很广泛,共有34种运算符。
C语言的赋值、括号、强制类型转换等都是运算符处理。
从而使C语言的运算类型极其丰富,表达式类型多样化。
3、数据结构丰富
C语言的数据类型有:字符型、整型、数组类型、指针类型、共用体类型和结构体类型等。
可以完成各种复杂数据结构之间的运算。
并引入了指针概念,使程序更加的灵活,可读性更高,也使程序效率变得更高。
5.4 程序主要组成
该系统的软件部分,我们用单片机C 语言编写。
软件部分主要由一个主程序[main],两个子程序组成。
主程序[main]主要实现对测量量程的选择,电压[voltage]、电流[current]的计算,以及对整个程序的链接;三个子程序分别是:lcd1602 显示程序[lcd1602]、
lcd12864[12864]、A/D 采样程序[ADS1110],其详细程序见附录部分。
5.4.1AD读取程序子程序
AD子程序主要有:从机确认子程序、主机确认子程序、设置地址、AD读数输出子程序等构成。
1)、按照TI公司提供的ADS1110的资料中的时序图编制从机、主机确认子程序。
从机确认子程序:
void slave_ack (void)
{
ADS1110_SDA = 1; //设置为输入引脚
while (ADS1110_SDA == 1);//等待数据线跳为高电平
ADS1110_SCL = 0;
delay(4);
delay(4);
ADS1110_SCL = 0;
delay(4);
}
主机确认子程序:
void master_ack (void)
{
ADS1110_SDA = 0; // 发起确认条件
ADS1110_SCL = 0;
delay(4);
ADS1110_SCL = 1; /* 上升延读取数据*/
delay(4);
ADS1110_SCL = 0;
delay(4);
}
2)、设置I2C地址:1001000 是本设计AD的I2C地址。
此程序是在单片机与AD发起通讯之前需要先选定AD的I2C地址,才能做后续的工作。
void i2c_setaddress (unsigned char slave_addr, unsigned char rw)
{
unsigned char i;
unsigned char dat;
dat = slave_addr << 1; //将地址存入dat变量
if (rw == 0)
dat |= 0x01; // 读操作
ADS1110_SCL = 0;
delay(4);
for (i = 0; i < 8; i++)
{
ADS1110_SDA = (bit)(dat & 0x80); // 先写入高段地址数据
dat <<= 1;
delay(4);
ADS1110_SCL = 0;
delay(4);
}
slave_ack(); //最后请求从机确认
}
3)、读出AD已经转换好的数值:因为AD芯片是16位的,但是接收定义的变量是8位,故开辟一个空间为3的8位字符数组,数组的第一个数值为高8位,数组的第二个数值为低8位。
先将第一个数值赋值到一个16位的变量中,然后左移8位,再将第二个数“或”上16位的变量,即可得到当前AD转换好的数值。
然后返回给单片机进行后续的操作。
void ads1110_adc (unsigned char slave_addr)
{
unsigned char i;
ADS1110_SDA = 0; //开始条件
delay(10);
ADS1110_SCL = 0;
delay(4);
i2c_setaddress(slave_addr, 0); //选定需要读出数据的AD芯片
for (i = 0; i < 3; i++) //将AD的寄存器读出来(前两个是数据的高8位和低
八位,第三个是配置寄存器的内容)
adc_data_1[i] = i2c_readbyte();
ADS1110_SCL = 1;
delay(4);
ADS1110_SDA = 1; //结束条件
delay(10);
}
unsigned int ads1110_readoutput (unsigned char slave_addr)
{
unsigned int outputcode;
ads1110_adc(slave_addr); //选定AD地址
outputcode = (unsigned int)(adc_data_1[0]); //将高8位读出
outputcode <<= 8; //将8位数据移到int型变量的高8位的位置outputcode |= (unsigned int)(adc_data_1[1]); //将低8位的数据或到int型变量上outputcode &= 0x7fff; //输出数据为2进制补码形式,将最高位求反return (outputcode); //将读出的AD值返回
}
5.4.2电压、电流及量程转换程序
1)、当前模式按键查询
这个步骤是为了让单片机读取当前测量的是电压还是电流,为后面的液晶相关显示做好准备,更直观的告诉使用者目前所使用的模式有否使用错。
默认模式下,液晶显示为电压,单位为“V”,按一下模式切换按键,则显示为电流,单位为“mA”。
量程转换按键则是为了能够正确告诉单片机现在是处于大量程下还是小量程下,从而可以正确显示当前的值。
量程大小决定了小数点的位置:小量程时,小数点出现在整体数据的第二位;大量程时,小数点出现在整体数据的第三位。
if(CTRL_MODE==0) //模式按键按下1为电压模式2为电流模式
{
key_delay(5);
if(CTRL_MODE==0)
{
m_imode++;
}
if(m_imode==3)m_imode=1;
while(!CTRL_MODE);
}
if(CTRL_MEASURE==0) //量程按键按下1为低量程2为高量程
{
key_delay(5);
if(CTRL_MEASURE==0)
{
m_imeasure++;
}
if(m_imeasure==3)
{
m_imeasure=1;
}
while(!m_imeasure);
}
2)电压转换输出:
1、选定AD芯片的地址来激活AD芯片
2、判断是高量程还是低量程
3、标度转换,因为ADS1110的满量程电压为2.048V。
所以,低电压量程档位:
当前电压值=AD转换的值(浮点值)*满量程电压/32768
高电压量程档位:因为硬件设计时,利用一个100K和一个25K的电阻串联分压,故需将所得的电压乘以5。
当前电压值=AD转换的值(浮点值)*满量程电压/32768*5。
adc_data = ads1110_readoutput(ADS1110_ADDRESS); //先读出AD的当前转换值(选定地址)if(m_imeasure==1) //测量范围:100mV-1V
{
mode=1; //模式为电压,为液晶显示为根据
voltage = ((float)adc_data) * ADREFENCE_V oltage/ 32768; //计算低量程的电压
show_voltage(3, 4,0,0); //显示电压:前两位是显示坐标位置,第三个表示
低量程,第四个表示当前测量的是电压
}
else //测量范围:1V-10V
{
mode=1;
voltage = ((float)adc_data) * ADREFENCE_V oltage*5 / 32768; // 高档位量程需要*5 把
分压转回去
show_voltage(3, 4,1,0); //高量程,为电压
}
delay1ms(800);
}
3)电流转换输出:
1、选定AD芯片的地址来激活AD芯片
2、判断是高量程还是低量程
3、由于硬件设计时,选取的高量程电阻的比低量程的电阻大10倍,故在代码中就不需要比例转换。
直接根据欧姆定律,将电压值读出来之后除以电阻阻值即为所测量的电流。
即,当前电流值=AD转换的值(浮点值)*满量程电压/32768/电阻阻值(kΩ)
/*----------------------------------------------------
AD采样
----------------------------------------------------*/
adc_data = ads1110_readoutput(ADS1110_ADDRESS);//选定AD地址
if(m_imeasure==1) //测量范围:100uA-1mA; 测试电阻:2KΩ; AD电压范围:0.2V-2.0V
{
mode=2;
voltage = ((float)adc_data) * ADREFENCE_V oltage / 32768/2; //读出当前加在采样电阻上的电压值
/*--------------------------------------------------
显示电流
--------------------------------------------------*/
show_voltage(3, 4,0,1); //选定液晶显示坐标,低量程、测量量为电流
}
else //测量范围:1mA-10mA; 测试电阻:200Ω; AD电压范围:0.2V-2.0V
{。