基于单片机的数控恒流源设计
大学时做的课设,毕业了开源,论文里的图片老是插入失败,干脆直接上传源文件了,如果对你有帮助的话请点个赞谢谢。
摘要
恒流源是一种能够向负载提供恒定电流的电源。恒流源的应用范围非常广泛,并且在许多情况下是必不可少的。本文设计了一种基于单片机控制的数控直流恒流源。该恒流源以AT89C51为控制核心,采用了高共模抑制比低温漂的运算放大器LM358和NMOS管构成恒流源的主体,配以高精度采样电阻及12位D/A芯片TLC5615、16位A/D芯片ADS1110,实现了单片机对输出电流的实时检测和实时控制。按键可预设电流值,步进步长为1mA,最大输出电流为1000mA,并具有可调节的输出电阻。在软件设计上采用增量式PID控制算法,即数字控制器的输出只是控制量的增量。仿真结果表明当输出电流为1000mA时,误差为0.176mA,相对误差为0.0176%。
该系统已基本达到预期的设计目标,具有功能强、性能可靠、体积小、电路简单的特点,可以应用于需要高稳定度的小功率恒流源的领域。
关键词:AT89C51,数控恒流源,PID控制
Abstract
A constant current source is a power source capable of providing a constant current to a load. Constant current sources have a wide range of applications and are essential in many cases. In this paper, a kind of NC DC constant current source based on MCU control is designed. The control core of the constant current source is AT89C51, and the operational amplifier LM358 with high common mode rejection ratio and low temperature drift is used as the main body of the constant current source. It is equipped with high precision sampling resistance and 12-bit D/A chip TLC5615 and 16-bit A/D chip ADS1110, which realizes the real-time detection and real-time control of the output current. The key can be preset current value, step length is 1mA, maximum output current is 1000mA, and has adjustable output resistance. The incremental PID control algorithm is used in software design, that is, the output of the digital controller is only the increment of the control quantity. The simulation results show that when the output current is 1000mA, the error is 0.176mA and the relative error is 0.0176%.
The system has basically reached the expected design goal, has the characteristics of strong function, reliable performance, small size, simple circuit, and can be used in the field of low power constant current source with high stability.
Key words: AT89C51, CNC constant current source, PID control
目录
一、 设计意义及原理方案
1. 研究背景
2. 设计意义
3. 项目设计实现功能
4. 原理方案
4.1. 电流源元件的选择
4.2. 89C51单片机
4.3. LCD1602显示模块
4.4. TLC5615数模转换芯片
4.5. ADS1110模数转换芯片
4.6. 恒流源电路反馈原理
二、 电路硬件分析
三、 代码设计流程
1. 程序设计流程图
1.1. PID调节反馈电流
1.2. 按键扫描
四、 仿真结果分析
五、 总结
参考文献
附录 完整代码
- 研究背景
在测试计量、半导体性能测试等许多工业和科学实验领域都会用到恒流源,研究并设计一款智能化的高精度恒流源具有十分广泛的应用价值[1,2]。但在一个电子产品研制过程中,必须反复进行设计、试制和调试,而实物试制和调试是一项费时和费力的工作,往往是事倍功半,导致系统开发周期长,成本高。随着大规模集成电路和计算机的迅速发展,计算机仿真技术彻底改变了以往电子系统设计中完全依靠人工进行参数计算、电路实验、实物试制和系统调试的传统设计方法,利用EDA仿真软件,对已存在的系统或设想中的不同设计方案在计算机上进行仿真分析,同时与实物试制和调试相结合,从而优化元件参数,提高系统性能,最大限度地降低了设计成本,缩短了系统研制周期。Proteus是一款功能强大的系统设计辅助类EDA仿真软件,采用该软件对数控恒流源进行设计、分析、研究和实验,可以达到研制和开发实际电子产品的目的[1]。本文研究采用Proteus仿真软件,利用单片机技术进行数控恒流源开发的方法。
- 设计意义
按照恒流源电路主要组成器件的有所不同,一般而言可分为三类:晶体管恒流源、场效应管恒流源、集成运放恒流源。
恒流源、交流恒流源、直流恒流源、电流发生器、大电流发生器又叫电流源、稳流源,是一种宽带谱,高精度交流稳流电源,具有响应速度快,恒流精度高、能长期稳定工作,适合各种性质负载(阻性、感性、容性)等优点。
恒流源的应用范围非常广泛,恒流源能够向负载提供恒定电流的电源,在许多情况下是必不可少的。如在通用的充电器对蓄电池充电时,随着蓄电池端电压的逐渐升高,充电电源就会相应的减少,为了保证恒流充电,必须随时提高充电器的输出电压,但采用恒流源充电后就可以不必调整期输出电压,从而使劳动强度降低,生产效率得到提高。恒流源还被广泛应用于测量电路中,它既可以为各种放大电路提供偏流以稳定其静态工作点,又可以作为其有源负载,以提高放大倍数,并且在差动放大电路、脉冲产生电路中得到广泛应用。例如电阻器阻值的测量和分级,电缆电阻的测量等,且电流越稳定,测量就越准确。除此之外,现行扫描锯齿波的获得,有线通信工电源,电泳、点解、电镀等化学加工装置电源,电子束加工机、离子注入机等电子光化学设备中的供电电源也都必须用用恒流源!也用于检测热继电器、塑壳断路器、小型短路器及需要设定额定电流、动作电流、短路保护电流等生产场合[2]。
恒流源是一种能够向负载提供恒定电流的电源。恒流源的应用范围非常广泛,并且在许多情况下必不可少的。它既可以为各种放大电路提供偏置电流以稳定其静态工作点,又可以作为其有源负载,以提高放大倍数。并且在差动放大电路、脉冲产生电路中得到了广泛应用。
- 项目设计实现功能
(1)通过键盘设定输出电流,步进电流1mA,通过“十”、“-”键可调;
(2)显示屏显示设定电流以及误差值;
(3)设定电流数字通过D/A转换为模拟电源,送入恒流源电路;
(4)对输出电阻的阻值调节,恒流源电路的输出电流不变;
(5)步进步长为1mA,最大电流可达1000mA;
(6)采样恒流源电路的输出电流,由A/D转换为数字电流与预设定电流进行比较。
- 原理方案
- 电流源元件的选择
- 晶体管恒流源
- 电流源元件的选择
这类恒流源以晶体三极管为主要组成器件,利用晶体三极管集电极电压变化对电流影响小,并在电路中采用电流负反馈来提高输出电流之恒定性.通常,还采用一定的温度补偿和稳压措施。由品体管构成的恒流源,广泛地用作差动放大器的射极公共电阻,或作为放大电路的有源负载,或作为偏流使用,也可以作为脉冲产生电路的充放电电流,由于晶体管参数受温度变化影响,大多采用了温度补偿及稳压措施,或增强电流负反馈的深度以进一步稳定输出电流。
-
-
- 场效应管恒流源
-
场效应管恒流源较之晶体管恒流源,其等效内阻较小,但增大电流负反馈电阻,场效应管恒流源会取得更好的效果.且无需辅助电源,是一个纯两端网络,这种工作方式十分有用,可以用来代替任意一个欧姆电阻。通常,将场效应管和晶体管配合使用,其恒流效果会更佳。
-
-
- 集成运放恒流源
-
由于温度对集成运放参数影响不如对晶体管或场效应管参数影响之显著,由集成运放构成的恒流源具有稳定性更好,恒流性能更高之优点。尤其在负载一端需接地,要求大电流的场合,获得了广泛应用。
根据仿真的需要以及性能的需求,本方案选择场效应管来作为恒流源的核心部件。
图 1
-
- 89C51单片机
89c51是一款很大众化的入门级单片机,ATMEL、NXP、STC、和SST等公司生产的与80c51兼容低功耗、高性能8位89c51/s51单片机具有比80c31更丰富的外设资源。
图 2
AT89C51 是一种低功耗、高性能的片内含有 4KB快闪可编程/ 擦除只读存储器的 8 位 CMOS 微控制器,使用高密度、非易失存储技术制造,并且与 8OC51 引脚和指令系统完全兼容。主要性能 : 与 MCS-51 微控制器产品系列兼容。片内有 4KB 可在线重复编程的快闪擦写存储器存储数据保存时间为 10 年。宽工作电压范围 :Vcc 可为 2.7V 到 6V 全静态工作 ; 可从 OHz 至16MHz 程序存储器具有 3 级加密保护 128*8 位内部RAM 32 条可编程 I/0 线、两个 16 位定时器 / 计数器、中断结构具有 5 个中断源和 2 个优先级、可编程全双工串行通道、空闲状态维持低功耗和掉电状态保存存储内容[3]。
89C51 单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上。如果按功能划分,它由如下功能部件组成,即微处理器、数据存储器、程序存储器、并行 I/0 口、串行口、定时器 / 计数器、中断系统及特殊功能寄存器。它们都是通过片内单一总线连接而成,其基本结构依旧是 CPU加上外围芯片的传统结构模式。但对各种功能部件的控制是采用特殊功能寄存器 的集中控制方式。
-
- LCD1602显示模块
LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符。LCD1602主要是做调试用的,它可以帮助我们显示程序的执行结果,让程序在单片机外部可视化。
图 3
LCD1602内置了CGRAM和CGROM字模库,里面包含了ASCLL码表的所有字符和一些特殊字符的字模数据,字模数据就是在5*7的点阵里点亮哪几个点可以显示其相应的字符,再由引脚控制输出在哪个位置上,即可完成显示丰富多样的内容的任务。这个过程很像数码管的显示,字模库就是数码管段选的数组,外部引脚控制输出在哪个位置就是数码管的位选。
图 4
对照上面的引脚定义来分析此图,首先不难看出共有两种时序信号,分别是写指令和写数据(其实是四种,还有读指令和读数据)写指令是用来控制操作的,例如光标移动等,写数据就写入要显示的字符。当RS配置为为高电平1,R/W为低电平0时即为写数据模式,一旦检测到使能引脚E的上升沿跳变便开始写入D0~D7对应的数据,这样就完成了一次写数据,再不断循环此过程就完成了数据的写入,总的来说这个时序逻辑还是很简单易懂的。
-
- TLC5615数模转换芯片
TLC5615 为美国德州仪器公司推出的产品,是具有串行接口的数模转换器,通信采用三线SPI协议,其输出为电压型,最大输出电压是基准电压值的两倍。配置简单不需要配置过多的寄存器,仅需使用单5V的电源即可工作。
图 5
通过上方时序图我们可以快速的编写底层逻辑的程序,本次仅测试输出指定的电压因此只需要使用到CS、SCLK、DIN三个引脚的时序即可,如果只是驱动一个模块的话CS也可以直接接地,此时仅需占用单片机两个IO口即可正常运行。
图 6
找到数据手册中关于上面二进制码表可以得知最后有两位的值固定为0(因为DAC输入锁存器为12位的),前面十位数据决定输出的电压。
硬件方面可以参照下方引脚说明以及模块的引脚图
图 7
引脚名称 |
功能说明 |
VCC |
正电源端,4.5~5.5V ,通常取 5V |
GND |
模拟地 |
AOUT |
DAC 模拟电压输出端 |
REF |
基准电源输入 |
DIN |
串行数据输入端 |
SCLK |
串行时钟输入端 |
CS |
芯片选用通端,低电平有效 |
DOUT |
用于级联时的串行数据输出端 |
-
- ADS1110模数转换芯片
ADS1110是精密的连续自校准模/数(A/D)转换器,带有差分输入和高达16位的分辨率,封装为小型SOT23-6。片内2.048V的基准电压提供范围为±2.048V的输入差分电压。ADS1110使用可兼容的PC串行接口,在2.7V至5.5V的单电源下工作。
ADS1110可每秒采样15、30、60或240次以进行转换。片内可编程的增益放大器(PGA)提供高达8倍的增益,并且允许以高分辨率对较小的信号进行测量。在单周期转换方式中,ADS1110 在一次转换之后自动掉电,在空闲期间极大地减少了电流消耗。
ADS1110通过一个IC(内部集成电路)接口通信。IC接口是一个2线漏极开路输出接口,支持多个器件和主机共用一条总线。通过将FP℃总线上的器件接地,只会使总线处于低电平;这些器件不能驱动总线到高电平。故而,总线要通过上拉电阻拉高。因此,在没有器件使总线变低时,总线处于高电平。这种方法可使两个器件不发生冲突;如果两个器件同时驱动总线,则驱动器不会发生冲突。
图 8
PC总线上的通信通常发生在两个器件之间,其中一个作为主机,另一个为从机。主机和从机都能读和写,但从机只能依主机的方向工作。一些IC器件既可作为主机又可作为从机,但 ADS1110只能作为从机。
ADS1110为需要高分辨率测量的应用而设计,在这种应用中,空间和电源消耗是首要考虑的问题。典型应用包括便携式仪器、工业过程控制和小型发送器。ADS1110含有一个2.048V的片内电压基准。该基准通常用作A/D转换器的电压基准;不允许接外部基准。ADS1110只能采用内部电压基准,而且该基准不能直接测得也不能被外部电路使用。
片内基准的规格是ADS1110总增益和温漂规格的一部分。转换器漂移误差和增益误差的规格反映了片内电压基准以及A/D转换器内核的性能。对片内电压基准有单独的规定。
ADS1110 的模/数转换器核由一个差分开关电容△-2调节器和一个数字滤波器组成。调节器测量正模拟输入和负模拟输入的压差,并将其与基准电压相比较,在 ADS1110中,基准电压为2.048V。数字滤波器从调节器接收高速位流,并输出一个代码,该代码是与输入电压成比例的数字。
输出码=
-
- 恒流源电路反馈原理
为了达到准确的电流控制,系统采用ADC电路来采集恒流源中电阻RES2两端的电压,来测量输出电流的大小,通过闭环来调节输出电流的大小,使输出电流接近设定值。ADC芯片选用TI公司的16位ADC芯片ADS1110,ADS1110有一个板上基准和振荡器,ADS1110和单片机通过I2C总线通信。ADS1115采用2.0~5.5V的工作电源,系统的数字电路部分的供电电压是5V,系统中ADS1115的供电电压是5V。ADS1110有4个单独电压测量端,可以组成2个差分输入电压测量。恒流源电路中采样电阻阻值是4Ω,最大输出电流是1A,采样电阻两端电压最大是1V,为了提高测量采样电压的精度,ADS1110的基准电压选择2.048V,该基准电压是通过配置ADS1110寄存器有ADS1110内部产生。同时负载两端的电压经过分压降压后给ADC测量,测量出负载两端的电压[4]。
图 9
图 10 整体电路图
如图所示,DA模块由TLC5615,恒定电压源,以及两个LM358运放组成。恒定电压源为AD转换提供基准电压,第一个LM358运放起到隔离缓冲的作用,第二个运放驱动NMOS管。由于TLC5615具有两倍增益,且精度为10bit,因此其对应电压关系为
其中value为我们在函数中输入的值,Vref为基准电压2.048,计算得出的Vout就是端口输出的电压大小。
图 11
简化后我们需要输出电压Vout时需要输入的函数值为即Vout*250,如果我们需要让TLC5615模块输出1V电压,那么需要在函数中加入参数250即可。恒流电路的主要作用是将数控部分送来的电压转换成恒定的电流输出,提供给负载。转换电路由高精度集成运算放大器LM358、功率场效应管IRF530和采样电阻构成[5],如图所示。将数控部分的模拟输出电压Ui作为LM358的输入量,取样电阻的电压反馈到LM358的反相输入端,该电路构成了典型的电流串联负反馈,根据反馈理论,由于集成运放的开环增益很大,所以该电路为深度负反馈,即输入电压Ui与取样电阻R上的反馈电压Uf相等 由于场效应管源极的电阻为4Ω,因此流过的电流就为[6]
使用ADS1110采集电阻两端的电压,同时使用LM358电压跟随器作为缓冲级采集到的电阻送到VIN+,VIN-接地,构成单端输入。使用IIC与单片机通信,单片机接收信号将电压转换成电流,与设定电流比较,从而达到对电流的反馈控制。
图 12
图 13
LCD1602通过P0口与单片机相连,P0口还需要一个上拉电阻。RS端接P2.6,RW端接P2.5,E端接P2.7。
图 14
如图所示,LCD显示屏中第一行为设定电压值,通过按键加减可改变设定值,第二行为设定值与实际值的误差。
图 15
图 16
程序设计流程图
图 17
PID调节反馈电流
本设计在电流反馈控制中使用了PID来调节,PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。顾名思义,PID控制算法是结合比例、积分和微分三种环节于一体的控制算法,它是连续系统中技术最为成熟、应用最为广泛的一种控制算法,该控制算法出现于20世纪30至40年代,适用于对被控对象模型了解不清楚的场合。实际运行的经验和理论的分析都表明,运用这种控制规律对许多工业过程进行控制时,都能得到比较满意的效果。PID控制的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出[7]。
闭环控制是根据控制对象输出反馈来进行校正的控制方式,它是在测量出实际与计划发生偏差时,按定额或标准来进行纠正的。比如控制一个电机的转速,就得有一个测量转速的传感器,并将结果反馈到控制路线上。提到闭环控制算法,不得不提PID,它是闭环控制算法中最简单的一种。PID是比例 (Proportion) 积分 ,(Integral) 微分 ,(Differential coefficient) 的缩写,分别代表了三种控制算法。通过这三个算法的组合可有效地纠正被控制对象的偏差,从而使其达到一个稳定的状态[8]。
如图所示,set_DA为设定输出电压值,cha为实际值与设定值的差,如果差值大于1,则设定值=设定初始值-0.001倍的差(PID中的P比例部分)+0.001倍的当前时刻的差值与上一时刻的差值的差(即PID中的D微分部分)。
按键扫描
本系统采用外部中断1来实现实时扫描,使程序及时响应按键请求而无需顾虑其它程序模块运行情况。然后判断按键是否按下,在检测到有键按下时,执行一个延时程序后,再确认该键电平是否保持闭合状态电平。若仍保持闭合状态电平,则确认该键处于闭合状态,从而消除了抖动影响。根据不同按键执行不同的功能。键盘中断子程序流程图如图4-3所示。
图 18
图 19
如图所示,当设定值为250mA时,误差为0.248mA,相对误差为0.0992%。
图 20
如图所示,当设定值为500mA时,误差为0.301mA,相对误差为0.0602%。
图 21
如图所示,当设定值为750mA时,误差为0.074mA,相对误差为0.0098%。
图 22
如图所示,当设定值为1000mA时,误差为0.176mA,相对误差为0.0176%。本设计最大支持到1000mA。
图 23
本实验的目的是设计和仿真一个数控恒流源,利用Proteus软件和89C51单片机实现输出电流的设定、显示和控制。实验中采用了场效应管作为恒流源的核心元件,TLC5615作为数模转换芯片,ADS1110作为模数转换芯片,LCD1602作为显示模块。实验结果表明,该数控恒流源能够在步进步长为1mA,最大电流为1000mA的范围内,向负载提供恒定的电流,并且能够显示设定电流和误差值。实验过程中遇到的困难主要是如何正确配置和使用各个芯片的引脚和寄存器,以及如何优化程序代码和电路布局。通过查阅资料和反复调试,最终解决了这些问题。通过这次实验,收获了以下几点:
了解了恒流源的原理、分类和应用范围。恒流源是一种能够向负载提供恒定电流的电源,在许多情况下是必不可少的。恒流源可以根据主要组成器件的不同分为晶体管恒流源、场效应管恒流源、集成运放恒流源等。恒流源的应用范围非常广泛,例如充电器、测量电路、放大电路、脉冲产生电路、化学加工装置等。
掌握了Proteus软件的基本操作和功能。Proteus是一款功能强大的系统设计辅助类EDA仿真软件,可以对已存在的系统或设想中的不同设计方案在计算机上进行仿真分析,同时与实物试制和调试相结合,从而优化元件参数,提高系统性能,降低设计成本,缩短系统研制周期。Proteus软件包括ISIS(智能原理图输入系统)、ARES(高级布线与编辑系统)、VSM(虚拟系统建模)等模块。
熟悉了89C51单片机的特性和编程方法。89C51是一种低功耗、高性能的8位CMOS微控制器,与80C51引脚和指令系统完全兼容。89C51具有4KB可在线重复编程的快闪擦写存储器、128*8位内部RAM、32条可编程I/O线、两个16位定时器/计数器、可编程全双工串行通道、五个中断源和两个优先级等特性。89C51单片机可以使用汇编语言或C语言进行编程,通过ISP(In-System Programming)或ICP(In-Circuit Programming)方式进行下载。
学习了TLC5615、ADS1110、LCD1602等芯片的工作原理和使用方法。TLC5615是一种具有串行接口的数模转换器,通信采用三线SPI协议,其输出为电压型,最大输出电压是基准电压值的两倍。TLC5615只需使用单5V的电源即可工作,配置简单不需要配置过多的寄存器。ADS1110是一种精密的连续自校准模/数转换器,带有差分输入和高达16位的分辨率,封装为小型SOT23-6。ADS1110使用可兼容的I2C串行接口,在2.7V至5.5V的单电源下工作。ADS1110可每秒采样15、30、60或240次以进行转换,片内可编程的增益放大器提供高达8倍的增益,并且允许以高分辨率对较小的信号进行测量。LCD1602是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符。LCD1602主要是做调试用的,它可以帮助我们显示程序的执行结果,让程序在单片机外部可视化。LCD1602内置了CGRAM和CGROM字模库,里面包含了ASCLL码表的所有字符和一些特殊字符的字模数据,字模数据就是在5*7的点阵里点亮哪几个点可以显示其相应的字符,再由引脚控制输出在哪个位置上,即可完成显示丰富多样的内容的任务。
培养了分析问题和解决问题的能力。实验中遇到了如何正确配置和使用各个芯片的引脚和寄存器,以及如何优化程序代码和电路布局等问题。通过查阅资料和反复调试,最终解决了这些问题。在这个过程中,锻炼了自己对问题的分析和定位能力,以及运用所学知识和技能解决问题的能力。
增强了动手实践和创新思维的能力。实验中不仅要求按照设计要求完成基本功能,还要求根据自己的兴趣和想法进行创新性地扩展和改进。通过动手实践,将理论知识与实际操作相结合,提高了自己对电子系统设计的理解和掌握程度。通过创新思维,将自己的想法和创意融入到实验中,增加了实验的趣味性和挑战性。
参考文献
- 陈雷,陈爽.基于Proteus的数控恒流源仿真研究[J].国外电子测量技术,2011,30(02):24-27.DOI:10.19652/j.cnki.femt.2011.02.007.
[2]宋林桂.高精度数控恒流源的设计与实现[J].无线互联科技,2016,No.94(18):59-60+76.
[3]田俊杰,董威,陈静等.基于场效应管的恒流源设计[J].中国测试,2009,35(01):118-121.
[4]吴宁胜.基于MCS-51单片机的数控恒流源设计[J].电子测试,2015,No.317(05):15-17.DOI:10.16520/j.cnki.1000-8519.2015.05.009.
[5]钟乃元,高飞.大电流高精度恒流源[J].电子测量技术,2007,No.161(09):176-179.DOI:10.19651/j.cnki.emt.2007.09.054.
[6]陶林伟,王英民,雷开卓.基于微处理器的精密数控恒流源[J].电子技术应用,2007,No.349(07):138-140.
[7]黄雷,贾兴,于治国等.高稳定度大功率交流恒流源设计[J].国外电子测量技术,2009,28(03):64-66.DOI:10.19652/j.cnki.femt.2009.03.019.
[8]叶建波,朱双东.基于Proteus的单片机电路的虚拟仿真[J].电子工程师,2008,34(11):23-24+67.
附录 完整代码
#include "LCD1602.h"
#include "ADS1110.h"
#include "Timer0.h"
#include "Key.h"
unsigned char keyNumber,key_temp;
sbit CS=P1^0; //片选端口
sbit CLK =P1^1; //时钟端口
sbit DIN=P1^2; //数据输入
sbit S1 =P3^0; // 按键1
sbit S2 =P3^1;//按键2
sbit S3 =P3^2;//按键2
char keyvalue; // 键值
extern u16 value;
extern float volt;
u16 set_DA;
u16 set_DAzhi=1000;设置初始电流值,单位mA 范围0~1000
int set_i;
int real_i;
float cha;
float show_cha;
char aa[10];
int cha_last;
void DA_OUTPUT(unsigned int value); //声明输出电压值函数
// 延时n毫秒
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
// 延时10*n微秒
void delay_10us(unsigned int n)
{
while(n--);
}
void campare()
{
cha = volt*250- set_DAzhi-200; ///电流差值扩大1000倍,让其ma显示为整数
if(cha>1) 输出电流大了
{
set_DA=set_DAzhi-0.001*cha-0.001*(cha-cha_last);///
cha_last=cha;
}
else if(cha<=-1) 输出电流小了
{
set_DA=set_DAzhi+0.001*cha+0.001*(cha-cha_last);
cha_last=cha;
};
}
/
void key_scan(void) //独立键盘扫描函数
{
P3 =0xff;
if((P3&0x0f)!=0x0f)
{
delay_ms(10);
if(S1==0)
{
keyvalue =1;
delay_ms(250);
}
if(S2 == 0)
{
keyvalue =2;
delay_ms(250);
}
if(S3 == 0)
{
keyvalue =3;
delay_ms(250);
}
}
}
void key_1(void) 减
{
set_DAzhi=set_DAzhi-1;
}
/********************
********************/
void key_2(void) 加
{
set_DAzhi=set_DAzhi+1;
}
void key_3(void) ///设定
{
}
void main(void)
{
Timer0Init(); //初始化定时器
LCD_Init();
delay_10us(10);
// LCD_ShowString(1,11,"mA");
// LCD_ShowHexNum(2,1,0xA0,2);
// LCD_ShowBinNum(2,5,0xA5,8);
// LCD_ShowChar(2,14,0xDF);
// LCD_ShowString(1,16,"Welcome to China!");
set_DA=set_DAzhi;
LCD_ShowString(1,2,"set_i=");
LCD_ShowString(1,12,"mA");
LCD_ShowString(2,1,"error=");
//LCD_ShowString(2,9,"0.");
LCD_ShowString(2,15,"mA");
while(1)
{
DA_OUTPUT(set_DA);
delay_10us(1);
Ads1110_value();
campare();
show_cha = cha*0.001;
LCD_ShowNum(1,8,set_DAzhi,4);
//LCD_ShowSignedNum(1,7,cha,10);
sprintf(aa,"%7.3f",show_cha);//浮点型数据转为指定格式的字符串 LCD_ShowString(2,8,aa);
delay_ms(500);
}
}
void Timer0() interrupt 1
{
static unsigned int count = 0;
TL0 = 0x66;
TH0 = 0xFC;
count++;
if(count>200) //每隔20毫秒调用按键扫描函数
{
keyvalue =0;
key_scan(); //按键扫描
switch(keyvalue) //按键值选择
{
case 1 : key_1();delay_ms(10);break;
case 2 : key_2();delay_ms(10);break;
case 3 : key_3();delay_ms(10);break;
default :break;
}
}}
void DA_OUTPUT(unsigned int value)
{
unsigned char i; //定义变量用于循环
value<<=6; //int类型为16位,仅需12位则去掉高4位方便取出
CS=0; //片选端口
CLK=0;
/*循环12次取出12位写入模块寄存器*/
for(i = 0; i < 12; i++)
{
DIN=(bit)(value&0x8000); //取出最高位
CLK=1;
value<<=1;
CLK=0;
}
CS=1;
CLK=0; //恢复默认低电平状态
}
作者:小猪佩奇我配你.