多功能数据采集控制板的设计与实现 - 图文

更新时间:2024-06-27 17:34:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

澳门农业职业技术学院

毕业论文(设计)

课题名称 多功能数据采集控制板的设计与实现 专业及班级 学姓

号 名

指导老师

2014年 5 月 20日

多功能数据采集控制板设计与实现

摘 要

数据采集技术是信息科学的一个重要分支,与传感器技术,信号处理技术,计算机技术共同构成了现代检测技术的基础,它研究信息数据的采集,存储,处理及控制等,广泛地应用到测量,监测,控制,诊断,技术试验等各个领域中。

多功能数据采集控制板是针对目前各种电子类产品研发机构实验室测控需要而开发的一款性价比极高的控制板。本文主要介绍了控制板接口电路原理、板上器件驱动程序以及上位机用户界面程序的编写原理,重点讨论了SST89E516RD2单片机在该控制板中的应用。

多功能数据采集控制板是基于中低速数据采集设计思想来实现的。本设计采用增强型51内核单片机,利用微处理器的GPIO端口控制板上的功能芯片,进行模拟量采集和输出控制,PWM小功率电机控制,数字量输入输出控制,液晶显示,上下位机通信等常用功能,很好地满足了产品研发过程中的试验测控需要。

关键词 单片机 数据采集 测控 VC++6.0 界面

Multifunction Data Acquisition Controller Design and

Implementation

Abstract

Data acquisition is an important branch of information science, and sensor technology, signal processing technology, computer technology constitute the foundation of modern detection techniques, which research information data collection, storage, treatment and control, widely used to measure monitoring, control, diagnosis, technical testing and other fields.

Multifunction data acquisition control board is a variety of electronic products for the current R & D labs developed a monitoring and control needs of highly cost-effective control panel. This paper details the control panel interface circuit theory, on-board device drivers, and PC user interface program written principles, focused on SST89E516RD2 MCU application in the control panel. Multifunction data acquisition control board is based on the design of low speed data acquisition to achieve. The design uses an enhanced 51 core MCU, use microprocessor control panel features GPIO port chip for analog capture and output control, PWM low-power motor control, digital input and output control, LCD display, upper and lower computer communication and other common functions, satisfy the product development process measurement and control needs.

Keywords MCU Data Acquisition observe and control VC++6.0 Interface

目 录

1 绪论......................................................................................................................................1

1.1 问题提出的背景 ………………………………………………….....................………................….1 1.2 本次设计的数据采集控制板的主要功能和特点………………………………………....................1

2 多功能数据采集控制板芯片选型及方案设计..................................................................2

2.1 微控制器选型方案………………………………………......................……………….……….........3 2.2 模拟输入结构方案……………………………………………………….………...............................4 2.3 通讯模块结构方案…………………………………………......................…………………..............5 2.4 直流电机驱动模块方案……………………………………......................…………………..............5 2.5 液晶显示模块方案……………………………………………......................……………………......6 2.6 数字量输入输出方案………………………………………………......................………………......7 2.7 模拟输出方案……………………………………………………......................………………..........7 2.8 电源方案……………………………………......................………………………………….….........8 2.9 按键和蜂鸣器方案……………………………………….………………......................……….........8

3 整板硬件结构设计..............................................................................................................9

3.1 模拟量采集电路………………………………………………………………........................…........9 3.2 串口通信电路………………………………………………………………….......................….........9 3.3 直流电机驱动电路………………………………………………………….......................…….......10 3.4 液晶显示电路……………………………………………………………………..............................11 3.5 数字量控制电路…………………………………………………………….......................…...........12 3.6 模拟量输出控制电路…………………………………………………………..................................13 3.7 电源电路……………………………………………………………………….............................….13 3.8 按键和蜂鸣器电路………………………………………………………………..............................14 3.9 PCB设计概述…………………………………………………………………..................................15

4 下位机软件设计................................................................................................................16

4.1 模拟量采集驱动程序设计…………………………………….......................…………........……...16 4.2 串口通信驱动程序设计…………………………………………….......................………........…...17 4.3 直流电机驱动程序设计………………………………………………….…...............................…..18 4.4 液晶显示驱动程序设计……………………………………………….……...............................…..21 4.5 数字量控制驱动程序设计…………………….......................…………………..………............….24 4.6 模拟量输出驱动程序设计…………………………........................…….…………………......…...27 4.7 按键和蜂鸣器驱动程序设计…………………………… ……………........................……........….27

5 上位机软件实现......................................................................................................... ......27

5.1 Labview界面程序结构设计...............................................................................................................27

5.2 VC++6.0界面程序结构设计............................................................................................................32

6 控制板运用实例..............................................................................................................37

6.1 Labview界面应用实例…………………………………………………...........................……....37 6.2 VC界面应用实例……………………………………………………….............................……. 39 全文总结………....................................................................................................................................….40

致谢…………………………………………………...........................................................................… 41 参考文献…………………………………………………...................................................................…42

1 绪论

1.1 问题提出的背景

数据采集技术是信息科学的一个重要分支,与传感器技术、信号处理技术、计算机技术共同组成了现代检测技术的基础。数据采集技术正是这些技术的前端,也是信息进行可靠传输和正确处理的基础。数据采集是指将温度、压力、流量、位移等模拟量采集、转换成数字量后,再由计算机进行存储、处理、显示或打印的过程。在生产过程中,可对生产现场的工艺参数进行采集、监视和记录,为提高产品的质量、降低成本提供信息和手段。在科学实验中,可对应用数据进行采集,从而获得大量的动态信息。这是研究瞬间物理过程的有力工具,也是获取科学奥秘的重要手段之一。

数据采集系统的任务,就是采集传感器输出的模拟信号并转换成计算机能识别的数字信号,送入计算机。它将计算得到的数据进行规定要求的处理,以便实现对某些物理量的监视,其中一部分数据还将被生产过程中的计算机控制系统用来控制某些物理量。数据采集系统性能的好坏,主要取决于它的精度和速度,在保证精度的条件下,应尽可能的提高采样速度,以满足实时采集、实时处理和实时控制的要求。

数据采集常用的方式有在PC机或工控机内安装数据采集卡,如A/D卡及RS-422卡、RS-485卡;或专门的采集设备,包括PCI、PXI、PCMCIA、USB,无线以及火线(FireWire)接口等,可用于台式PC机、便携式电脑以及联网的应用系统中。

随着现代电子技术的飞速发展,数据采集技术也日新月异,特别是小型化、便携式解决方案在数据采集中开始占据越来越多的比重,并越来越多地倾向于低电压、低功耗、微型化设计,有的小型数据采集器甚至小到可以放进衬衫口袋里。目前,一些市场上出售的小型数据采集器实际上就是全功能的计算机。它们功能强大,具有现场实时数据采集、处理功能的自动化设备,具备实时采集、自动存储、即时显示、即时反馈、自动处理、自动传输功能;为现场数据的真实性、有效性、实时性、可用性提供了保证,并能方便输入计算机,已广泛应用在工业、农业、商业、交通、物流、仓储等行业。因此,根据当前数据采集发展的实际情况,研制开发符合生产需要的多功能智能化的数据采集器具有重大的现实意义。

1.2 本次设计的数据采集控制板的主要功能和特点

本次研发的数据采集系统是基于增强型51内核单片机SST89E516RD2设计的,51内核单片机兼容性好,可以根据需要更换其他品牌的单片机,如STC89系列等。该数据

采集系统利用上位机串口进行数据传送和下位机控制,系统的主要特点是,极具实用性,保护电路完备,使用方便,功能多,性价比高。根据实际测控需要设计如下接口: 1. USB供电口,5V稳压电路,电机电源 2. 11通道的8-12位数据采集接口 3. 1通道的10位模拟量控制接口 4. 8通道的数字量输出控制接口 5. 8通道的TTL输入控制接口

6. 一个蜂鸣器报警电路 可扩展为PWM输出 7. LCD1602显示,可扩展出PWM输出

8. 隔离的L298N电机驱动2路,可以驱动2个30W的直流电机 9. 4个分压独立按键 10. 3个通用UART串口 11. 定时器输入捕获扩展接口

2 多功能数据采集控制板的整体结构及芯片选型

多功能数据采集控制板主要由微控制器、数字量输入输出器件、模拟量输入输出器件、串口通讯模块、直流电机驱动模块、液晶显示及按钮输入模块、电源模块组成。整板实物图如图2-1所示,系统结构图如图2-2所示。

图2-1 数据采集板卡实物图

图2-2 系统结构图

2.1 微控制器选型方案

对于中低速数据采集系统,业界普遍采用8位单片机设计,介于51内核单片机已经在中国风行数十年,业界认可率高,增强型51不论在速度还是功能上都已经满足了设计需要,同时考虑到此次数据采集系统对PWM电机控制和大存储容量的需求,我们选用了SST89E516RD2增强型51单片机,它的特点如下:

1. 片内用户程序空间可达 72K. ,数据空间1K,主频可达40M,支持6T时钟倍速,内置硬件看门狗。

2. 片内 EEPROM数据存储容量可超 64K。 3. 5个通道的硬件 PWM信号输出。 4. 1个 SPI串口。

5. 内嵌电压检测电路,节省外部的电源管理及复位芯片。

6. 在片仿真功能,SOFTICE功能,让开发工程师省掉仿真器,并弥补了专用仿真器不能仿真扩展功能,接触不良,编程不能运行,价格昂贵的缺陷。 7. 在线编程功能.EASYIAP工具软件,让开发工程师省掉编程器。

8. 程序和数据存储空间互补利用,用户程序剩下的 FLASH空间,均可作为数据存储,使用灵活。

9. 三个 16位定时器 /计数器, 全双工增强型 UART ,9个中断源,四个中断优先级。 SST89E516RD2功能框图如下:

图2-3 SST89E516RD2单片机结构

2.2 模拟量输入采集接口结构方案

数据采集系统对采样精度和采样稳定性及多通道的需求,我们采用的是TLC2543I专用数据采集芯片,大多数传感器的模拟量输出电压最大为5V,因此在数据采集通道设计上不采用降压调理电路。为了确保芯片工作的稳定性,我们对其参考电压进行了电容稳压滤波,接口电路设计上我们用单片机的IO口控制芯片的通道选择和转换启停。由于TLC2543I模数转换器采用串行接口控制,大大节约了单片机的引脚资源,为其它板载功能的实现提供了硬件基础,以下是TLC2543I的主要性能指标: 1. 可调的8-12位采样精度

2. 在规定工作温度范围内转换时间10us 3. 11个分时采集模拟量输入通道 4. 固有的采样和保持特性 5. 线性误差 MAX=正负1LSB 6. 可编程LSB/MSB输出 7. 片内系统时钟

8. 可选择的有符号数据输出 9. 针接口针脚定义

2.3 通讯模块结构方案

RS-232是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,命名

为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-232标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议 。目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯。

收、发端的数据信号是相对于信号地,典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3~+12V与-3~-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ,所以RS-232适合本地设备之间的通信。 通常在做测控试验的时候,我们只需要利用单片机原先的串口进行MAX232电平转换后就可以进行与上位机的数据通信,但是在有的时候,需要多台上位机共享一个测控平台,或者利用测控平台的串口与其他测试仪器通讯,因此有必要将原先的一个串口进行扩展。为此系统设计选择了GM8123通用串口扩展芯片,GM8123可以将一个全双工的标准串口扩展成3个标准串口,并能通过外部引脚控制串口扩展模式:单通道工作模式和多通道工作模式,即可以指定一个子串口和母串口以相同的波特率单一的工作,也可以让所有子串口在母串口波特率基础上分频同时工作。该芯片工作在多通道模式下时,子串口能主动响应从机发送的数据,并由母串口发送给主机,同时返回子串口地址。该模式使每个从机的发送要求都能被及时地响应,即使所有从机同时有发送要求,数据也不会丢失,基本实现了主控单元和外设通讯的实时性。该芯片母串口和子串口的工作波特率可由软件调节,而不需要修改外部电路和晶振频率。该芯片的外部控制少,应用灵活,编程使用简单,适用于大多数有串口扩展需求的系统。

2.4 直流电机驱动模块方案

在进行小家电,教育机器人等产品开发的过程中,经常会用到小功率直流电机,进而根据产品需要测试直流电机的最佳运行电压电流参数,速度参数显得及其重要,考虑到测试过程中对调速,正反转,电压电流传感器,速度测试的需要,系统设计采用了L298N功率H桥驱动芯片,配合单片机的IO控制和PWM硬件输出进行电机调速和正

反转控制,由于电机是感性负载,为了减小感性负载对单片机系统的影响,我们采用光耦TLP521对IO引脚进行隔离,同时对电机驱动电路加上续流二极管保护。为了节约单片机的IO引脚,系统设计采用总线驱动的方式,驱动端口占用单片机的一个外部数据存储单元,这样软件上只需要对一个地址进行读写就可以控制电机正反转,方便好用。对于电压电流检测,我们利用采样电阻采样电流信号,电流信号经过稳压滤波后进行同相比例放大再送入模拟量采集器实现电流信号采集,电压信号通过精密电位器分压得到,经过稳压滤波后送入模拟量采集器实现信号采集,由于调速采用PWM斩波技术,因此由采样电阻和电阻分压得到的信号也是斩波信号,不能很好的表现信号的变化趋势,但是利用电容稳压滤波后经过示波器观察发现波形趋势变化情况良好,这样就保证了得到的电压电流信号能够被模拟量采集器可靠采集到,并以数字量的形式真实再现信号的变化趋势。

测速接口设计,系统采用单片机定时器对测速编码器输出脉冲进行定时计数,并在另一个定时器中断中利用单片机串口定时发送转速数据实现。以下是L298N驱动器的结构框图:

图2-4 L298N驱动器结构图

2.5 液晶显示模块方案

人机交互是测控领域中不可缺少的组成部分,为了了解数据采集控制板的工作状态,我们必须通过一些媒介去观察,液晶显示,是最直接的工作状态显示方式,本次设计采用LCD1602液晶显示模块,该模块采用8位并行数据总线,很容易和51单片机的数据总线匹配连接,并且它的驱动程序实现方便,字符显示发生方便,具有很高的性价比,为了简化液晶的驱动程序编写,我们采用单片机IO引脚直接控制液晶,这样也简

化了硬件设计,降低了制作成本。液晶接口还扩展了一路串行12864液晶显示,方便以后要求更高的状态显示需要。该1602液晶的主要技术参数如下: 1.显示容量:16*2个字符 2.芯片工作电压:4.5~5.5V 3.工作电流: 2.0mA(5.0V) 4.模块最佳工作电压: 5.0V 5.字符尺寸: 2.95*4.35(WXH)mm

2.6 数字量输入输出方案

在产品的研发过程中,经常会遇到需要利用数字量对设备进行测控的需要,因此扩展出数字量接口是十分必要的,为了节约单片机的IO引脚,设计上依然采用总线扩展技术,分配两个外部数据内存单元给数字量控制接口,这样读写内存单元就可以控制接口的数字量输入输出,软件控制上简单易用,接口实现是利用373锁存器进行数据锁存,然后,利用138译码器译码地址,输出数据的锁存由另外一片373实现,数据输入用244芯片缓冲后输入,在输入接口设计上,为了便于编码器编码输入,我们采用上拉电阻上拉输入口,这样输入编码就有256种指令了,同时,利用输入接口还可以进行数字键盘控制,可见输入接口的灵活性,实用性很强。

2.7 模拟量输出控制电路

为了节约单片机IO口,同时为了提高模拟量输出精度,本设计采用10位分辨率单通道0-5V输出串行控制DA芯片TLC5615I,它具有缓冲基准输入,具有输出可调至基准电压两倍的输出电压范围,且DAC是单调变化的,器件使用简单,用单5V电源工作,器件具有上电复位功能以确保可重新启动。在接口实现上芯片用单片机的IO引脚直接控制,这样做简化了驱动程序编写。 TLC5615I功能结构如图:

图2-5 TLC5615I芯片结构

2.8 电源方案

数据采集系统要稳定工作离不开一个稳定的系统电源,考虑到普通实验室一般配备计算机和可调开关电源,我们的电源设计采用这样的结构:信号电源和电机电源独立供电,信号电源采用USB接口5V取电,为了保护计算机,我们用500mA的自恢复保险丝限流,同时为了电池取电方便还采用7805稳压芯片提供5V电压,稳压电源经过电容平波和滤波后输出稳定可靠的5V电压,为了防止稳压输入端电源反接导致芯片烧毁,电路采用二极管加上自恢复保险丝的结构防止反接损坏,对于5V信号电源使用,设计建议是如果不做数据采集,建议用计算机USB接口取电,这样很方便,但是,如果需要数据采集,就用7805稳压输出,这样采集的参考电压就很精确,使采集数据更准确。电机电源因为是直流电机电源,首先考虑电源输入端要并联大容量的电解电容和小容量瓷片电容退耦滤波,其次做好限流保护和反接保护,电路依旧用自恢复保险丝和二极管实现,电机电源的设计工作电压7---24V,采用开关电源供给。

2.9 按键和蜂鸣器方案

测控应用中,往往需要在人机交互过程中利用键盘进行工作模式选择,普通的设计思想是利用单片机IO引脚进行输入按键行列扫描,这样设计不仅需要占用不少的单片机引脚,同时在扫描程序编写上也要花费不少时间,给设计带来不方便。为此,本设计提出利用按键和电阻分压,输出4阶电压,然后利用已有的AD转换接口采集电压信号进行按键识别的构想,这样,既不占用剩下不多的IO口,也不用再去编写键盘扫描程

序,一举两得。蜂鸣器是测控时作为阀值报警的好器件,我们利用一路硬件PWM输出驱动PNP三极管实现蜂鸣器驱动,这样不仅可以节约CPU处理时间,也可以扩展出一路PWM接口外用,使用更方便。

3 整板硬件结构设计

3.1 模拟量采集电路

数据采集器工作在分时采集的状态下,其工作电源可以通过短接帽使能,输入通道分配5V电源作为传感器电源,方便使用,其引脚分配和原理图如图3-2所示。

图3-2 模拟量数据采集器原理图

数据采集器在PCB设计时,要注意模拟量输入通道的连线要短而整齐,注意退耦电容和滤波电容要离芯片电源尽可能的近。

3.2 串口通信电路

串口通信采用单串口扩展为3串口的形式,采用GM8123扩展出COM1,COM2,COM3三个串口,COM3为默认的选通串口,可以进行上位机通信和程序下载以及程序在线调试,COM3还配置监控LED,用于对通信是否成功提供依据和通信状态指示,COM1和COM2是没有电平转换芯片的,直接TTL电平UART通信口,采用USB口做接口,方便和其他单片机通信或者经过电平转换后和485通信设备或PC机通信,GM8123有外置12M晶振,因此同样需要在PCB设计时避免信号走线经过外置晶振,同时晶振周围铺铜接地,具体电路实现和PCB如图3-3、3-4所示。

图3-3 串口1、2原理图

图3-4 串口 3原理图

3.3 直流电机驱动电路

直流电机驱动电路配备电压电流传感器模块,此模块提供电机的单向电压电流测试,不能在测试的时候反转,如果反转,测试的数据是不正确的。由于在一般电机应用中对速度和方向的控制需要比较多,因此,电流传感器和电压传感器是独立的,在使用的时候,需要将传感器输出引线接到模拟量采集通道上,这样设计方便了测控应用中根据需要去改动有限的采集接口,增加了数据采集的灵活性。电机驱动的正反转信号由138译码器选定的外部内存地址输出锁存得到,调速信号由芯片使能端的PWM信号控制,具体原理图如图3.5、3.6、3.7所示:

图3-5 电机驱动原理图

图3-7 电流信号放大原理图 图3-6 正反转控制原理图

3.4 液晶显示电路

液晶显示接口电路如图3-8所示。液晶显示部分分配背光可调的PWM调节,通过PWM调节可以调节液晶的亮度,同时,液晶还有一个对比度调节电位器,在字符数字显示不清晰的情况下,通过调节电位器可以使液晶显示更清晰。

图3-8 液晶显示原理图

1602液晶显示PCB设计的时候强调8位数据总线的布局,布线整齐,规划线路长短一致,这样可以保证繁忙的数据线信号完整性。

3.5 数字量控制电路

图3-9 数字量输入原理图

图3-9是经过10K电阻上拉的数字量输入接口,一般情况下用DIP8封装的编码器安装插入后就可以使用。

图3-10 数字量输入原理图

上图3-10是经过373锁存器锁存后的TTL数字量输出接口。

3.6 模拟量输出控制电路

模拟量输出电路参考电压为2.5V,因此可控的电压输出为0-5V,10位分辨率,在PCB

设计时为了加强信号线的抗干扰能力,布线时绕过了晶振电路,电路原理图如图3-11所示。

图3-11 模拟量输出原理图

3.7 电源电路

电源电路设计的时候充分考虑了电源的反接,限流保护和LED电源指示功能,同时在PCB设计的时候,特别加宽了电源地和VCC,VMOTOR2等布线网络的走线,这样电路的过流能力就变大了,同时地线加宽有助于降低系统的公共耦合阻抗,这样系统的抗干扰性能也加强了。具体电路如图3-12、3-13、3-14所示:

图3-12 稳压电源原理图

图3-13 USB口电源原理图

图3-14 电机电源原理图

在PCB设计中,电源是集中布局在一起的,电源的输入输出从左到右布局,这样的设计使得PCB走线放置变得容易实现。

3.8 按键和蜂鸣器电路

按键和蜂鸣器电路实现简单,如图3-15所示:

图3-15 按键与蜂鸣器原理图

PCB布局的时候将蜂鸣器和按键布局在控制板的外围,这样按键方便,同时减少了蜂鸣器对系统的干扰。

3.9 PCB设计概述

数据采集系统是否能稳定工作,很大程度上取决于PCB板器件的布局和走线是否合理规范。本多功能数据采集控制板的布局布线设计原则如下:

1. 所有接插件都放置在控制板外围,这样做使接插件链接方便 2. 相关元件集中放置,可以尽量减少走线长度

3. 输入元件和输出元件分开放置,避免信号交叉干扰,影响信号质量 4. 大功率器件预留散热片空间,便于安装散热片 5. 所有芯片到单片机的引脚控制线最短 6. 芯片位置横平竖直,元件排列整齐

7. 数据总线输入输出分别集中,信号流向分明

8. 双面板布线,没有布线的地方全部铺铜接地,增强板子抗干扰能力,提高EMC 9. 所有芯片退耦旁路电容均放置最近 10. 标注所有接口标记号,方便接口使用 以下图3-16是设计制作的PCB整板。

图3-16 采集卡PCB板图

4 下位机软件设计

4.1 模拟量采集驱动程序设计

软件编写的晶振为11.0592M,上位机通讯波特率19200。函数输入参数:0x00__0x0a

代表0至10通道选择。函数输出参数:

#include \#include

#define Uchar unsigned char #define Uint unsigned int #define Ulong unsigned long

//TLC2543接口定义

#define csport P4 //定义片选端口 sbit CLK = P1^3; //时钟口线

sbit ADR = P1^2; //地址输入口线 sbit OUT = P1^1; //数据输出口线

Uint read2543(Uchar port)//0x20-0x90 2-9通道 {

Uint ad; //ad装的是12位AD数据 Uchar i;

csport = 0x00; //设置片选为低. CS下降沿开始转换和传送过程 CLK = 0; //清I/O时钟 ad = 0;

_nop_(); //为了减小CS输入端的噪声引起的误差而延时 _nop_();

for(i = 0;i < 12;i++) //在12个时钟的驱动下,输入通道地址等,输出AD转换结果 {

ad <<= 1; //ad左移一位

if(OUT) //OUT:数据输出口线。在第一个输出数据位之后的每个后续位由后续的CLOCK时钟下降沿输出

ad |= 0x01; //在使用CS时钟的传送,第一个输出数据位发生在CS的下降沿

ADR = (bit)(port & 0x80); //ADR:地址输入口线. DATA INPUT在前8个时钟的上升沿被移入器件.在前8个时钟之后,DATA INPUT便无效 _nop_();

CLK = 1; //CLK:时钟口线,以产生时钟上升沿 _nop_(); CLK = 0; //CLK:时钟口线

port <<= 1; //port左移一位 }

csport = 0xff; //设置CS片选为高,以便启动下一次的AD转换

return ad;

}

4.2 串口通信驱动程序设计

串口程序默认用扩展串口的COM3收发,如果需要更换串口,可以在线更换为COM1、COM2。

串口选择函数如下:

#include #include\//单通道模式

void S_com1(void) //选择串口1 {

STADD0=1; STADD1=0;

SRADD0=1; SRADD1=0; }

void S_com2(void)//选择串口2 {

STADD0=0; STADD1=1;

SRADD0=0; SRADD1=1; }

选择好串口以后就可以利用串口收发函数进行数据传送了 串口收发函数及其初始化函数如下:

#include \#include \

void initrs485(void) //通讯寄存器初始化 {

TMOD=0x22; TL1=0xfd; TH1=0xfd; SCON=0x58;

PCON=0x80; //默认波特率19200,0x00=9600 TR1=1;

EA=1; //允许接收中断 ES=1;

PS=1; }

void sendbyte(char x) //输入参数待发送数据 { SBUF=x; while(!TI); TI=0; }

char receivebyte() //查询方式接收,返回接收数据 {

Uchar y; while(!RI); y=SBUF; RI=0; return y; }

4.3 直流电机驱动程序设计

系统在设计的时候利用了0,1两路PWM输出来调速电机,还有两路2,3分配给蜂鸣器和LCD1602背光调节,因此在调节蜂鸣器声音和LCD亮度的时候只需要调用PWM发生器初始化,调用电机函数的2,3编号PWM即可,具体函数实现如下:

//*****************************************************************************

#include \#include \#include \//#include //#include

char xdata MotorOutPort _at_ 0x1F; //电机的控制端口 static union MOTOR_REG data motordir={0xff}; // motordir={0xff};

/***************************************************** 功能:motorinit 描述:电机初始化 参数:无 返回:无

*****************************************************/ void motorinit(void) { CMOD=0x02; CCAP1L=0x00; CCAP1H=0x00; CCAP2L=0x00; CCAP2H=0x00; CCAP3L=0x00; CCAP3H=0x00; CCAP4L=0x00; CCAP4H=0x00; CCAPM1=0x42; CCAPM2=0x42; CCAPM3=0x42; CCAPM4=0x42; MotorOutPort=motordir.all; }

/***************************************************** 功能:电机控制 描述:电机驱动函数

参数:电机号0-3,方向,速度,只用了0,1编号PWM 返回:无

*****************************************************/ void setmotor(Uchar motor,Uchar dir,Uchar speed)//速度0~255 { if (motor<0) motor= 0; if (motor>3) motor= 3; switch(motor)//根据电机编号进行设置 { case 0: if(dir) //首先设定方向 { motordir.bits.motor11=0; motordir.bits.motor12=1; } else

{

motordir.bits.motor11=1; motordir.bits.motor12=0; } CCAP1L=speed; //然后设定速度 CCAP1H=speed; break; case 1: if(dir) {

motordir.bits.motor21=0; motordir.bits.motor22=1; } else {

motordir.bits.motor21=1; motordir.bits.motor22=0; } CCAP2L=speed; CCAP2H=speed; break; case 2: if(dir) {

motordir.bits.motor31=0; motordir.bits.motor32=1; } else {

motordir.bits.motor31=1; motordir.bits.motor32=0; } CCAP3L=speed; CCAP3H=speed; break; case 3: if(dir) {

motordir.bits.motor41=0; motordir.bits.motor42=1; } else {

motordir.bits.motor41=1;

motordir.bits.motor42=0; } CCAP4L=speed; CCAP4H=speed; break; default: break; } MotorOutPort=motordir.all; }

void stopmotor() //停止电机运转 { MotorOutPort=0x00; }

4.4 液晶显示驱动程序设计

液晶显示函数比较复杂,在使用的时候要注意延时函数的搭配,具体实现如下:

#define Uchar unsigned char #define Uint unsigned int #define DATA_PORT P0

sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2;

sbit P1_5 = P1^5;

sbit BLK = P1^6; //P16:LCD1602液晶背光控制引脚

void lcd_busy(); //液晶忙检测函数

void lcd_wcmd(unsigned char cmd, bit Check);//写液晶命令函数 void lcd_wdat(unsigned char dat);//写数据函数 void lcd_init();//液晶初始化

void lcd_pos(unsigned char xpos, unsigned char ypos);//液晶显示定位 void wr_string(unsigned char str[]);//写字符函数 void delayNOP() {

_nop_(); _nop_(); _nop_(); _nop_(); }

/**********************************************************

ms延时子程序

**********************************************************/ void delayms(unsigned int ms) {

unsigned char k; while (ms--) {

for (k = 0; k < 114; k++) ; } }

/********************************************************** 检查LCD忙状态

lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据。

**********************************************************/ void lcd_busy() {

bit busy; busy = 1; while (busy) {

LCD_RS = 0; LCD_RW = 1; LCD_EN = 1;

busy = (bit)(DATA_PORT &0x80); delayNOP(); }

LCD_EN = 0; }

/********************************************************** 写指令数据到LCD

RS=L,RW=L,EN 下降沿执行写操作。D0-D7=指令码。 Check=1,进行忙检测。

**********************************************************/ void lcd_wcmd(unsigned char cmd, bit Check) {

if (Check)

lcd_busy(); //进行忙检测

LCD_RS = 0; LCD_RW = 0;

LCD_EN = 1;

DATA_PORT = cmd; delayNOP(); LCD_EN = 0; }

/********************************************************** 写显示数据到LCD

RS=H,RW=L,EN 下降沿执行写操作。D0-D7=数据。

**********************************************************/ void lcd_wdat(unsigned char dat) {

lcd_busy(); //进行忙检测 LCD_RS = 1; LCD_RW = 0; LCD_EN = 1;

DATA_PORT = dat; delayNOP(); LCD_EN = 0; }

/********************************************************** LCD初始化设定

**********************************************************/ void lcd_init() {

delayms(15);

lcd_wcmd(0x38, 0); //16*2显示,5*7点阵,8位数据 delayms(5);

lcd_wcmd(0x38, 0); //不进行忙检测,强制执行三次。 delayms(5);

lcd_wcmd(0x38, 0); delayms(5);

lcd_wcmd(0x38, 1); //进行忙检测 delayms(5);

lcd_wcmd(0x0c, 1); //显示开,关光标 delayms(5);

lcd_wcmd(0x06, 1); //移动光标 delayms(5);

lcd_wcmd(0x01, 1); //清除LCD的显示内容 delayms(5); }

/********************************************************** 设定显示位置

**********************************************************/ void lcd_pos(unsigned char xpos, unsigned char ypos) {

if (ypos == 0x01)

lcd_wcmd((xpos | 0x80), 1); if (ypos == 0x02)

lcd_wcmd((xpos | 0xc0), 1); }

/********************************************************** 写字符串子函数

**********************************************************/ void wr_string(unsigned char str[]) {

unsigned char num = 0;

while (str[num]) {

lcd_wdat(str[num++]); delayms(150); } }

4.5 数字量控制驱动程序设计

输入函数如下: #include \

Uchar pdata DigInPort _at_ 0x5f; //分配输入端口地址

/***************************************************** 功能:digin

描述:数字量输入函数 参数:通道号 返回:数字量

*****************************************************/

Uchar digin(Uchar chanel) { Uchar diginval; Uchar i; diginval=DigInPort; for(i=0;i

diginval>>=1; } diginval&=0x01; return diginval; }

/***************************************************** 功能:diginal

描述:数字量输入函数 参数:无

返回:所有输入通道值

*****************************************************/

Uchar diginall(void) {

Uchar val; val=DigInPort; return val; }

数字量输出控制函数如下:

//*****************************************************************************

#include \ #include \#include \

Uchar pdata DigOutPort _at_ 0x3f; //分配输出地址

/***************************************************** 功能:digout

描述:数字量输出函数 参数:通道号,输出值 返回:无

*****************************************************/

void digout(Uchar chanel,Uchar val) { static union DIGOUT_REG data digoutval={0xff}; switch (chanel) { case 0: digoutval.bits.digout0=val; break;

case 1: digoutval.bits.digout1=val; break; case 2: digoutval.bits.digout2=val; break; case 3: digoutval.bits.digout3=val; break; case 4: digoutval.bits.digout4=val; break; case 5: digoutval.bits.digout5=val; break; case 6: digoutval.bits.digout6=val; break; case 7: digoutval.bits.digout7=val; break; default: break; }

DigOutPort=digoutval.all; }

/***************************************************** 功能:setdigout

描述:数字量输出函数 参数:所有通道值 返回:无

*****************************************************/ void setdigout(Uchar val) {

DigOutPort=val; }

4.6 模拟量输出驱动程序设计

#include //接口定义 sbit DA = P3^3; sbit CK = P3^4;

sbit CS = P3^5;

//输入参数0-4096=输出0-5V电压 void da5615(unsigned int da) {

unsigned char i;

da <<= 6;//10有效数据左对齐 CS = 0; CK = 0;

for (i = 0;i < 12;i++) {

DA = (bit)(da & 0x8000); CK = 1; da <<= 1; CK = 0; }

CS = 1; CK = 0; }

4.7 按键和蜂鸣器驱动程序设计

按键由于采用4阶电压输出的形式,因此、在使用的时候,只需要把输出接到AD转换通道,再采集按键输出电压就可以识别按键,使用简单,在此不再陈述。

蜂鸣器在驱动的时候先进行电机初始化,然后使用setmotor(3.1,255)函数即可,注意只要选择3号PWM输出,调节最右边参数即可,中间参数不考虑。

5 上位机软件实现

5.1 Lab view界面程序结构设计

NI Lab VIEW是一种图形化的编程语言,用于快速创建灵活的、可升级的测试、测量和控制应用程序, 选择Lab VIEW开发测试和测量应用的一大决定性因素是其开发速度。通常,使用Lab VIEW开发应用系统的速度比使用其它编程语言快4到10倍。这一惊人速度背后的原因在于Lab VIEW易用易学,它所提供的工具使创建测试和测量应用变得更为轻松。节省宝贵的开发时间直接促进了利润的提高――产品上市周期得以缩短。Lab VIEW是一种功能齐全的图形化编程语言,拥有所有通用编程环境的标准功能,如数据结构、循环结构和事件处理。Lab VIEW还有一个内置编译器,可在编辑时间编译所有代码。与其他通用编程语言不同的是,Lab VIEW专为工程师和科学家设计,

其内置高级的函数、助手和工具。Lab VIEW并不仅仅是一门编程语言,Lab VIEW以其获得专利的数据流编程模式摆脱了基于文本编程语言的顺序架构桎梏。其高度直观的图形化代码适于已习惯使用程序框图和流程图的工程师和科学家。综上所述Lab VIEW的实用性强,入门使用简单,因此上位机软件采用Lab VIEW设计编写。 5.1.1 16位数据采集分析,界面解析

为了配合多功能数据采集板的上下位机通信和数据采集需要,我们利用labview8.6编写PC机应用软件,在界面上设计了串口选择,波特率调节,8通道波形显示,8通道数据保存等功能,在界面软件的设计上,我们利用FIFO队列技术,对串口采集的数据进行缓冲,增强了数据收集显示的实时性。对于保存好的数据,我们往往需要调用查看,为此界面还分配了文本数据还原成波形显示的功能,这样使用者就能利用再现的波形观察参数的变化趋势,对测控结果归纳总结,由于图形化语言的篇幅很大,这里给出VI层次机构图如下5-1所示:

图5-1 VI层次机构图

图5-2 VI采集界面图

文本数据还原成波形的界面如下图5-3所示:

图5-3 波形图

5.1.2 串口控制界面解析

为了突出本多功能数据采集控制板的控制功能,系统设计了基于串口的控制界面,

用户只需要根据使用要求编写好下位机固件,然后按照规定操作界面即可控制下位机,串口控制界面功能比较多,采用的设计结构为条件选择结构,当需要某个功能时,用户在菜单里选取即可,界面配置的功能概述如下: 1. 16位或者8位数据发送 2. 指令发送 3. 参数同时发送 4. 文本数据连续发送 5. 串口参数配置

6. 单通道数据保存和波形显示 7. 通道数据显示

由于控制界面的程序篇幅大,部分程序片段如下图5-4、5-5、5-6、5-7所示:

图5-4 串口波特率配置VI结构图

图5-5 单通道数据接收和显示VI结构图

图5-6接收数据存为文本的VI图

图5-7制作完成的串口控制界面

5.2 VC++6.0界面程序结构设计

5.2.1 VC++6.0软件串口编程介绍

VC++ 6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC 开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三是使用Microsoft Visual C 的通信控件(MSComm)。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种方法需要了解硬件电路结构原理;第三种方法比较方便,好用,只需要对串口进行简单配置,利用事件驱动的编程原理进行各种事件的响应处理,再根据下位机固件的需要编写通信协议即可。

5.2.2 VC++6.0电机参数显示界面

MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面就结合“电机参数显示界面”说明该类应用方法和界面程序结构设计思路。

图5-8程序设计界面

可以看到整个界面是一个MFC对话框,界面上嵌入了按钮,显示框,滑动条和一些修饰控件,该界面配备的功能概述如下: 1. 串口选择和配置功能 2. 指令按钮发送和定时发送 3. 电压,电流,转速,力矩数据显示 4. 十进制十六进制切换显示功能 5. 电机启动和停止指令发送 6. 滑动条0-255数据发送 7. 参数保存为文本功能

界面采用VC软件的MFC编程方法,首先制作了基本对话框,然后拖拽控件到对话框,最后针对不同的事件对不同的类进行操作,由于程序代码篇幅比较大,现在只给出最重要的串口接收事件函数解析,具体代码实现如下:

void CSCommTestDlg::OnComm() // 串口事件处理函数 {

// TODO: Add your control notification handler code here

//写入数据到记事本

static UINT VP=0; static UINT VI=0; static UINT VS=0; UINT ZHUANJU=0; CString TEMP;

static BYTE count3=0; VARIANT variant_inp; COleSafeArray safearray_inp;// 读取 发送的数据位于 安全数组的 一个指针的指向 内存中 LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integer that is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { variant_inp=m_ctrlComm.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray 型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k

if(!switch_display) //FALSE 正常显示 { if(m_ctrlHexDisplay.GetCheck())//注意此处的复选开关控件变量的使用 选用哪种显示方式 strtemp.Format(\\//02X将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔 单片机发送十六进制数据 else strtemp.Format(\将字符送入 //m_strRXData+=strtemp; //加入接收编辑框对应字符串

m_strRXData=strtemp+m_strRXData;//新接收的数据为第一个 m_cstring_volut=\正常显示的时候3参数显示为空

m_cstring_speed=\ m_cstring_current=\ }

else //3参数显示 { ++count3; if(count3==1) { VP=bt; strtemp.Format(\ // m_cstring_volut+=strtemp; //单片机发送一帧的第一个参数为电压 m_cstring_volut=strtemp+m_cstring_volut; }

if(count3==2) { VI=bt; strtemp.Format(\ // m_cstring_volut+=strtemp; //单片机发送一帧的第一个参数为电压 m_cstring_current=strtemp+m_cstring_current; }

if(count3==3) {

VS=bt; strtemp.Format(\ // m_cstring_volut+=strtemp; //单片机发送一帧的第一个参数为电压 m_cstring_speed=strtemp+m_cstring_speed;

本文来源:https://www.bwwdw.com/article/tzr3.html

Top