标题:
基于STM32的多路电压测量设计方案
[打印本页]
作者:
forsuccess
时间:
2015-5-19 00:14
标题:
基于STM32的多路电压测量设计方案
1.引言
近年来,数据采集及其应用受到了人们越来越广泛的关注,数据采集系统也有了迅速的发展,它可以广泛的应用于各种领域。
数据采集技术是信息科学的重要分支之一,数据采集也是从一个或多个信号获取对象信息的过程。数据采集是工业控制等系统中的重要环节,通常采用一些功能相对独立的单片机系统来实现,作为测控系统不可缺少的部分,数据采集的性能特点直接影响到整个系统。
电压的测量最为普遍性,研究设计并提高电压测量精度的方法及仪器具有十分重要的意义。在电压测量设计中,单片机作为控制器,是整个设计的核心。除此之外,设计中还必须有模数转换器(ADC)。ADC用于直接采集模拟电压并将模拟信号转换成数字信号,它直接影响着数据采集的精度和速度。
2.系统概述
本设计的微控制器采用STM32单片机。
STM32系列单片机是基于ARM公司Cortex-M3内核设计的。它的时钟频率达到 72MHz,是同类产品中性能较高的产品,具有高性能、低成本、低功耗的优点,是嵌入式应用设计中良好的选择。设计中的A/D转换器采用STM32内置 ADC.STM32的ADC是一种12位逐次逼近型模拟数字转换器。
它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。转换结果可以左对齐或右对齐方式存储在16位数据寄存器中。其输入时钟最大可达到14MHz.
本设计可测量8通道电压值,测量范围为0-10V的电压,显示误差为±0.001V.LCD实时显示电压值和波形图,MicroSD卡对数据进行同步存储。系统原理框图如图1所示。
3.系统硬件设计
本设计的硬件主要包括STM32模块,LCD模块,SD卡模块和按键模块。STM32模块不仅作为核心控制器,还包括ADC设备,它主要包括STM32最小系统电路。LCD模块主要包括LCD驱动接口电路。SD卡模块主要是SD卡驱动电路。除此之外,还有用于程序下载调试的J-Link接口电路和电源电路等。
3.1 STM32最小系统
本模块主要介绍STM32芯片和设计中用到的外设模块。
STM32最小系统使用外部高速时钟,外接8M晶振。STM32的两个BOOT引脚都接低电平,以使用户闪存存储器为程序启动区域。芯片采用J - L i n k下载模式,也可以进行硬件调试。STM32的电源引脚都接了滤波电容以确保单片机电源的稳定。
STM32F103VET6拥有3个ADC,这些ADC可以独立使用,也可以使用双重模式(提高采样率)。STM32的ADC是12位逐次逼近型的模拟数字转换器。它有18个通道可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。STM32的ADC最大的转换速率为1Mhz,也就是转换时间为 1us(ADCCLK=14M,采样周期为1.5个ADC时钟下得到),不能让ADC的时钟超过14M,否则将导致结果准确度下降。STM32将ADC的转换分为2个通道组:规则通道组和注入通道组。规则通道相当于运行的程序,而注入通道就相当于中断。在程序正常执行的时候,中断是可以打断程序正常执行的。同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。
本设计中ADC采集的数据使用DMA进行传输,以达到高速实时的目的。
3.2 ADC控制电路
STM32的数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。本设计中使用DAC来控制ADC匹配电路的增益。
在打开DAC模块电源和配置好DAC所需GPIO的基础上,往DAC通道的数据DAC_DHRx寄存器写入数据,如果没有选中硬件触发,存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx.一旦数据从 DAC_DHRx寄存器装入DAC_DORx寄存器,在经过一定时间之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。
为了扩大测量范围和测量精度,本设计在STM32的ADC前加入匹配电路。在ADC控制电路中,输入信号先经过射极电压跟随电路,然后经过分压电路,使输入信号满足AD603的输入要求。然后再经过射极电压跟随电路,输入ADC输入端。AD603的控制输入使用STM32的DAC,可以满足增益的要求。
匹配电路以AD603为核心。AD603为单通道、低噪声、增益变化范围线性连续可调的可控增益放大器。带宽90MHz时,其增益变化范围为-10dB~+30dB;带宽为9M时范围为10~50dB.
将V O U T与F D B K短路,即为宽频带模式(90MHz宽频带),AD603的增益设置为-11.07dB~+31.07dB.AD603的5、7脚相连,单片AD603的可调范围为-10dB~30dB.AD603的增益与控制电压成线性关系,其增益控制端输入电压范围为±500mv,增益调节范围为40dB,当步进 5dB时,控制端电压需增大:
ADC匹配电路的电路图如图2所示。
3.3 LCD控制电路
本设计所使用的LCD为2.4寸,320×240分辨率。LCD模块使用STM32的FSMC接口控制。
FSMC(Flexible Static Memory Controller)即可变静态存储控制器,是STM32系列中内部集成256KB以上Flash,后缀为xC、xD和xE的高存储密度微控制器特有的存储控制机制。通过对特殊功能寄存器的设置,FSMC能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得 STM32系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及成本的综合要求。
在STM32内部,FSMC的一端通过内部高速总线AHB连接到内核Cortex-M3,另一端则是面向扩展存储器的外部总线。内核对外部存储器的访问信号发送到AHB总线后,经过FSMC转换为符合外部存储器通信规约的信号,送到外部存储器的相应引脚,实现内核与外部存储器之间的数据交互。F S M C起到桥梁作用,既能够进行信号类型的转换,又能够进行信号宽度和时序的调整,屏蔽掉不同存储类型的差异,使之对内核而言没有区别。
FSMC可以连接NOR/PSRAM/NAND/PC卡等设备,并且拥有FSMC_A[25:0] 共26条地址总线,FSMC[15:0]共16条数据总线。另外,FSMC扩展的存储空间被分成8个块。通过地址线选择操作的块。这样,LCD将被看作一个拥有一块地址空间的存储器进行操作。
3.4 SD卡驱动电路
本设计中使用的SD卡为MicroSD,也称TF卡。MicroSD卡是一种极细小的快闪存储器卡,主要应用于移动电话,但因它的体积微小和储存容量的不断提升,现在已经使用于GPS设备、便携式音乐播放器、数码相机和一些快闪存储器盘中。 MicroSD卡引脚图如图9所示。
MicroSD卡与SD卡一样,有SPI和SDIO两种操作时总线。SPI总线相对于SDIO总线接口简单,但速度较慢。我们使用SDIO模式。
MicroSD卡在SDIO模式时有4条数据线。
其实,MicroSD在SDIO模式时有1线模式和4线模式,也就是分别使用1根或4根数据线。当然,4线模式的速度要快于1线模式,但操作却较复杂。本设计中使用的是SDIO的4线模式。MicroSD卡的硬件连接图如图3所示。
3.5 触摸屏电路
本设计在测量的通道和显示设置上,除了使用按键设置,还使用触摸屏进行设置。
触摸屏使用芯片TSC2046控制,其硬件连接图如图4所示。
在图4中,TSC2046可以采集触摸屏的点坐标,从而确定触摸的位置,进行人机交互。
STM32单片机通过SPI总线与TSC2046通信,可以得到触摸信息。本设计使用触摸屏进行测量通道数的设置和测量速度的设置。
4.系统软件设计
4.1 软件流程
系统软件部分使用C语言编程,同时使用STM32官方提供的固件库,使用的版本为3.5版。 STM32固件库也称固件函数库或标准外设库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。
软件部分为了方便存储数据的查看和读取,在MicroSD卡部分使用了fatfs文件系统。
FAFFS是面向小型嵌入式系统的一种通用的FAT文件系统。FATFS完全是由AISI C语言编写并且完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。
FATFS支持FAT12、FAT16、FAT32等格式,所以我们利用前面写好的SDIO驱动,把FATFS文件系统代码移植到工程之中,就可以利用文件系统的各种函数,对已格式化的SD卡进行读写文件了。
以上是系统软件设计的两个主要部分,其他还有LCD驱动程序,ADC和DMA驱动程序,按键中断程序等。
4.2 软件文件结构
文件main.c是整个程序的入口文件,也是主要文件。global.c和global.h主要是共用的函数和全局性的宏定义。LCD_Disp.c和LCD_Disp.h是基于STM32固件库的对LCD的底层驱动函数。Lcdfunc.c和 lcdfunc.h是为了主程序更方便的操作LCD而编写的一些常用的复杂的对LCD底层函数的封装函数。sdio_sdcard.c和 sdio_sdcard.h是基于STM32固件库的对MicroSD卡的底层驱动函数。fat文件系统在STM32上的使用需要针对具体类型的硬件进行配置,所以它是基于MicroSD卡的底层驱动程序的。fatfunc.c和fatfunc.h是对fat文件操作接口的一些封装,是针对本设计中对文件的操作编写的。其余的按键中断和ADC等操作的函数是直接基于STM32固件库的,并直接被主程序调用。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0