基于STM32 微控制器的电平采集系统设计
2022-05-26王琦张云强吕岩
王琦,张云强,吕岩
(1.陕西省电子信息产品监督检验院,陕西西安,710000;2.西安市产品质量监督检验院,陕西西安,710065)
在检验检测工作中,各种样品设备的运行状态是检测的重要参数。电压作为反应检测样品电气特性之一的重要模拟量,对其的监控需要转换为数字信号量。国外产品往往价格高昂,操作复杂,无法达到本地化应用的要求。本文尝试利用意法半导体STM32F103ZET6 微控制器实现了对-3.3V~+3.3V 的近缓变直流电压信号的采集。
1 电平采集系统设计简介
电平采集系统的工作流程为将原始电压信号通过集成运放电路线性运算处理后,达到单片机针脚0~+3.3V 的检测范围,内部ADC 将获取的电压转换为数字信号,程序通过线性逆向运算获取实时电压值,不仅能以实时数据的形式显示在LCD 显示屏上,还能够通过串口发送到上位机显示。系统运行期间可以实现主动按键校准,并提示校准信息,可根据当前需求扩展功能和更改采样频率,并为后续的功能需求留有足够的接口,方便功能的二次开发。实验环境下,系统最大误差不超过0.06V,完全满足高精度的采集需求。
电压采集系统的总体构成主要包括信号处理电路、A/D转化电路、STM32F103ZET6单片机、复位电路、LCD显示屏、按键等构成[1-2]。它可对-3.3V~+3.3V 的近缓变直流电压信号进行实时读取,将信号变换为单片机可处理的电压范围,然后显示在显示屏上,同时发送到上位机。其中信号处理单元和单片机由电源单独供电。下面将就系统的各部分设计进行具体介绍。
2 电压采集系统电路设计
电压采集系统电路设计包括信号处理电路、电源电路、显示模块电路、串口通讯电路及系统软件设计。
■2.1 信号处理电路与电源电路设计
一般的情况下,数据的采集不能对信号进行直接测量。采集系统需要对信号源有一个隔离的过程,因此我们要设计一个信号处理电路。源跟随器是一个能够实现信号隔离和信号还原的电路,输出电压与输入电压是一样的,对前级电路隔离,对后级电路还原输入信号,提供稳定的恒压源功能。
LM358 是一颗双运算放大器,内部有两个独立的运算放大器,适合单电源工作和双电源工作两种模式。考虑到信号的波动范围在-3.3V~+3.3V 而参考电压在+3.3V 附近,信号合成范围在-3.3V~+6.6V 范围内,为了保证信号的还原度和电源获取的便捷性,电路中的LM358 采用+9V、-3.5V 双电源供电模式。
如图1 所示,信号由SINGAL 端口输入,由OUTPUT端口输出。经过软件仿真,具体的输入输出关系如公式(1)所示:
图1 信号处理电路设计
Voutput:信号输出电压 Vsingal:信号输入电压Vref:参考电压。
信号处理电路一共需要的电压,分别是+9V、+5V、+3.3V 和-3.5V。9V、5V 电源在市面上能够找到多种解决方案,在此不作讨论。电源电路主要解决+3.3V和-3.5V的问题。
如图2 所示,经过软件验证后,ICL7660 芯片在8 脚连接+5V 电压时,5 脚能够产生-5V 的负电压,由于负载电流较大,在经过7909芯片稳压处理后,能够得到稳定的-3.5V电压,可以直接为LM358 提供负电源供电。+3.3V 电压由目前普遍运用的AMS1117DT-3.3 芯片产生,该芯片输入端接入+5V 电压,输出端能够提供稳定的+3.3V 电压。
图2 电源模块电路
■2.2 显示模块电路与串口通讯电路设计
显示屏采用的LCD R61509VN,此款显示屏支持SPI 和8080 协议,可以自动适应协议改变工作模式。FSMC 是STM32单片机的可变静态存储控制器,能够直接控制SRAM、NAND FLASH 和NOR FLASH,支持8/16/32 位数据宽度。
8080 时序也叫做英特尔时序,总线的控制线有四根,分别是RD 写使能,向RAM 中写入数据,低电平有效;WR读使能,向RAM 中读数据,低电平有效;CS 片选,低电平有效;RS 寄存器选择,高电平有效,总线数据位共16 位[3]。具体信号指标如表1 所示。
表1 8080接口功能
由于外部SRAM 接口与传统8080 接口基本相似,部分不相同的线路可以通过软件控制,此时STM32 能够通过FSMC 将TFT-LCD 显示接口当作SRAM 操作,间接控制LCD 显示功能。单片机FSMC 为TFT-LCD 预留接口,17至34 针脚作为16 位数据位,其余位作为触控和控制位。
根据接口阵脚位的含义,就得到了FSMC 与8080 时序总线的连接方式,具体连接方式如表2 所示。片选CS 与NE4 连接,LCD 寄存器选择RS 与A10 连接,读使能RD 与NOE连接,写使能WR与NEW连接,其余的数据位一一对应。
表2 FSMC与8080接口连接方式
串口通讯电路主要将单片机经过处理的GPIO 数据通过数字逻辑编码转发到串口接口上,使上位机能够获取到当前的处理数据[4]。单片机的高低电平逻辑与传统计算机的不同,主要是电压上的差异,单片机的高电平大于+2.4V,对应的上位机高电平大于+3V,低电平小于+0.4V,对应的上位机低电平在小于-3V,该电路主要将单片机的高低电平逻辑转换为上位机的高电平逻辑。电路如图3 所示,由PB10 端口传递到DIN1 的数据通过SP3232 转换为上位机逻辑电平从DOUT1 发送至RS-232 接口。
图3 串口模块电路
至此,系统电路部分基本设计完成,考虑到电压采集系统的小型化和维持功能拓展性,本次设计将信号运算部分和部分电源模块进行了整体布局,将元器件手动布局,由软件自动布线,信号处理系统电路如图4 所示。
图4 信号处理系统电路图
信号由SINGAL 端口输入,单片机从SINGAL_OUTPUT端口采集数据,VOLTAGE_POWER 为负电源产生芯片供电,AD_VCC 为LM358 芯片供电,PULL_POWER 为运算电路参考电压,所有信号与供电均共地。
■2.3 软件系统设计
软件系统设计除了本次设计需要的功能外,还留有大量的功能接口。软件系统主要由A/D 控制程序、时钟控制程序、LCD 显示程序、LED 控制程序、外部中断程序及其处理函数、按键程序和串口通讯程序组成。整个系统由统一的时钟控制程序控制,主程序对各个模块进行对应的初始化操作并在屏幕上显示基本显示框架,初始化完成后即开始由A/D 控制程序对信号进行采集,外部中断出发后由对应的中断处理函数实现校准,并在显示屏上提示用户校准成功。显示屏数据与上位机显示数据同步更新。
2.3.1 软件开发语言及开发环境介绍
本系统在全局采用最常用的单片机高级开发语言-C 语言,由于C 语言是一门强静态语言,代码经过预处理、编译、链接后占用的空间很小以及得益于指针的使用,运行内存占用也很小,这完全适合单片机的资源少、功能多、使用灵活的特点。上位机能够对串口进行通讯的语言有很多,为了开发的便捷性,本系统采用Python 语言进行串口程序接收的开发。本次设计采用集成开发环境Keil uVision 5 作为软件开发工具,该工具被广泛地应用于51 单片机和ARM 核心单片机的开发。
2.3.2 单片机软件系统流程
本次设计的软件系统的流程比较简单,首先进行系统初始化,这里包括时钟系统、中断等级分组、串口、LCD 显示和外部中断的初始化,初始化完成之后立即进入循环函数,在函数中主要完成A/D 转换、数值发送和显示的任务。外部中断监控按键的状态,如果按键的状态被触发,主循环会暂停,进入中断处理函数中完成数据的校准,完成之后返回到主循环暂停的位置继续进行数据的采集。中途如若发生了复位按键的动作,系统会立即从第一个过程开始进行。整个过程没有退出的软件触发定义,只有当电源断开时,软件才会被动退出。
2.3.3 软件程序设计
软件中的按键校准功能需要按键来触发外部中断,其中选用开发板上的KEY-RIGHT 按键进行设置,当按键按下时开关处于接通状态,松开时处于断开状态。该按键接口属于GPIOE 的第四针脚,未按下时该针脚处于低电平状态,按下后处于高电平状态[5]。通过检测GPIOE4 针脚电平状态实现单片机系统对按键状态的检测,完成外部中断标志位的触发动作。初始化代码如下所示:
A/D 转换程序主要控制驱动单片机内部的ADC 模块以规定的时序进行模数转换,将ADC 转化后的12 位二进制数值转化为十进制数值[6-7]。程序开始后,随即指定转换通道和采样时间,这一步是规范取值的接口和时间,使能转换功能后就能得到有效的数值,由于硬件对原始信号进行了线性处理,获得有效值需要逆向计算,具体数值计算如公式(2)所示:
Vreal:实际电压值;Vadc:经过A/D 模块转换后的12 位电压值;Vref:硬件电路中的参考电压。
检测到转换完成标志后,对单次采样值进行累加,经过多次采样并且次数达到设置的采样次数时,函数返回本次采样平均值作为有效数值。
LCD 显示程序主要针对LCD 显示屏设计,LCD 显示屏TFT-R61509VN 是一块3.0 寸240×400 分辨率并且带触摸控制功能的屏幕,厂家已经提供了对应的驱动模块、函数库以及常用的ASCII 字符显示模块,本次设计选用官方函数库进行编程,主要实现屏幕显示框架、数值刷新和提示信息的显示。
外部中断程序简称EXTI,管理着单片机的中断线或者事件线。每个中断/事件线都有自己对应的独立检测器,可以对信号陡增时检测、信号陡降时检测和同时对两种情况检测。按键程序定义按键行为会在按键按下时将原有的低电平瞬间变成高电平,就产生了一次上升沿检测中的标志性行为。其主要用于电压值的校准,按下校准按键,中断检测程序能够将程序直接进入到中断处理函数中去,外部中断处理函数只有在按键状态位标志出发以后能运行,其余时间均处于待机状态,不会对主程序产生任何影响。
本次设计中串口的主要功能主要完成数据的发送,在功能上只设计了数据对外发送的模块,数据对内接收没有启用。数据发送的媒介采用自定义printf 接口向上位机发送实时采集电压值。在该接口的作用下,发送的内容通过指针参数传入,函数得到参数后判断需要发送的内容,然后将有结束符号“ ”字符串转化成没有结束符的字符串,通过获得串口发送完成标志位状态。上位机接收程打开串口后将接收到的数据显示在终端上。串口接入计算机后系统会给物理设备分配编号,具体操作情况下需要重新确认串口的编号并更改参数。串口参数默认设置为9600 波特率,8 位数据位,1 位停止位,没有奇偶校验。在运行“python serialcom.py”命令过后程序会尝试打开串口所在的端口,如果打开失败会立即结束,通过修改参数或者物理连接能够成功打开,然后向串口按行读取数据,如果数据非空,则去掉换行符之后将单个字符组装成完整的字符串并打印到终端窗口上。
3 结语
本文设计的电压采集系统属于数据检测仪器,在高性能单片机的基础上主要负责模拟电压数据的模数转换和输出。这款仪器基本上不需要操作,唯一的操作点在于数据的校准,借助该仪器生产人员能够简单快捷地了解到设备某个节点的电压状态,有助于提高检验检测的智能化。在后续的应用和研究中可以添加定时器功能根据用户指定的时间来监测数据,有效地减少功耗。