登录站点

用户名

密码

牛人制造——手机虚拟示波器

3已有 1441 次阅读  2012-02-22 19:38   标签示波器  信号  蓝牙串口 
牛人设想:随着单片机等电子技术的发展,以及智能手机的普及,设计一个能和手机配套使用的虚拟示波器,不但成本低,而且携带使用更方便。

1、硬件设计电路
包括信号预处理、单片机、蓝牙串口模块和电源4部分,于是蓝牙虚拟示波器电路原理图热火出炉
1.1 信号预处理
单片机AD转换电压范围是0~3.3V,为了能测量交流信号,把输入信号地端接RP3调节出的1.65V,这样就能测到-1.65~+1.65V的电压。实际工作中电工测量电压范围从几伏到几百伏,为此加入了电阻降压网络R1、R2、R4、R5、RP1和RP2,这样就能测到60V的电压,再加上个有x10挡(放大10倍)的示波器探头,最大可测到600V电压。LM358是双运放,接成电压跟随器方式,主要作用是提高输入阻抗,使示波器标入阻抗是1MΩ,否则示波器探头放到x10挡时,测量数值会有偏差。运放还能起到当输入信号过大时,**输入到单片机的信号幅度,保护单片机的作用。共有2个信号输入端,组成双踪示波器,可以比较2路信号的相位关系。
1.2 单片机
选用了飞利浦的单片机P89LPC938,是基于80C51内核的低功耗FLASH单片机,其内部有7.373MHz振荡器、复位电路、8通道10位AD转换器,8K字节Flash程序存储器、768字节RAM数据存储器,这使得外围电路很简洁。为了提高AD转换速度和提高通信波特率的准确程度,使用了外部12MHz晶振。单片机的P2.0(AD07)、P2.1(AD06)接双运放LM358的电压输出,单片机的P1.0(TXD)、P1.1(RXD)接蓝牙模块的串口。
1.3 蓝牙串口模块
蓝牙串口模块主要参数:兼容蓝牙V2.0 规范、CLASS 2 标准,传输距离最大10M,支持SPP 服务(串口)。功能多的蓝牙模块可更改主从设置,默认为从设备,可以和电脑或手机蓝牙连接,还可以更改通信波特率,默认是9600bps,可更改为较大的波特率,如115200bps,加快通信速度。默认配对密码是1234,每次搜索蓝牙模块前先给蓝牙模块上电再搜索,再次搜索时要先把蓝牙模块重新上电,否则可能搜索不到。
1.4 电源
电源选用电池,携带方便,避免外接电源对测量数据的干扰。经三端稳压变为3.3V给单片机和蓝牙模块供电。


2 单片机软件编程
2.1 程序流程
单片机软件用Keil C51编写,主要流程是等待手机发来测试命令,收到命令后根据命令采集数据并存储到内部RAM,采集完一组数据后一起发送给手机,这样一个测试周期完成,等待下一个测试命令,流程图见图2。手机发出测试命令是4个字节,首字节是头标志“0xDB”,第2个字节代表量程选择,如果量程命令是非零字节,表示量程为15V,如果量程命令是零,表示量程为60V。第3、4字节是采样周期数据,控制采样频率,采样周期范围为50us~10ms,最高采样频率20kHz。每通道240个数据,共采集480个数据。
2.2 数字变量程单片机P89LPC938模数转换精度是10位,手机显示用8位就可以了,利用2位的差别可以实现4倍的数字变量程功能。硬件量程为±60V,对应转换后的数字是0~1023,除以4后的范围是0~255,输入信号在±15V范围内时,转换后的数字是384~639,减去384后的范围还是0~255。这样就实现了数字变量程的功能。有了2种量程选择,再配合示波器表笔上带的硬件变量程,使用的时候有4种量程选择±15V、±60V、±150V和±600V,能够满足常用的电气设备测量需要。

3 手机软件编程
3.1 开发环境配置
首先安装J2SE即JDK(jdk-6u22-windows-i586-p.exe),安装完成后,在“我的电脑—》属性—》高级”中,配置java环境变量,设置3项属性,JAVA_HOME,PATH,CLASSPATH,若已存在则点击“编辑”,不存在则点击“新建”, JAVA_HOME指明JDK安装路径,PATH使得系统可以在任何路径下识别java命令,设为%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin,CLASSPATH为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别,设为.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar。
接着安装WTK(sun_java_wireless_toolkit-2_5_2-ml-windows) ,默认路径是C:\WTK25。WTK 的全称是Sun J2ME Wireless Toolkit ,是Sun的无线开发工具包。以上软件均可以在sun的官方网站免费下载。
最后安装Eclipse作为开发环境,J2ME开发包工具可以被绑定在这些集成开发环境中,进一步提高开发效率。本设计用的是Eclipse3.6.2和EclipseMe1.7.9版本的软件。
3.2 蓝牙连接
     手机蓝牙和蓝牙串口模块之间的连接,是程序设计的重点,也是难点。这个连接过程就是创建一个蓝牙客户端,分查找设备、查找服务、获得连接URL和建立连接4个主要步骤。具体代码如下:
//查找蓝牙设备
public void MyInquiry() {                    
    try {
        //获得本地设备
        LocalDevice localDevice = LocalDevice.getLocalDevice();
        //获得发现代理
         discoveryAgent = localDevice.getDiscoveryAgent();
         //开始查找设备
         discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
     } catch(Exception e) {
        e.printStackTrace();
     }
}
// DiscoveryListener接口,记录已找到蓝牙设备并显示
public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass cod) {            
    try{
        sel.append(remoteDevice.getFriendlyName(true),null);
    } catch(Exception e){
        sel.append(remoteDevice.getBluetoothAddress(),null);
    } finally{
        remoteDevices.addElement(remoteDevice);
     }            
}
// DiscoveryListener接口,查找设备完成
public void inquiryCompleted(int discType) {
    if (remoteDevices.size() > 0) {
             //加入其它代码,如查找服务
    }
    else {
    }            
}
//查找服务
public void MyServices(){
    try {
         RemoteDevice remoteDevice = (RemoteDevice)remoteDevices.elementAt(sel.getSelectedIndex());
         discoveryAgent.searchServices(attrSet, uuidSet, remoteDevice , this);
         } catch(Exception e) {
             e.printStackTrace();
    }
}
// DiscoveryListener接口,服务查找成功,得到连接ULR
public void servicesDiscovered(int transID, ServiceRecord[] servRecord){
    DataElement serviceNameElement = servRecord[sel.getSelectedIndex()].getAttributeValue(0x0100);
    String _serviceName = (String)serviceNameElement.getValue();
    String serviceName = _serviceName.trim();
    btConnectionURL = servRecord[sel.getSelectedIndex()].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
}
//DiscoveryListener接口,查找服务完成
public void serviceSearchCompleted(int transID, int respCode) {
    if (respCode == DiscoveryListener.SERVICE_SEARCH_COMPLETED) {       } else {}            

}
//打开连接,建立输入、输出通道
StreamConnection connection = (StreamConnection)Connector.open(btConnectionURL);

经过以上步骤,手机和蓝牙串口模块建立起了连接,用read、write方法可以互相通信,传输数据了。

3.3 波形显示
     测试程序用的是三星S3370手机,屏幕分辨率为320x240,屏幕上、下侧用于显示手机状态和按键信息,实际可编程使用的分辨率为200x240,上部170x240部分显示波形,下部30x240显示量程、周期选择菜单。按示波器的习惯把显示波形的界面画出格子,通过查格子可以大致判断波形的幅值和周期。


4 结束语
制作了测试用电路板见图3,预留了外接电源插座,使用的是外接4节1.5V电池
图3:测试用电路板正反面图

上电后不接信号输入,打开手机蓝牙,运行手机上的软件,测试的结果应该显示直线,且直线在中间位置,否则调节RP3使测试直线显示到中间位置,然后2路输入同样的10V直流电压信号,调节RP1、RP2,使直线显示到正确位置,调整完毕。对一个可控硅调节控制电路测试,手机显示见图4。量程20V表示纵向每格为20V,周期6ms表示横向每格6ms。2个按键,每按下“测量”1次,测量1次并显示波形,按“退出”则结束程序的运行。按左右按钮选择量程或周期,按上下则调整量程或周期。经测试,达到了预期设计目的
图4:测试时手机显示的波

上一篇: U盘常见故障的维修方法 下一篇: 5.0M摄像头调试手记

分享 举报

发表评论 评论 (2 个评论)

涂鸦板