基于STM32+FPGA的数据采集系统的设计与实现

发布者:鑫森淼焱最新更新时间:2023-07-20 来源: elecfans关键字:STM32  FPGA  数据采集系统 手机看文章 扫描二维码
随时随地手机看文章

引言

由于火控系统工作环境特殊,所需采集信号复杂多样,传统的以微控制器或PC为主的采集系统往往难以胜任。针对上述问题,提出了一种基于STM32+FPGA的数据采集系统的设计方案,该方案不仅能够完成对多路多样信号实时、精确地采集,而且具有高速信号处理和数据传输能力,具有集成化程度高、体积小、资源丰富、价格便宜等优点。


1、系统总体设计

在实际应用中,所采集的信号既有模拟信号,也有数字差分信号,并且有多通道、串并混合、数据量大等特点。为了满足需求,本文设计了图1所示的数据采集系统,它能根据需求进行6路±10V模拟信号,18路数字差分信号的采集、处理和实时传输。系统采用STM32+FPGA的组合方式,FPGA为ALTER公司的EP1K50TC144器件,由STM32417给FPGA发送控制命令,通过FPGA内部的地址译码、逻辑控制以及数据缓冲实现信号采集,并通知STM32417对数据进行读取,最后,由STM32417对得到的数据进行处理和传输。

基于STM32+FPGA的数据采集系统的设计

图1  总体设计

其中,STM32F417是意法半导体公司生产的基于ARM-CoRTEX-M4架构的微控制器,内核架构先进,性能优越,主频可达168MHz,执行效率高,具有较高的运算能力及数据处理能力,拥有丰富的外设接口和扩展功能。在图1中,STM32F417与上位机之间的以太网通信,就是MII外接DP83848物理层芯片,通过相关配置后扩展实现的。


2、STM32与FPGA的接口设计

STM32F417与FPGA的接口方式有很多种,可以是串行的,也可以是并行的,考虑到FPGA在多路并行数据处理方面有明显优势[5,6],设计采用STM32F417的可变静态存储控制器(FLEXIBLESTATICMEMoRyCoNTRoLLER,FSMC)并行总线接口实现与FPGA的连接。


2.1、接口电路设计

FSMC是STM32系列采用的一种新型的存储器扩展技术,支持不同的外部存储器类型,其中就包括多种类型的静态存储器,因此,可将FPGA当成STM32F417的外部SRAM来配置,通过扩展出的数据/地址/控制三总线来实现操作,这样既能保证较快的操作速度,又具有很高的灵活性。接口电路硬件连接如图2所示。

基于STM32+FPGA的数据采集系统的设计

图2  STM32F417与FPGA接口连接电路


将FPGA直接连接在STM32F417的FSMC总线上,FSMC提供了4个BANK用于连接外部不同的存储器,每个BANK有独立的片选信号,FSMC_NE3是BANK1第三区的片选信号,FSMC_NOE和FSMC_NEW分别是接口读写信号,根据应用需求,设计接口数据宽度为16位,地址线为10位,将数据线FSMC_D[15~0],地址线FSMC_A[9~0]连接到FPGA的I/O端口,寻址空间为1K字。除此之外,还有一些中断信号(INT),用于FPGA向STM32F417发送中断请求。这样FPGA就作为STM32F417的外设连接在了系统中,通过存储器读写指令就可以访问FPGA。


2.2、关于接口地址的STM32软件设计

在STM32F417内部,FSMC的一端通过内部高速总线AHB连接到内核CoRTEX-M4,另一端则是面向扩展存储器的外部总线,内部AHB总线的地址HADDR与FSMC总线地址存在一定的映射关系。FPGA连接在FSMC的BANK1第三区,HADDR总共有28根地址线(HADDR[27~0]),其中HADDR[26~27]用来对BANK1的4个区进行寻址。当PFGA使用第三区时,对应的HADDR[27∶26]等于10。当BANK1在外接16位宽度存储器时候,只有HADDR[25∶1]是有效的,对应关系变为:HADDR[25∶1](FSMC[24∶0],由此可知,接口地址FSMC_A[9~0]对应的HADDR的地址为0X68000000~0X680007FE,在进行地址读写操作时,HADDR[0]并没有用到,相当于地址右移了1位,使得每次读写操作时,函数中的地址增量都为2。


3、数据采集的FPGA实现

3.1、模拟信号采集

根据应用需求,模拟信号采集选用MAXIN公司的12位AD转换芯片MAX196。该芯片有6个单端模拟输入通道,并且其量程范围、通道选择、工作方式均编程可控,转换时间为6μS,采样速率为100KSPS,具有精度高、功耗低、开发方便等特点。


由于MAX196芯片是5V电压供电,为了解决逻辑电压匹配的问题,设计使用电压转换芯片SN74AHCT245PWLE来实现FPGA与AD的连接。由FP-GA控制AD进行信号采集,使用其内部逻辑,完成芯片的配置、中断的响应以及转换结果的缓存,FPGA内部逻辑电路如图3所示。此逻辑电路主要由AD控制模块、写缓存控制模块和双口RAM缓存3部分组成。

基于STM32+FPGA的数据采集系统的设计

图3  AD采集内部逻辑电路


3.1.1、AD控制模块

AD控制模块用来完成MAX196的采集时序的控制,为了确保时序控制的准确性和连续性,设计一个状态机,如图4所示,从STATE0~STATE3依次变化,整个过程对应一次完整的采集周期,系统中所有的系统时序由外部40M有源晶振产生。

基于STM32+FPGA的数据采集系统的设计

图4  AD采集控制状态机


状态机的初始状态为STATE3,控制端口默认置高,在FPGA在收到STM32F417发出的采集命令EN后,转入STATE0,输出脉冲(wR+CS)启动AD转换,并且向AD芯片写入8位控制字,完成初始化,然后,STATE1等待AD完成数据转换,转换结束时,AD产生中断信号INT,接着进入STATE2,进而输出脉冲信号(RD+CS),读取转换的结果。该过程使用VERILoGHDL语言来描述,时序仿真如图5所示。

基于STM32+FPGA的数据采集系统的设计

图5  AD控制时序仿真

在实际应用中,AD的转换量程选择为±10V,双极性,使用内部转换模式,控制字后3位选择输入通道。由MAX196用户文档可知,通道0采集的控制字为0X58,假设得到的转换结果为0X3EF,为了下一步数据存储的需求,设计将数据缓存在寄存器DATA[11∶0]中,并产生一个oVER中断信号用于后期处理。


3.1.2数据缓存

缓存的设置主要是解决AD连续高速的数据采集与STM32F417数据处理周期不匹配的问题,当AD完成一个通道的数据采集时,需要对数据进行缓存,考虑到FSMC总线接口的特点,在设计中,使用FPGA内部的双口RAM完成数据缓存[10],由QUARTUSII自带的IP核生成,其中RAM的读取端连接FSMC接口,而写入端连接AD,写缓存的地址通过写缓存控制模块进行控制。


信号EN在启动AD控制模块的同时,将写缓存控制模块的地址清0,在oVER信号的触发下,地址加1,并且产生RAM写信号RAM_wE,寄存器DATA[11∶0]的数据写入RAM里,在连续6路的采集中,每一路的数据对应不同的地址,进而完成数据的缓存。时序仿真如图6所示。

基于STM32+FPGA的数据采集系统的设计

图6  缓存读写时序

采集结束后,STM32F417通过读取存储地址分别得到6个通道的采集数据,进而完成下一步的数据处理和传输。


3.2、数字差分信号采集

数字差分信号的采集首先需要将差分电平转换成数字电平,选用MAXIN公司的MAX3362作为数字差分信号收发器。数字信号既有并行数据,也有串行数据,在同步触发脉冲的作用下,可通过FPGA内部逻辑电路对数据进行处理。对于15路并行数据,通过集成电路74373+74541的逻辑组合模块进行采集,在同步时钟SyNC1置高时将数据锁存至74373,而对于1路串行数据,则通过74164+74541的逻辑组合,在触发脉冲SyNC2的上升沿将数据由串行转为并行,STM32F417向对应的地址发出读指令,地址经译码后,选通缓冲器74541,从而得到相应数据。


4、系统总体流程和结果测试

系统上电后,STM32和FPGA首先进行硬件初始化,其中FPGA通过PS的方式完成配置。STM32启动定时器产生定时中断,在中断响应中,发送开始采集命令,进而启动FPGA内部逻辑电路进行信号采集控制和数据缓存,在采集结束后,STM32响应FPGA发出的结束中断请求、读取数据、处理数据并将处理后的结果打包发送至上位机,最后,上位机接收数据并显示结果。系统工作流程如下图7所示。

基于STM32+FPGA的数据采集系统的设计

图7  数据采集系统流程

STM32F417通过网口将结果发送至上位机,其以太网通信是基于LwIP协议栈,利用改进后的UDP协议,实现数据实时可靠的传输。PC上位机则通过C++BULIDER平台上的TNMUDP控件完成数据的接收。采集系统在实际实验中,控制MAX196完成6个通道采集的时间为约40μS,加上读取、处理、传输和显示的时间,系统可在50μS内完成全部采集和处理,设置定时器TIM1,使其50μS中断一次,并在中断响应中再次发送采集命令,实现精确时间间隔的连续采集。


通过信号发生器,产生50Hz的正弦波,连续采集波形如图8所示。

基于STM32+FPGA的数据采集系统的设计

图8  50Hz正弦信号采集

模拟通道和数字信号端口分别对给定值连续测试5000次,统计结果的误差和误码率见表1。

基于STM32+FPGA的数据采集系统的设计

表1  测试误差统计

测试的结果表明,模拟通道测量误差在10MV之内,数字信号端误码率为0,系统采集精度满足设计要求。


5、结束语

本系统很好地结合了STM32微控制器和FPGA可编程器件两者的长处,利用STM32硬件中的FSMC、ETHERNETMAC、定时器等外设功能,以及FPGA灵活的逻辑可操控性,解决了系统接口设计、时序控制、组网传输等复杂问题,实现了火控系统信息多通道、多类型信号的实时采集,保证了精度高、传输快,实时处理的采集要求,为后续应用打下了良好的基础。同时,简化系统硬件设计,缩小了系统体积和开发周期,具有极高的性价比。本系统还保留了很大的灵活性,可轻松进行二次开发,组合架构可应用于不同的信号采集领域,有广阔的应用前景和参考价值。


关键字:STM32  FPGA  数据采集系统 引用地址:基于STM32+FPGA的数据采集系统的设计与实现

上一篇:一种基于STM32的温室远程监测和控制系统的设计
下一篇:基于HAL库的STM32呼吸灯实验

推荐阅读最新更新时间:2024-11-09 18:07

关于STM32的四类嵌入式软件(库)
1写在前面 陆续收到一些朋友的问题: 1.我是选择寄存器开发STM32,还是标准外设库呢? 2.你有STM32L0标准外设库吗? 3.HAL库和LL库有什么差异? 。。。 针对STM32开发使用的嵌入式软件,或者我们说的库,可以分为四类: STM32Snippets Standard Peripheral Library STM32Cube HAL STM32Cube LL 下面就写一下关于这四种库的相关内容、以及对比应用等。 2 STM32Snippets 什么是STM32Snippets? STM32Snippets是高度优化的代码示例集合,使用符合CMSIS的直接寄存器访问来减少代码开销,从
[单片机]
关于<font color='red'>STM32</font>的四类嵌入式软件(库)
STM32 I2C读写
1,该模块默认地工作于从模式。接口在生成起始条件后自动地从从模式切换到主模式;当仲裁丢失或产生停止信号时,则从主模式切换到从模式。 2,数据和地址按8位/字节进行传输,高位在前。 3,数据流:SDA线- 移位寄存器- DR寄存器 主模式 以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。 1、检测总线状态,当总线空闲时(I2C_SR2的BUSY=0)。 FlagStatus I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY); 2、设置START=1,产生起始信号。 I2C_ GenerateSTART 起始信号产生后,I2C_SR1的SB位被硬件置
[单片机]
STM32——高级定时器的应用
/定时器1的配置 输出两路PWM信号 PA8 PA11,计数时钟为400KHZ 计数溢出大小为40000 / void Tim1Init(void) { GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; u16 LeftMotor_CCR; u16 RightMotor_CCR; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA|RCC_APB2P
[单片机]
详解什么是STM32对其Flash的保护
如果你还不了解什么是STM32对其Flash的保护,那么就由小橙同学来给你讲解一下什么是STM32的Flash保护! 什么是Flash? STM32的FLASH组织结构,可能因不同系列、型号略有不同。比如大家熟悉的STM32F1中小容量一页大小只有1K,而F1大容量一页有2K。 还比如有些系列以扇区为最小单元,有的扇区最小16K,有的128K不等。 通常Flash包含几大块,这里以F40x为例: 主存储器:用来存放用户代码或数据。 系统存储器:用来存放出厂程序,一般是启动程序代码。 OTP 区域:一小段一次性可编程区域,供用户存放特定的数据。 选项字节:存放与芯片资源或属性相关的配置信息。 什么是STM32对内部Flash的保
[单片机]
详解什么是<font color='red'>STM32</font>对其Flash的保护
STM32】HAL库 STM32CubeMX教程十三---RTC时钟
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: RTC时钟原理 STM32CubeMX创建RTC例程 HAL库定时器RTC函数库 PS: 这里的RTC讲解,我们只将原理,不讲寄存器,如果要看RTC的寄存器,请看这篇文章 【STM32】RTC实时时钟,步骤超细详解,一文看懂RTC 什么是RTC RTC (Rea
[单片机]
【<font color='red'>STM32</font>】HAL库 STM32CubeMX教程十三---RTC时钟
STM32 内部FLASH读写操作
关于STM32内部FLASH读写操作 单片机程序flash对应的内部地址。 falsh内部128bytes为一页,32页一个扇区。为了不会破坏到程序一般我们把要存的数据放后面,或者放到最后一页,来读取保存。STM32程序起始地址一般为0x08000000。 2.读取数据 //faddr 要读取的地址 uint16_t STMFLASH_ReadHalfWord ( uint32_t faddr ) { return *(__IO uint16_t*)faddr; } uint16_t STMFLASH_Read (uint32_t Addr ) { uint16_t Date =
[单片机]
关于STM32_GPIO的BSRR和BRR寄存器
首先, typedef struct { vu32 CRL; vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; } GPIO_TypeDef; BSRR和BRR寄存器是32位的。 比较: 1)置GPIOA- BSRR低16位的某位为'1',则对应的I/O端口管脚置'1'; 置GPIOA- BSRR低16位的某位为'0',则对应的I/O端口管脚保持不变。 2)置GPIOA- BSRR高16位的某位为'1',则对应的I/O端口管脚置'0'; 置GPIOA-
[单片机]
STM32的CRC外设如何设置
前言 STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间。CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时的完整性检查。在IEC60335中,也接受通过CRC校验对FLASH的完整性进行检查。在对FLASH完整性检查的应用中,需要事先计算出整个FLASH的CRC校验值(不包括最后保存CRC值的字节),放在FLASH的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个FLASH的CRC校验值,然后与保存在FLASH末尾的CRC值进行比较。 EWARM从v5.5版本之后开始支持STM32芯片的CRC计算。前面所说的计算整个FLASH的CRC校验值并保存在FLASH末
[单片机]
<font color='red'>STM32</font>的CRC外设如何设置
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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