第6节 应用实例:基于STM32的数据采集器
推荐给好友
打印
加入收藏
更新于2008-11-21 13:22:22

5.6 应用实例:基于STM32的数据采集器
随着数据采集需求的不断变化,传统的纯硬件采集器系统在数据处理方面能力的不足越来越明显,现在数据采集系统多采用软硬件结合的方式,USB总线凭借其即插即用、热插拔以及较高的传输速率等优点,成为PC机与外设连接的普遍标准。STM32微控制器片上集成了全速USB 2.0接口,而且提供诸如SPI等多种通信接口,这些特性使得STM32 MCU成为数据采集器的核心的首选。这里我们将介绍了一个基于STM32微控制器的数据采集器的设计与实现。

5.6.1 硬件设计
数据采集器以一片STM32F103C8为主体,通过一片MAX1270完成A/D转换。STM32微控制器通过SPI接口与MAX1270相连,通过USB接口与PC主机相连。
1. STM32F103C8
STM32F103C8是属于STM32F103xx系列中的一块微控制器芯片。片上带64K Flash和10K SRAM。据有USB2.0全速接口、2个SPI接口和多个定时器。关于该系列芯片特点、结构、编程使用的更多信息请参考本书第二章 STM32 系列微控制器和第三章 STM32系统微控制器存储器和外设。
2. 数据采集芯片MAX1270
MAX1270是8通道、多量程双极性输入、串行输出、逐次逼近型12 位AD转换器。其封装形式有24脚Narrow PDIP和28脚SSOP两种。我们这里采用的是PDIP封装,其引脚排列如图1所示。各有用引脚功能如下:


1-VDD,+5V电源输入端;2、4-DGND,数字地;5-SCLK,串行时钟输入端;6-/CS,片选输入端,低电平有效;7-DIN,串行数据输入,即AD转换控制字输入端;8-SSTRB,串行数据输出选通输出端;10-DOUT,串行数据输出端;11-/SHDN,掉电模式控制输入端,低电平有效;12-AGND,模拟地;13~20-CH0~CH7,模拟信号输入端;21-REFADJ,参考电压输出/外部调节输入;23-REF,参考电压缓冲输出/ADC的参考输入。
MAX1270的控制字
MAX1270的8位控制字及其功能如表1所示。最高位START为起始位(高电平),标志控制字的开始。/CS为低电平期间,控制字在时钟脉冲SCLK作用下先高位后低位通过DIN端输入。


BIT7(MSB) BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
START SEL2 SEL1 SEL0 RNG BIP PD1 PD0
时钟模式与转换速率
PD1PD0为掉电/时钟模式选择位。PD1PD0=10、11时为省电模式。正常工作时MAX1270有外部时钟与内部时钟两种工作模式。PD1PD0=01时为外部时钟模式,串行数据的移入、移出以及数据采集、转换都由SLCK端的输入脉冲控制。外部时钟模式分为25SCLK/s和18 SCLK/s两种方式,后者转换速率稍快的原因是在全部数据转换期间/CS始终维持有效电平。我们这里采用18 SCLK/s的外部时钟模式,其采样时序图如图5.90所示。


通道选择与输入范围
SEL2~SEL0为通道选择位,000~111分别选择输入通道CH0~CH7。RNG~BIP为输入范围选择位,MAX1270有4种输入范围。RNG~BIP置00时 0~5V单极性输入, 置01时0~+10V单极性输入; 置10时 -5~+5V双极性输入;置11时-10~+10V双极性输入。
传输函数与输出数据格式
对单极性输入,1LSB=FS/4096,输出数据为12位二进制码。对双极性输入,1LSB=FS/2048,输出数据为12位二进制补码。
参考电压
MAX1270可使用芯片内的4.096V参考电压,也可使用外部参考。这里我们将使用内部参考电压。
3. 系统结构框图


STM32微控制器起到连接PC和MAX1270的作用。PC通过USB总线下传用户命令,微控制器通过SPI总线与MAX1270通信,包括发送命令字和收集采样数据。由于MAX1270自身不带采样率控制,所以必须通过STM32微控制器的定时器来触发采样操作,从而实现采样率的控制。STM32微控制器同时将采样得到的数据通过USB总线上传到PC。具体的连接可参见图5.92 数据采集器原理图。



5.6.2 软件设计
在本系统中,软件设计分为三个部分:固件设计,USB驱动设计和PC程序设计。
1. 固件(firmware)设计
固件需要完成的任务包括两方面,一是与PC的数据交互,二是采样控制。
1) 与PC的数据交互:通过USB接口实现。STM32F103C8嵌入的USB2.0接口支持全速12Mbit/s。有8个可配置端点。端点支持控制传输、同步传输和批量传输多种模式。在这里我们将实现2个批量传输,端点1用于批量传输IN,端点2用于批量传输OUT(注意:端点0总是用于单缓冲模式下的控制传输)。传输的数据内容主要包括下传的控制命令和上传的采样数据。其中控制命令主要是开始采样和停止采样,开始采样命令中带有三个参数,通道、采样范围和采样率。
2) 采样控制:微控制器通过SPI1与MAX1270连接,MAX1270自身不带有控制功能,是通过在其DIN引脚上传入命令字(其格式说明参见MAX1270介绍章节)进行采样的。命令字中需要的配置参数(通道和采样范围)是由PC下传的控制命令决定的。而采样率控制是通过微控制器的一个定时器TIM2来实现的。根据采样率设置定时器TIM2,在每个TIM2的中断中向MAX1270发送一个命令字完成一次采样。采样得到的数据通过SPI1读取,然后通过USB上传到PC。为了减轻微控制器的CPU负荷,可以充分利用STM32微控制器DMA性能,通过DMA来实现采样数据从SPI1的接收缓冲区到USB发送缓冲区的转移。
固件的程序流程图如图5.93所示。


固件可以在Keil或者IAR环境下开发。关于这两个开发平台的使用请参考本章前两部分。
STM32固件库提供了很强大的封装,大大简化了用户程序的开发。在本例中我们主要用到TIM、SPI和USB,关于这三种外设的使用请参阅本书第三章 STM32系列微控制器存储器和外设 和 第四章 STM32固件库。另外在STM_DK的示例程序中都有相关的例子,只要稍加修改,进行一些整合,就可以很顺利地完成固件程序的开发。
2. USB驱动设计
和其他的USB接口通信一样,由于不是标准的USB设备,需要编写特定的WDM驱动程序。开发USB设备驱动程序需要专门的开发工具,目前应用广泛的工具主要有两大类。
一类是Microsoft公司提供的Windows DDK(Device Driver Kit),由于DDK基于汇编语言的编程方式和内核模式的调用,对没有深厚的OS原理和编程水平的人员来说,任务相当艰巨。通常我们会选择另外一类,也就是NuMega公司提供的DriverStudio,它是一个大的开发工具包,包含VtoolsD、SoftICE和DriverWorks等开发工具。 VtoolsD开发包提供了对VxD编程的C/C++类库支持,利用VtoolsD中的QuickVxD工具可以快速生成VxD的C/C++代码框架,开发者可以在此基础上根据各自的需要添加自己的代码。DriverWorks用于开发KMD和WDM驱动程序,并且对DDK函数进行了类的封装,从而为开发Windows NT、Windows 2000和Widnwos98 WDM设备驱动程序提供了一个自动化的方法。利用DriverWorks开发USB驱动程序,可以大大简化开发人员的工作量、缩短开发周期以及降低开发驱动程序的难度。下面我们简单地介绍一下使用DriverStudio开发USB程序的过程。

要想使用DriverWorks,必须先安装以下软件:DriverStudio3.2,VisualStudio6.0,以及Windows2000DDK(软件版本可以根据选择)。由于DriverWorks所用的类库是对DDK的库函数的封装,还必须在Visual C++中编译需要的库文件,下面介绍怎样在VC环境中创建自己的库文件。

(1) 启动Visual C++。
(2) 选择菜单File\Open Workspace。打开位于DriverStudio\DriverWorks\Source\vdwlibs.dsw的工作空间文件。
(3) 选择菜单Build\Batch Build,在弹出的对话框架中选择你想编译的库。
(4) 点击对话框中的Build即可编译你选择的库。

下面简单说明利用DriverWorks开发我们这里的USB设备驱动程序的方法。
这个USB设备有2个批量端点,每个端点的配置如下:
端点 类型 地址 最大包大小/最大传输大小
1 IN 批量(Bulk) 0x01 8/4096
2 OUT 批量(Bulk) 0x82 8/4096
驱动程序需要实现的功能就是通过端点1和端点2对设备进行读写。
(1) 首先,通过快捷方式“Setup DDK and Start MSVC”来启动VC IDE。这个快捷方式所指向的程序,会进行一些必要的设置,然后再启动VC IDE,这样我们的程序就可以使用DDK和DW的头文件和库了。
(2) 从VC IDE的菜单“DriverStudio”中选择“DriverWizard”,之后按对话框的提示填写项目名称及所在目录。并按向导选择驱动程序类型为WDM,总线类型为USB。
(3) 按端点的配置表进行端点的设置。由于在USB中规定端点0是必须存在的,所以我们只需对端点1和端点2进行定义即可。
(4) 选择端点1和端点2产生BULK Write及BULK Read的代码,DriverWorks会自动产生读写代码,只需要进行简单的修改,就可以直接使用。
(5) 最后按下“ Finish”按钮,就结束了Wizard。
在此过程中只针对需要修改的步骤进行了说明,未加说明的部分均可直接按“Next”按钮。
到此,驱动程序完成了,为确保最后生成的USB驱动程序能编译成功,一定要注意设置DriverWorks中的Driver Build Setting(在VC++6.0的菜单中)中的[basedir]和[CPU]等项。设置好后,选择“Build/Batch Build”,在弹出的对话框中进行正确的选择,之后按下”Rebuild”按钮,稍等片刻即可生成最终的.sys驱动程序。

3. PC程序设计
PC应用程序建立在驱动程序之上,是整个系统与用户的最直接接口,可选用多种语言进行开发。这这里我们将以VC++为开发平台,以最基本的两个功能(采样控制和采样数据收集)为例说明一下如何进行应用程序的开发。读者可以根据自身应用的需要进行扩展,例如对采样数据的波形显示处理、频谱分析等。
(1) 首先我们建立一个面向对话框的应用程序。
(2) 在对话框中添加一些控件,程序主界面如图5.94所示。表5.9列出了主要控件的功能。



 查找硬件:在这里我们通过查找USB设备来确认硬件是否连接好,在硬件插入的时候,如果没有安装驱动程序,需要安装我们前面提到的驱动。因为应用程序是以驱动为桥梁来对硬件进行访问的。如果查找成功,则可以进行采样。
 开始采样:通过USB接口发送采样开始命令。同时开启一个线程侦听USB接口的采样数据,接收到采样数据时刷新显示区域。这里会使用到在显示处理中经常用到的双缓冲技术,也就是所有的画面绘制工作将会在一张和窗口显示界面相同大小的内存位图上完成,待所有的绘制完成之后通知显示窗口更新。在初始化的时候根据显示窗口的大小建立内存位图和内存DC,并且根据设置的量程绘制坐标。依次将采样数据绘制到内存位图中,然后使用线连接当前绘制的点和前一个点,当所有的点都绘制完成之后,刷新显示区域(每次总是显示最近的不超过500个采样数据,对高速采样这显然是不够,这也是读者实际应用中需要扩展的地方)。
 停止采样:通过USB接口发送采样停止命令,停止对USB接口上行数据的侦听。
程序流程图如图5.95所示。


 <<上一节




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.