【我要为STM32站台】基于STM32L073的多核心嵌入式平台的
便携式多线检测仪
项目介绍:
-
方案主题;
本设计就手工查线效率低下和现有测线仪灵活性、通用性较差的问题,提出了多线检测的设计方案,以两片STM32L073单片机为核心控制部件,可对正反接口的1到50路数据线进行短路和断路测试,并通过液晶屏进行交互操作、实时显示测试结果。
-
方案功能;
对正反接口的1到50路数据线都能够进行短路和断路测试;
利用STM32L073灵活的控制技术,保证检测的准确性,设备便于携带;
弥补传统人工测线的缺陷,提高工作效率,检测结果直观可见;
使用240X128液晶与7寸触摸屏组成方便操作的人机界面,易用性高。
3、关键词;
STM32L073单片机;多线检测;数据处理;触摸屏。
工作原理介绍
1、硬件组成与介绍;
1.1 硬件框架设计
设计研制的第一要务,就是选择单片机芯片,需要功能合适、资源足够,且价格在研制成本能承担的范围内,通过对占用I/O口的个数的计算,确定选用STM32L073ZET6和STM32L073RBT6这两款单片机。功能与价格都能满足设计需求。
确定好核心元器件单片机,接下来完成整体电路的设计,生成PCB板进行制作,焊接元器件、搭建电路,并完成实物的装配。电路总原理图如图2所示,各模块详细原理图见附录。
图2 电路总原理图
1.2 电源供电设计
本系统为手持设备,所以需要内置电池并增加内置电池的充电管理芯片。本方案中使用TP4057作为电源管理芯片。TP4057是一款完整的单节锂离子电池充电器,带电池正负极反接保护,采用恒定电流/恒定电压线性控制。其SOT封装与较少的外部元件数目使得TP4057便携式应用的理想选择。TP4057可以适合USB电源和适配器电源工作。
引脚功能:
CHRG(引脚1):漏极开路输出的充电状态指示端。当充电器向电池充电时,CHRG管脚被内部开关拉到低电平,表示充电正在进行;否则CHRG管脚处于高阻态。
GNG(引脚2):地。
BAT(引脚3):充电电流输出。该引脚向电池提供充电电流并将最终浮充电压调节至4.2V。该引脚的一个精准内部电阻分压器设定浮充电压,在停机模式中,该内部电阻分压器断开。
VCC(引脚4):正输入电源电压。该引脚向充电器供电。VCC的变化范围在4V至9V之间,并应通过至少一个1uF电容器进行旁路。当VCC降至BAT引脚电压的30mV以内,TP4057进入停机模式,从而使IBAT降至2uA以下。
STDBY(引脚5):电池充电完成指示端。当电池充电完成时STDBY被内部开关拉到低电平,表示充电完成。除此之外,STDBY管脚将处于高阻态。
PROG(引脚6):充电电流设定、充电电流监控和停机引脚。在该引脚与地之间连接一个精度为1%的电阻器RPROG可以设定充电电流。当在恒定电流模式下进行充电时,引脚的电压被维持在1V。
TP4057有两个漏极开路状态指示输出端,CHRG和STDBY。当充电器处于充电状态时,CHRG被拉到低电平,在其它状态,CHRG处于高阻态。当电池没有接到充电器时,CHRG输出脉冲信号表示没有安装电池。当电池连接端BAT管脚的外接电容为10uF时,CHRG闪烁周期约0.5-2秒。
图3 电源模块
1.3 显示模块设计
显示模块使用240*128液晶四线电阻式触摸屏,可进行交互操作,省去了机械按键。该屏触摸芯片输出AD参数为12位数据,所以相对精度比较高,从而使手感更舒适。显示模块主要工作是进行线路检测端口数的设置和检测结果的显示,并通过蜂鸣器进行报警提示。显示模块的电路原理图如图4所示。
图4 显示模块
CH240128D-6点阵绘图型液晶显示模块(LCM)采用240×128点阵液晶显示屏(LCD)与低功耗LED背光和四线电阻式触摸屏组成,是一款邦定工艺4.9寸的240128带触摸液晶屏。内置T6963C控制器,全屏可显示8排汉字,每排显示15个(16X16点阵)汉字,可完成图形方式,文本方式以及图形与文本混合显示。Intel8080系列微处理器接口,可与MCU单片机直接连接,广泛应用于各类仪器仪表与电子设备上。引脚功能如表1所示。
表1 引脚功能图
管脚 |
符号 |
管脚描述 |
管脚 |
符号 |
管脚描述 |
1 |
FG |
铁框接地 |
18 |
FS |
字体选择 |
2 |
GND |
地 |
19 |
VEE |
电压输出 |
3 |
VCC |
电源 |
20 |
BLA |
背光正极 |
4 |
V0 |
对比度调节 |
21 |
BLK |
背光负极 |
5 |
WR |
写数据 |
22 |
DCLK |
触摸屏外部时钟输入 |
6 |
RD |
读数据 |
23 |
CS |
触摸屏片选信号 |
7 |
CS |
片选信号 |
24 |
DIN |
触摸屏串行数据输入口 |
8 |
C/D |
指令、数据信号 |
25 |
STA |
触摸屏应答信号 |
9 |
RST |
复位信号 |
26 |
DOUT |
触摸屏串行数据输出口 |
10-17 |
DB0-DB7 |
数据线0-7 |
1.4 硬件电路设计小结
经过多日的设计与修改,终于完成整体电路的设计,生成PCB板进行制作,焊接元器件、搭建电路,并完成实物的装配。PCB板如图5所示,电路板焊接完成图如图6所示。硬件电路完成后,可以进行软件部分的编程调试。
PCB正面 PCB背面
图5 PCB界面
图6 电路板焊接完成图
2、此项目中STM32的功能;
stm32L073芯片在本项目中起到至关重要的作用。
1)低功耗控制
在平时工作中,stm32L073芯片处于低功耗模式,降低电池的电量消耗。当触摸屏芯片发出唤醒信号后,stm32L073芯片退出低功耗模式,进入正常工作状态。
当用户点下检测按钮后, stm32L073芯片唤醒协处理芯片STM32F103,并根据要求发送串口指令控制STM32F103芯片进行管脚检测。
2)人机界面显示
stm32L073负责本项目的人机界面控制。控制一块工业级240×128液晶屏显示检测信息,控制一块电阻触摸屏进行触摸控制。
3、软件流程介绍。
硬件电路完成后,进行软件部分的编程调试。首先研究完成操作系统的移植,其次编写各模块的驱动程序、以实现控制、显示、触摸操作功能,接着完成检测部分(将线的一端置为高电平,另一端置为低电平,然后检测高电平的一端是否被对应的一端拉低,就可以知道此线路是否为短路或断路),最后完成人机界面的调试,实用验证,并对程序进行改进完善。
3.1 检测原理与流程
多线检测仪的检测流程如图7所示,由STM32RBT6(主机)单片机通过串口向STM32ZET6(从机)单片机发送检测命令,从机模块接收到命令后,从第一个检测管脚从上到下依次置为低电平,然后查询其余管脚是否被拉低,检测完成后,将结果通过串口发送给主机模块,主机接收到信息后,判定检测的线路中的互连关系,检测完成即通过蜂鸣器鸣响告知,并将检测到的线间互连关系以表格形式显示出来。
图7 检测流程图
3.2 主机模块串口处理程序
当STM32ZET6(从机)单片机检测完端口后,需将检测数据通过串口发送给STM32RBT6(主机)单片机,则主机需将接收到的数据进行处理,如下为串口处理程序:
串口处理程序 |
void serial_cmd(void)//串口通讯命令处理 { uint16_t CMD=0;//定义一个命令控制字缓存变量 uint16_t Num=Rx_num;//定义一个变量用来存储需要处理的数据数量 uint16_t cmd_num=0;//定义一个变量用来存储当前已经处理完的命令数量 while(Num!=0)//判断数据是否全部处理完成 { if( RxBuffer1[0] == 0xA5 )//判断命令的开头是否与通讯协议定义的前导头一致 { RxBuffer1_to_UP_DATA();//将缓存中的数据赋值到结构体中 if( jiaoyan() )//将接收到的命令进行格式数据校验 { CMD=UP_DATA.CMD1;//保存控制字 CMD=(CMD<<8)+UP_DATA.CMD2; switch(CMD)//查找对应的命令,进行相应处理 { case GJ_CMD: //管脚导通数据命令 write_DATA();//将数据保存到Flash中 Data_num++;//命令数量累加 if(Data_num>=cmd_num)GJ_CC_OK=1; //当接收到的数量大于等于需接收的命令数量时,将应答标志位置1 break; case GJ_CC_num: //管脚导通数量命令 cmd_num=UP_DATA.DATA[0]*256+UP_DATA.DATA[1];//保存需接收命令数量 if(cmd_num==0)GJ_CC_OK=1,Data_num=0; //如果需接收数量为0,则将应答标志位置1 break; default: break; } if(Num>=(UP_DATA.Long+2)) { Num=Num-(UP_DATA.Long+2);//数据 memcpy(&RxBuffer1[0],&RxBuffer1[UP_DATA.Long+2],Num); } } else Num=0;//缓存数据清零 } else Num=0;//缓存数据清零 osDelay(1);//延时函数 } } |
串口通讯命令处理函数程序流程图如下所示:
图8 串口通讯命令处理函数程序流程图
3.3 触摸屏坐标采集程序
ADS7843是4线电阻触摸屏转换接口芯片。它是一款具有同步串行接口的12位取样模数转换器。ADS7843是一款连续近似记录(SAR)的a/d转换器。可通过连结触摸屏X+触摸信号输入到a/d转化器。同时打开 Y+和Y-的驱动,然后数字化X+的电压。从而得到当前Y位置的测量结果。同理,也可得到X方向的坐标。当点击触摸屏时,ADS7843会产生一串数字信号,此时程序员需将这些数据捕捉下来,并进行处理分析。电阻屏坐标采集函数流程图如图9所示。如下为触摸屏坐标采集程序:
触摸屏坐标采集程序 |
#define times 4//宏定义采样次数 void ADS7843_Rd_Addata(uint16_t *X_Addata,uint16_t *Y_Addata)//坐标采集函数 { uint16_t i=0,j=0,k=0,x_addata[times],y_addata[times];//定义缓存变量 for(i=0;i<times;i++) //采样4次. { SPI1_Config();//SPI配置 ADS7843_CS_LOW(); //芯片允许 ADS7843_WrCmd( CHY ) ;//写入读取Y坐标控制字 SPI1_SCK_HIGH();//产生一个下降沿 SPI1_SCK_LOW(); y_addata[i] = ADS7843_Read() ;//保存Y坐标AD值 ADS7843_CS_HIGH(); ADS7843_CS_LOW(); //芯片允许 ADS7843_WrCmd( CHX ) ; //写入读取X坐标控制字 SPI1_SCK_HIGH();//产生一个下降沿 SPI1_SCK_LOW(); x_addata[i] = ADS7843_Read() ; //保存X坐标AD值 ADS7843_CS_HIGH(); } for(i=0;i<times;i++)//将采集的坐标数据进行升序排列 { for(j=0;j<times;j++) { if(x_addata[j] < x_addata[i]) { k = x_addata[j]; x_addata[j] = x_addata[i]; x_addata[i] = k; } if(y_addata[j] < y_addata[i]) { k = y_addata[j]; y_addata[j] = y_addata[i]; y_addata[i] = k; } } } *X_Addata=((x_addata[1] + x_addata[2]) >> 1); 图9 屏坐标采集函数流程图 //去掉一个最大的和最小的,然后取平均值 *Y_Addata =((y_addata[1] + y_addata[2]) >> 1); } |
3.4 从机模块管脚检测程序
当STM32ZET6(从机)单片机接收到检测管脚指令时,从机需对所有端口进行逐一检测,若检测到有端口与其他端口导通,则需将此信息保存起来,等待全部检测完成后,再将所有数据信息发送给主机。管脚检测函数流程图如图10所示。
如下为管脚检测程序:
管脚检测程序 |
void GPIO_text(uint8_t num)//管脚检测 { uint16_t i=0,j=0; DATA_num=0; for(i=0;i<(num/2);i++)//循环置P1端为输出,并读P1和P2端IO口状态 { GPIO_Init(P1_gpio[i][0],P1_gpio[i][1]);//配置P1端IO输出口 for(j=i;j<(num/2);j++)//循环P1端1/2Num次 { if(Read_GPIO_Pin(P1_gpio[j][0],P1_gpio[j][1])==0&&i!=j) { //读P1端IO口状态 DATA[DATA_num][0]=1;DATA[DATA_num][1]=(i+1); //保存此端口与其导通端口的数据信息 DATA[DATA_num][2]=1;DATA[DATA_num][3]=(j+1); DATA_num++;//导通数量累加 } } for(j=j;j<num;j++)//循环P2端1/2Num次 { if(Read_GPIO_Pin(P2_gpio[j-num/2][0],P2_gpio[j-num/2][1])==0&&i!=j) //读P2端IO口状态 { DATA[DATA_num][0]=1;DATA[DATA_num][1]=(i+1); //保存此端口与其导通端口的数据信息 DATA[DATA_num][2]=2;DATA[DATA_num][3]=((j-num/2)+1); DATA_num++;//导通数量累加 } } } 图10 管脚检测函数流程图 for(i=0;i<(num/2);i++)//循环置P2端的输出口,并读P2端IO口状态 { GPIO_Init(P2_gpio[i][0],P2_gpio[i][1]);//配置P2端IO输出口 for(j=i;j<(num/2);j++)//循环P2端1/2Num次 { if(Read_GPIO_Pin(P2_gpio[j][0],P2_gpio[j][1])==0&&i!=j)//读P2端IO口状态 { DATA[DATA_num][0]=2;DATA[DATA_num][1]=(i+1); //保存此端口与其导通端口的数据信息 DATA[DATA_num][2]=2;DATA[DATA_num][3]=(j+1); DATA_num++;//导通数量累加 } } } } |
实物与演示
1、实物图片与应用实验;
实物图片
成品应用试验
样机完成后,对不同数量和类型的接线进行检测试用,并与传统万用表人工检测方式进行了比对,对检测耗费的时间、检测结果的准确率进行了统计。通过比对记录于表一。
表一
多线检测仪使用比对记录
实验序号 |
被测线数 |
设置断路、短路故障数 |
万用表人工检测 |
多线检测仪检测 |
||
检测平均耗时 |
检测准确率 |
检测平均耗时 |
检测准确率 |
|||
1 |
1 |
0 |
1s |
100% |
0.5s |
100% |
2 |
5 |
0 |
5s |
98% |
0.5s |
100% |
3 |
10 |
3 |
14s |
91% |
0.5s |
100% |
4 |
15 |
3 |
25s |
87% |
0.5s |
100% |
5 |
20 |
4 |
40s |
86% |
1s |
100% |
6 |
30 |
4 |
55s |
82% |
1s |
100% |
7 |
40 |
9 |
81s |
76% |
2s |
100% |
8 |
50 |
15 |
122s |
73% |
3s |
100% |
结论:使用多线检测仪,可以完成对不同数量线路的检测(1到50路),直接给出线路间互连关系表格,检测用时明显缩短、工作效率高,检测过程由程序控制自动进行,不会出现因人工操作失误导致的误判、准确率高,操作使用便捷。
后期改进意见:人机界面更优化,显示更明确,并研究与手机的通讯,检测种类更丰富。其准确率对应图表如下图所示。
图14 检测耗时与准确率对应表
2、演示视频和源码;