基于PIC单片机的数据采集系统设计

发布者:EnchantedDreams最新更新时间:2020-08-02 来源: elecfans关键字:PIC单片机  数据采集系统  MATLAB 手机看文章 扫描二维码
随时随地手机看文章

基本功能

在本设计中,数据的处理可以使用PC机的MATLAB等功能强大的软件,但是这类现有的数据处理软件并不能对特有的数据采集系统的下位机采集模块进行直接控制,因此需要针对特定的数据采集系统编写对应的上位机软件,上位机软件是针对上述目的而设计与编写的,是整个采集系统的控制前端和数据存储及处理中心。控制功能主要包括控制下位机采集的开始与终止,采集的频率等,数据处理功能主要包括绘制波形图,将数据显示于列表,将数据存储于文件,其中将数据存储于文件将便于使用现有的数据处理软件对数据进行一些数值算法处理,以达到科学研究,结论验证等目的。


开发环境

C++程序设计语言可以很好地实现面向对象的编程思想,采用C++编写上位机程序,可以将每一个功能模块封装成一个类,修改某个类的实现,增加类的功能不会影响整个程序的框架,这样就很容易维护和扩展功能;加之我们要实现的软件功能中需要调用大量的windows API函数库,所以采用VC++6.0作为上位机的开发环境。


程序功能模块划分

总的功能模块主要包括三个模块,即HID设备读写模块,数据采集模块,数据处理模块。

基于PIC单片机的数据采集系统设计

HID设备的查找与读写

(1)枚举

USB主机在检测到USB设备插入后,就要对设备进行枚举了。枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。

(2)HID

人机接口设备(HID)是指直接和人进行互动的设备,如鼠标、键盘等。 在Windows 中,具有相似属性和提供相似服务的设备被归为一种设备类型,一种类型的设备可以使用一个通用的设备驱动程序。 在运行Windows 98 或更高版本的PC 机上,应用程序可以使用操作系统内置的HID 类驱动程序与HID 通信。 这样使得符合HID 类的USB 设备很容易开发与运行。

(3)HID设备的查找

在Windows操作系统中内置很多与HID有关的API函数,调用这些函数,就可以开始对指定的HID设备进行查找,查找HID设备的最终目的是获得该设备的路径名,设备的存取容量等信息,为以后对该设备进行读写做好准备。

基于PIC单片机的数据采集系统设计

(4)HID设备的读写

在取得了HID设备的路径全面后,即可开始对HID设备进行读写,对设备的读写也是通过调用相应的函数来实现的。


控制下位机进行数据采集

上位机向下位机发送命令,控制下位机进行数据采集,并从下位机获取数据,在这个过程中,要处理好两个线程的同步的问题,即数据采集线程和数据处理线程能够协调工作,保正系统能正确稳定的工作。具体的解决方法是实现对某些数据访问的原子操作,即一个线程在对公共数据进行访问时,另一个线程不能打扰,直到操作线程操作完成,放弃对数据的使用权,另一个线程才能够访问数据。


下位机获取了关于采集的有关参数后,即可开始采集,每隔一定时间采集一个数据,当采集数据数目达到限制值个数后,本次采集完成,此时下位机才开始将采集数据发送给上位机。

基于PIC单片机的数据采集系统设计

上位机对采集的数据的处理

上位机在将数据采集命令发送给下位机后,所要做的就是等待下位机采集完成并接收数据,因此上位机将循环查询下位机工作状态,一旦检测到下位机采集结束的标志,上位机就开始对数据进行处理。


数据处理分为三种:

(1)绘制波形图

绘制波形图的要求有两点:第一是不能频繁闪烁,影响观察;二是波形图是动态的,因为绘制区域有限,而所采集的数据是源源不断增加的,因此要求波形图能够动态的更新。

(2)添加到列表显示

可直观地查看目前所采集的所有数据。

(3)保存到文件

运用功能强大的数据处理软件对数据进行更深的处理。


界面显示

采集单极性正弦波工作界面

基于PIC单片机的数据采集系统设计

代码:

1 HID设备通信模块实现代码/*hid.h头文件*/

2 #ifndef HID_H

3 #define HID_H

4 #include

5 #include

6 #include

7 #include “commonuse.h”

8 using std::string;

9 #pragma comment( lib, “setupapi.lib” )

10 extern “C” {

11 #include “hidsdi.h”

12 }

13 #pragma comment( lib, “hid.lib” )

14

15

16 class Hid

17 {

18

19 public:

20 Hid(const string &DeviceIdStr = MY_DEVICE_ID);

21 //Hid(DWORD Vid, DWORD Pid) {}

22 ~Hid() ;

23 BOOL Connect() ;

24 //BOOL ChangeDevice() {}

25 BOOL WriteHid(const BYTE * WriteBuff);

26 BOOL ReadHid(BYTE * ReadBuff);

27 BOOL IsWriteValid() const { return m_WriteValid ; }

28 BOOL IsReadValid() const { return m_ReadValid ; }

29 BOOL IsConnected() const { return m_IsConnected; }

30 const string & GetDeviceIDDesc() const { return m_DeviceIdStr ;}

31 private:

32 BOOL GetWRHandle() ;

33 private:

34 HANDLE m_WriteHandle;

35 HANDLE m_ReadHandle ;

36 string m_DeviceIdStr;//设备描述字符串

37 DWORD m_PID;

38 DWORD m_VID;

39 BOOL m_IsConnected ;//是否已连接上

40 BOOL m_ReadValid;//是否可进行读操作

41 BOOL m_WriteValid;//是否可进行写操作

42 BYTE m_RWBuff[USB_BUFF_SIZE+1] ;//读写缓冲

43

44

45 } ;

46

47

48

49 #endif

50

51

52 /*hic.cpp源文件*/

53

54 #include “Hid.h”

55

56 Hid::Hid(const string &DeviceIdStr):

57 m_DeviceIdStr(DeviceIdStr)

58 {

59

60 m_WriteHandle = INVALID_HANDLE_VALUE ;

61 m_ReadHandle = INVALID_HANDLE_VALUE ;

62 m_PID = 0;

63 m_VID = 0;

64 m_IsConnected = FALSE ;

65 m_ReadValid = FALSE ;

66 m_WriteValid = FALSE;

67 strcpy((char *)m_RWBuff,“”) ;

68 }

69

70 BOOL Hid::GetWRHandle()

71 {

72 GUID InterfaceClassGuid =

73 {0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30};

74 HDEVINFO DeviceInfoTable = INVALID_HANDLE_VALUE;

75 PSP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new SP_DEVICE_INTERFACE_DATA;

76 PSP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure = new SP_DEVICE_INTERFACE_DETAIL_DATA;

77 SP_DEVINFO_DATA DevInfoData;

78

79 DWORD InterfaceIndex = 0;

80 DWORD StatusLastError = 0;

81 DWORD dwRegType;

82 DWORD dwRegSize;

83 DWORD StructureSize = 0;

84 PBYTE PropertyValueBuffer;

85 bool MatchFound = false;

86 DWORD ErrorStatus;

87 DeviceInfoTable = SetupDiGetClassDevs(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT “ DIGCF_DEVICEINTERFACE);

88 while(true)

89 {

90 InterfaceDataStructure-》cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

91 if(SetupDiEnumDeviceInterfaces(DeviceInfoTable, NULL, &InterfaceClassGuid, InterfaceIndex, InterfaceDataStructure))

92 {

93 ErrorStatus = GetLastError();

94 if(ERROR_NO_MORE_ITEMS == ErrorStatus)

95 {

96 SetupDiDestroyDeviceInfoList(DeviceInfoTable);

97 return FALSE;

98 }

99 }

100 else

101 {

102

103 ErrorStatus = GetLastError();

104 SetupDiDestroyDeviceInfoList(DeviceInfoTable);

105 return FALSE;

106 }

107

108 DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

109 SetupDiEnumDeviceInfo(DeviceInfoTable, InterfaceIndex, &DevInfoData);

110

111 SetupDiGetDeviceRegistryProperty(DeviceInfoTable, &DevInfoData, SPDRP_HARDWAREID, &dwRegType, NULL, 0, &dwRegSize);

112 Pr


关键字:PIC单片机  数据采集系统  MATLAB 引用地址:基于PIC单片机的数据采集系统设计

上一篇:PIC单片机对机器人的控制程序设计
下一篇:PIC单片机进行AD转换的设计

推荐阅读最新更新时间:2024-11-17 12:59

关于PIC单片机之探讨低功耗
1、睡眠(sleep) 睡眠方式是我们最常用的一种方式来降低功耗,但睡眠期间单片机不能做任何的事情。对于那些没事情就睡着,有事情就做一下的情况睡眠无疑是功耗最低的处理方式。 比如: 睡眠+ I/O电平变化中断唤醒当按键没按下时,单片机睡眠,当按键按下后,执行相应的工作。 睡眠+数据接收中断唤醒这样单片机就可以再没有接收到数据时候进入睡眠状态,接收到数据的时候就唤醒然后处理数据。当然首先单片机要有相关的外设比如SPI ,I2C,USART,等这些支持这些通讯的模块。 睡眠+看门狗唤醒这个可以用在需要定时唤醒做事情的场合 2、降低时钟频率 如果即想功耗低,又想单片机在能低功耗的情况下工作。这无疑是个最好的选
[单片机]
PIC单片机CCS之C语言(#DEVICE的用法)
#DEVICE 语法: #device chip options chip是一个特殊的处理器名字(如:PIC16C74),目的是取得支持设备的当前列表: START | RUN | CCSC +Q Option是设备标准操作的限定句.有效的可选项是: *=5 使用5位指针(适合所有的器件) *=8 使用8位指针(适合14和16位的器件) *=16 使用16位指针(适合14位的器件) ADC=x 这里的x是read_adc()函数返回的位数. ICD=TRUE 产生兼容Microchips ICD硬件调试代码 WRITE_EE
[单片机]
基于CAN总线和DSP的双层数据采集系统的设计
  引言   CAN(Controller Area Network)即控制器区域网,CAN总线是由德国BOSCH公司为实现汽车测量和执行部件之间的数据通讯而设计的、支持分布式控制及实时控制的串行通讯网络。CAN BUS现场总线已由ISO/TC22 技术委员会批准为国际标准IOS11898(通讯速率小于1Mbps)和ISO11519(通讯速率小于125kbps)。CAN总线开始主要应用于自动化电子领域的汽车发动机部件、传感器、抗滑系统等应用中,但随着CAN的应用普及,CAN总线的实时性以及抗干扰能力强等优点也逐步为航天领域所认可。   本文将对CAN总线在航天领域应用情况进行介绍,并在CAN总线和DSP技术研究的基础上,设计了基
[嵌入式]
PIC单片机在智能双电源装置中的应用
作者Email: c8051@21cn.com 1. 智能双电源装置的简介 随着对供电可靠性的要求也越来越高,很多场合用两路电源来保证供电的可靠性。当常用电源异常,智能双电源装置能自动切换到备用电源,智能双电源装置就是这种在两路电源之间进行可靠切换、以保证供电的装置。在医院、宾馆和矿山等有广泛的应用。 智能双电源装置由开关本体和控制器两部分组成。开关本体由电机通过机械联锁机构控制常用电源的断路器和备用电源的断路器的分合,进而控制电源的切换。控制器通过对电压的采样来判断电源是否异常,如果出现异常应产生相应的切换。 2. PIC16F877A的简介 美国Microchip公司的PIC 8位单片机其生产史1
[单片机]
PIC单片机的快速入门指南
  PIC16F616是一款14引脚、8位的CMOS单片机。采用精简指令集,仅有35条指令,由于采用了数据总线和指令总线分离的哈佛总线结构,使得除少量指令不是单周期之外,大部分的指令都是单周期指令。这样有利于提高单片机的运行速度和执行效率。   PIC16F616这款单片机供电电压可以在2V到5.5V之间,内部集成了一个RC振荡器,频率可以配置成8MHZ或者4MHZ,也可以用外部晶振提供时钟。内部集成有AD转换、比较器等硬件模块,还具有上电复位、欠压复位、看门狗、代码保护等功能。三个定时器、PWM发生器等可以由用户编程。下面我来一一介绍关于PIC单片机的这些模块和功能。   1.存储器   PIC16F616分为程序存储其
[单片机]
是德科技 Acqiris MAQS 软件简化多通道数据采集系统的运作
独有的硬件和软件组合能够帮助工程师及科学家探索更多未知数据 是德科技公司(NYSE:KEYS)日前宣布推出全新的 U1092A Acqiris MAQS 多通道采集软件。此应用软件伴随着是德科技的最新技术共同发展,结合最新推出的 M9709A AXIe 8 位高速数字转换器,可为大规模多通道采集系统提供独特的功能特性。 经过验证的 Acqiris MAQS 软件专为大型多通道采集系统而研制,可以通过独立的控制台来完成配置管理,显示数百条通道上的数据。软件的客户端-服务器架构支持远程操作,能够访问分散在局域网内部的多个数据采集系统。这款高密度、紧凑型解决方案目前正在用于研究流体力学、等离子体聚变、粒子物理和微
[测试测量]
基于传感器实验台的数据采集系统设计
传感器原理实验台由一些分立元件组成的电路和指针式仪表构成,实验结果往往不是很稳定,而且以电流、电压形式显示的结果不是很直观。为了提高实验教学质量,将传感器实验台的输出送入计算机进行显示与数据处理。该系统人机界面友好,操作简单方便,已成功地应用于实验教学中,且效果良好。 1 总体设计 数据采集系统原理图如图1所示。 该系统采用PCIl711数据采集卡作为PC机与传感器实验台之间的接口。 2 系统介绍 数据采集系统采用Visual Basic 6.0实现,该系统能够对CSY传感器实验台的实验数据进行采集存储、处理以及图形显示等操作。参数设定设置实验名称、操作学生信息。数据采集分单次采集,连续
[工业控制]
基于FPGA和EPP的图像传感器高速数据采集系统
引言 USB、串口、并口是PC机和外设进行通讯的常用接口,但对于数据量大的图像来说,若利用串行RS-232协议进行数据采集,速度不能达到图像数据采集所需的要求;而用USB进行数据采集,虽能满足所需速度,但要求外设必须支持USB协议,而USB协议与常用工程软件的接口还不普及,给使用带来困难。有些用户为了利用标准并行口(SPP)进行数据采集,但SPP协议的150kb/s传输率对于图像数据采集,同样显得太低。因此,为了采集数据量大的图像数据,本文采用了具有较高传输速率的增强型并行口协议(EPP)和FPGA,实现对OV7620CMOS图像传感器进行高速数据采集,它最高速率可以达到2Mb/s。 硬件电路方案 图1为基于FPGA和EP
[嵌入式]
基于FPGA和EPP的图像传感器高速<font color='red'>数据采集系统</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved