简易照明线路探测仪

  • 格式:docx
  • 大小:90.42 KB
  • 文档页数:16

简易照明线路探测仪摘要本简易照明线路探测仪是以STM32F103VC单片机为控制核心设计的,该系统主要由STM32单片机控制模块、超声波定位模块、TFT彩色液晶显示模块、探测线路模块和直流稳压电源模块组成。

探测线路模块由LMV358芯片搭建前级运算放大电路,后级用电压跟随电路输出所需要的信号。

STM32运算速度快,计算精度高,且内部自带12位高精度AD,减少了外围电路设计,增强了系统的稳定性,适用于强干扰和要求速度较高的场合。

关键词:STM32TFT液晶超声波 LMV358AbstractThe detector is a simple lighting circuit STM32F103 microcontroller core design, the system is mainly controlled by the STM32 chip module, ultrasonic positioning module, TFT color LCD module, the detection circuit module and the DC power supply module. LMV358 chip detection circuit block built by the pre-operational amplification circuit, a detection circuit output stage after the desired signal. STM32 MCU operation speed, high accuracy, and comes with 12 internal precision AD, reducing the external circuit design, enhanced system stability, strong interference and demands for higher speed applications.一、系统方案比较与论证根据题目要求,系统分为以下几个模块,各模块的实现方案选择如下:1.主控器件比较与选择方案一:采用AT89S51单片机,能做到技术成熟,调试方便,价格便宜。

但是由于系统用到了AD、显示等部分,容易使外围电路变得复杂,并且该单片机的运行速度相对较慢,I/O口较少,增加了制作难度,不利于程序的编写和系统的执行。

方案二:采用STM32作为核心控制,其自带两个16通道12位A/D,多达8个定时器,资源丰富、I/O口多、功耗低、速度高,主频可达72M,在嵌入式领域中应用广泛,并且稳定性强,为以后系统的升级,作品的商品化提供了保障。

为简化外围电路设计,减小系统功耗,综合考虑采用方案二。

2. 定位坐标方案的选择方案一:采用按键输入法,当判断出有照明线路时,把坐标号通过按键手动输入进去,但是这种方法中的按键抖动容易出错,而且按键输入需要一定的时间,造成测量时间加长,以致于不能满足题目要求。

方案二:采用红外对管收发器判断照明线路存在的方格号,而且能够通过软件自动记录照明线路存在的位置,判断使用时间短,但是需要49组红外收发系统,外围电路复杂,易出错;而且线路中存在干扰信号的话不能够保证信号的准确性和有效性。

方案三:采用超声波测量每格到达边沿的距离定位方格的坐标,通过两个方向夹角为90°的超声波发射模块测距,来判断所探测方格的位置坐标,这种方法简单有效,经测试精度较高,大大提高了测量速度。

综上,为简化电路,最大限度提高判断速度和精度采用方案三。

3.界面显示方案的选择方案一:采用Nokia 5110液晶显示,5110体积小,价格便宜,不需要外围电路,控制方便,耗能较低,但是液晶屏分辨率低,显示内容少,视觉效果不好。

方案二:采用液晶12864显示,12864显示界面相对比较大,分辨率也相对较高,但是在显示带电电缆走向时界面效果相对差一点,但是比液晶5110要好得多。

方案三:采用彩色液晶TFT,液晶分辨率高,显示界面的面积相对比较大,显示界面更加直观完美,而且屏幕为触摸屏,可以减少外围按键电路,使用起来更加方便。

综上为了显示更加直观和人们视觉的舒适度采用液晶TFT彩色液晶。

4.照明探测电路的选择方案一:采用霍尔元件进行测量,霍尔元件对于测量磁场、电流、电场强度等有很好的测量能力,因此,首选的是用霍尔元件;但是对于题目来说测量的是双向的工频50HZ交流电流,几乎所有霍尔元件测量的是单根电缆的电流量,因此霍尔元件不能够有效测量。

方案二:采用HMC5883磁阻传感器对信号进行测量,HMC5883是专业的对电磁信号进行采集的芯片,测量精确,速度快,但是芯片外围电路复杂,价格高昂。

对于本作品来说不需要很高的精度,因此不使用此方案。

方案三:用LMV358搭建一个检波电路和放大电路,由于在电缆中通过的是工频交流信号,通过探测触头的采集会产生不同幅度的信号,幅度的不同,探头离电缆的距离也不同,而且电缆的功率也不同,由此可判断电缆的位置以及不同功率的电缆。

而且外围电路简单,调试方便。

由于测的是电缆的位置,只需要比较出有无电缆时检测到的信号的幅度以及之间的关系,所以选定方案三。

二、理论分析与计算1.采集电路的设计采集电路使用LMV358低电压单电源供电双运放的芯片,供电电压为3.3V,低功耗,通过LMV358把测得信号进行放大之后进行电压跟随输出。

通过制作一个金属触头,触头是一个电容型感应采集电路,电缆与触头之间相当于一个电容,有无通电电的缆情况可以转换为磁场的强弱,磁场的强弱可以改变触头周围的电荷的聚集,这样通过容性触头对电荷的采集,也就是电容触头的充放电,这样就可以转换为一种微弱的电压信号,进而能够采集到电缆的微弱信号。

由于金属探头非常灵敏,搭建的电路输入阻抗在10M以上,除此之外还需要在触头部分设计屏蔽,屏蔽采用铝箔罩在触头周围,并且铝箔进行可靠接地保证屏蔽的效果。

触头信号经过放大10倍之后,通过示波器观察会出现一个不规则的类似于正弦波的直流信号,而且在触头经过电缆的同时波形的峰峰值会瞬间增大,由此可以在增大的地点就认定为有通电电缆存在。

以此经过放大、跟随器和检波电路之后进入12位AD转换器转换为数字量,通过多次反复的测试得出平均值在200-600mV 之间时测试点没有通电电缆通过,当数字量反应为电压平均值在900-1500mV 时就判断在此地点有通电电缆存在,而且经过反复测试,温度也会影响这些门限值,温度高的话会增加杂波的影响,因此在软件中加入调节门限值的功能。

2.超声波定位系统本系统采用两个超声波测距模块夹角呈90°摆放,这样可以体现出一个坐标的范围。

由于在板面有7*7个边长为150mm 的正方形这样可以通过超声波计算出坐标点,具体分析如下:设定在X 轴上测得的距离为X1,Y 轴上的测的距离为Y1,则:1x / 150 = 2X ; 1y / 150 = 2Y ;2X * A + 2Y * B = Z;(Z 为坐标值也就是格的序列号) 通过计算二元一次方程组可得出(坐标值)z 437y -x 22=+这样在计算出1x 和1y 的值也就是超声波测距模块所测得的值,这样坐标位置很 快就出来了。

3.数字滤波对于采集的信号需要进行数字滤波之后进行判断。

数字滤波是通过软件程序来实现的,在程序中设定一个触发时钟,时钟为100K ,采集的数据在一个数组中,数组有200个数据,通过100K 频率的扫描挑选出10个最大值,10个最大值进行平均值计算,这样可以滤去因为突变、杂波或者高频信号的影响。

三、电路与程序设计根据题目要求,经仔细分析计算,充分考虑各种因素,制定整体制作方案。

整体方案以STM32单片机为控制核心,对AD 采集的数据进行综合分析,作出相应的处理。

系统方框图如图1所示。

图1系统方框图1.电路设计(1)系统电源设计本系统采用直流稳压线性电源,LM7805和LM7905分别输出±5V电压,输出电流能够达到系统要求,该电源模块具有稳定性好,负载响应快,输出纹波小,效率高等优点。

系统电源原理图如图2所示:图2 系统电源原理示意图(2)信号采集电路信号采集电路采用LMV358制作的检波放大电路,信号系统原理图如图3所示:图3 信号采集电路(3)主控系统电路主控芯片由SMT32单片机作为主控芯片,如图4所示:图4程序流程图2.程序设计STM32系列微控制器采用C语言进行程序设计,开发调试环境为keil 4,软件总体设计流程图如图5所示。

四、系统测试1.测试仪器数字式万用表(FLUKE 15B);泰克TDS 2012 B2.测量数据五、结论系统结构简单,性能稳定,完成了全部基本功能和部分发挥功能附件:#include "stm32f10x.h"#include "delay.h"#include "reveal.h"#include "TIMx.h"#include "UW A VE.h"#include "TIM.h"#include "key.h"#include "adc.h"#include "buzzer.h"int main(void){delay_init(72);KEY_GPIO();TIM_test();UW A VE_test();Ac_Adc_Configuration();Buzzer_inte();while (1){InterfaceDisplay();}}/**************************************************************************** * 名称:void ili9320_Initializtion()* 功能:初始化ILI9320 控制器* 入口参数:无* 出口参数:无* 说明:* 调用方法:ili9320_Initializtion();****************************************************************************/ void ili9320_Initializtion(){/******************************* 硬件连接说明**PD14 FSMC_D0PD15 FSMC_D1PD0 FSMC_D2PD1 FSMC_D3PE7 FSMC_D4PE8 FSMC_D5PE9 FSMC_D6PE10 FSMC_D7PE11 FSMC_D8PE12 FSMC_D9PE13 FSMC_D10PE14 FSMC_D11PE15 FSMC_D12PD8 FSMC_D13PD9 FSMC_D14PD10 FSMC_D15PD7 FSMC_NCE2/CS (连接到4053上,和NAND共用)PD11 FSMC_A16/RSPD5 FSMC_NWE/WRPD4 FSMC_NOE/RDPC4 RESETPC5 PWM4053片选PA3 CS_Select******************************/u32 i;LCD_X_Init();Delay(5); /* delay 50 ms */Delay(5); /* delay 50 ms */ //start internal oscDeviceCode = LCD_ReadReg(0x0000);if(DeviceCode==0x9320){LCD_WriteReg(0x00,0x0000);LCD_WriteReg(0x01,0x0100); //Driver Output Contral.LCD_WriteReg(0x02,0x0700); //LCD Driver Waveform Contral.#ifdef Vertical_Initializtion /*Vertical Initializtion*/LCD_WriteReg(0x03,0x1030); //Entry Mode Set.#else /*Horizontal Initializtion*/LCD_WriteReg(0x03,0x1018); //Entry Mode Set.#endifLCD_WriteReg(0x04,0x0000); //Scalling Contral.LCD_WriteReg(0x08,0x0202); //Display Contral 2.(0x0207)LCD_WriteReg(0x09,0x0000); //Display Contral 3.(0x0000)LCD_WriteReg(0x0a,0x0000); //Frame Cycle Contal.(0x0000)LCD_WriteReg(0x0c,(1<<0)); //Extern Display Interface Contral 1.(0x0000)LCD_WriteReg(0x0f,0x0000); //Extern Display Interface Contral 2.for(i=50000;i>0;i--);for(i=50000;i>0;i--);LCD_WriteReg(0x07,0x0101); //Display Contral.for(i=50000;i>0;i--);for(i=50000;i>0;i--);LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //Power Control 1.(0x16b0)LCD_WriteReg(0x11,0x0007); //Power Control 2.(0x0001)LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0)); //Power Control 3.(0x0138)LCD_WriteReg(0x13,0x0b00); //Power Control 4.LCD_WriteReg(0x29,0x0000); //Power Control 7.LCD_WriteReg(0x2b,(1<<14)|(1<<4));LCD_WriteReg(0x50,0); //Set X Start.LCD_WriteReg(0x51,239); //Set X End.LCD_WriteReg(0x52,0); //Set Y Start.LCD_WriteReg(0x53,319); //Set Y End.LCD_WriteReg(0x60,0x2700); //Driver Output Control.LCD_WriteReg(0x61,0x0001); //Driver Output Control.LCD_WriteReg(0x6a,0x0000); //Vertical Srcoll Control.LCD_WriteReg(0x80,0x0000); //Display Position? Partial Display 1.LCD_WriteReg(0x81,0x0000); //RAM Address Start? Partial Display 1.LCD_WriteReg(0x82,0x0000); //RAM Address End-Partial Display 1.LCD_WriteReg(0x83,0x0000); //Displsy Position? Partial Display 2.LCD_WriteReg(0x84,0x0000); //RAM Address Start? Partial Display 2.LCD_WriteReg(0x85,0x0000); //RAM Address End? Partial Display 2.LCD_WriteReg(0x90,(0<<7)|(16<<0)); //Frame Cycle Contral.(0x0013)LCD_WriteReg(0x92,0x0000); //Panel Interface Contral 2.(0x0000)LCD_WriteReg(0x93,0x0001); //Panel Interface Contral 3.LCD_WriteReg(0x95,0x0110); //Frame Cycle Contral.(0x0110)LCD_WriteReg(0x97,(0<<8)); //LCD_WriteReg(0x07,0x0173); //(0x0173)}else if(DeviceCode==0x1505){// second release on 3/5 ,luminance is acceptable,water wave appear during camera preview LCD_WriteReg(0x0007,0x0000);ili9320_Delay(5);LCD_WriteReg(0x0012,0x011C);//0x011A why need to set several times?LCD_WriteReg(0x00A4,0x0001);//NVM//LCD_WriteReg(0x0008,0x000F);LCD_WriteReg(0x000A,0x0008);LCD_WriteReg(0x000D,0x0008);//GAMMA CONTROL/LCD_WriteReg(0x0030,0x0707);LCD_WriteReg(0x0031,0x0007); //0x0707LCD_WriteReg(0x0032,0x0603);LCD_WriteReg(0x0033,0x0700);LCD_WriteReg(0x0034,0x0202);LCD_WriteReg(0x0035,0x0002); //?0x0606LCD_WriteReg(0x0036,0x1F0F);LCD_WriteReg(0x0037,0x0707); //0x0f0f 0x0105LCD_WriteReg(0x0038,0x0000);LCD_WriteReg(0x0039,0x0000);LCD_WriteReg(0x003A,0x0707);LCD_WriteReg(0x003B,0x0000); //0x0303LCD_WriteReg(0x003C,0x0007); //?0x0707LCD_WriteReg(0x003D,0x0000); //0x1313//0x1f08ili9320_Delay(5);LCD_WriteReg(0x0007,0x0001);LCD_WriteReg(0x0017,0x0001); //Power supply startup enableili9320_Delay(5);//power control//LCD_WriteReg(0x0010,0x17A0);LCD_WriteReg(0x0011,0x0217); //reference voltage VC[2:0] Vciout = 1.00*VcivlLCD_WriteReg(0x0012,0x011E);//0x011c //Vreg1out = Vcilvl*1.80 is it the same as Vgama1out ?LCD_WriteReg(0x0013,0x0F00); //VDV[4:0]-->VCOM Amplitude VcomL = VcomH -Vcom AmplLCD_WriteReg(0x002A,0x0000);LCD_WriteReg(0x0029,0x000A); //0x0001F Vcomh = VCM1[4:0]*Vreg1out gate source voltage??LCD_WriteReg(0x0012,0x013E); // 0x013C power supply on//Coordinates Control//LCD_WriteReg(0x0050,0x0000);//0x0e00LCD_WriteReg(0x0051,0x00EF);LCD_WriteReg(0x0052,0x0000);LCD_WriteReg(0x0053,0x013F);//Pannel Image Control//LCD_WriteReg(0x0060,0x2700);LCD_WriteReg(0x0061,0x0001);LCD_WriteReg(0x006A,0x0000);LCD_WriteReg(0x0080,0x0000);//Partial Image Control//LCD_WriteReg(0x0081,0x0000);LCD_WriteReg(0x0082,0x0000);LCD_WriteReg(0x0083,0x0000);LCD_WriteReg(0x0084,0x0000);LCD_WriteReg(0x0085,0x0000);//Panel Interface Control//LCD_WriteReg(0x0090,0x0013); //0x0010 frenqucyLCD_WriteReg(0x0092,0x0300);LCD_WriteReg(0x0093,0x0005);LCD_WriteReg(0x0095,0x0000);LCD_WriteReg(0x0097,0x0000);LCD_WriteReg(0x0098,0x0000);LCD_WriteReg(0x0001,0x0100);LCD_WriteReg(0x0002,0x0700);#ifdef Vertical_Initializtion /*Vertical Initializtion*/LCD_WriteReg(0x03,0x1030); //Entry Mode Set.#else /*Horizontal Initializtion*/LCD_WriteReg(0x03,0x1018); //Entry Mode Set.#endif// LCD_WriteReg(0x0003,0x1030);LCD_WriteReg(0x0004,0x0000);LCD_WriteReg(0x000C,0x0000);LCD_WriteReg(0x000F,0x0000);LCD_WriteReg(0x0020,0x0000);LCD_WriteReg(0x0021,0x0000);LCD_WriteReg(0x0007,0x0021);ili9320_Delay(20);LCD_WriteReg(0x0007,0x0061);ili9320_Delay(20);LCD_WriteReg(0x0007,0x0173);ili9320_Delay(20);}else if(DeviceCode==0x8989||DeviceCode==0x8189){LCD_WriteReg(0x0000,0x0001); //打开晶振LCD_WriteReg(0x0003,0xA8A4); //0xA8A4#ifdef Vertical_Initializtion /*Vertical Initializtion*/LCD_WriteReg(0x11,0x6070); //Entry Mode Set.#else /*Horizontal Initializtion*/LCD_WriteReg(0x11,0x6058); //Entry Mode Set.#endifLCD_WriteReg(0x000C,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x000D,0x080C); ili9320_Delay(1000);LCD_WriteReg(0x000E,0x2B00); ili9320_Delay(1000);LCD_WriteReg(0x001E,0x00B0); ili9320_Delay(1000);LCD_WriteReg(0x0001,0x2B3F); ili9320_Delay(1000); //驱动输出控制320*240 0x6B3F 0x2B3FLCD_WriteReg(0x0002,0x0600); ili9320_Delay(1000);LCD_WriteReg(0x0010,0x0000); ili9320_Delay(1000);//// LCD_WriteReg(0x0011,0x6058); ili9320_Delay(1000); //0x4030 6070 //定义数据格式16位色横屏0x6058// LCD_WriteReg(0x0011,0x6070); ili9320_Delay(1000);//0x6068 横屏LCD_WriteReg(0x0005,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0006,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0016,0xEF1C); ili9320_Delay(1000);LCD_WriteReg(0x0017,0x0003); ili9320_Delay(1000);LCD_WriteReg(0x0007,0x0233); ili9320_Delay(1000); //0x0233LCD_WriteReg(0x000B,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x000F,0x0000); ili9320_Delay(1000); //扫描开始地址LCD_WriteReg(0x0041,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0042,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0048,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0049,0x013F); ili9320_Delay(1000);LCD_WriteReg(0x004A,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x004B,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0044,0xEF00); ili9320_Delay(1000);LCD_WriteReg(0x0045,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0046,0x013F); ili9320_Delay(1000);LCD_WriteReg(0x0030,0x0707); ili9320_Delay(1000);LCD_WriteReg(0x0031,0x0204); ili9320_Delay(1000);LCD_WriteReg(0x0032,0x0204); ili9320_Delay(1000);LCD_WriteReg(0x0033,0x0502); ili9320_Delay(1000);LCD_WriteReg(0x0034,0x0507); ili9320_Delay(1000);LCD_WriteReg(0x0035,0x0204); ili9320_Delay(1000);LCD_WriteReg(0x0036,0x0204); ili9320_Delay(1000);LCD_WriteReg(0x0037,0x0502); ili9320_Delay(1000);LCD_WriteReg(0x003A,0x0302); ili9320_Delay(1000);LCD_WriteReg(0x003B,0x0302); ili9320_Delay(1000);LCD_WriteReg(0x0023,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0024,0x0000); ili9320_Delay(1000);LCD_WriteReg(0x0025,0x8000);ili9320_Delay(1000);LCD_WriteReg(0x004f,0); //行首址0LCD_WriteReg(0x004e,0); //列首址0}}参考文献[1]童诗白华成英主编 . 模拟电子技术基础(第四版). 北京:高等教育出版社,2006.5[2]阎石主编. 数字电子技术基础(第五版). 北京:高等教育出版社[3][日]冈村廸夫著. 王玲徐雅珍李武平译.OP放大电路设计.北京:科学出版社,2004[4]谭浩强著. C程序设计(第三版).北京:清华大学出版社,2005.7(实用电子电路设计丛书)[5]美)弗洛伊德著,罗伟雄等译 . 电路原理.北京:电子工业出版社,2005.10[6]金仁贵著.电工基础.北京:北京大学出版社,2005.9.1。