• 传感器系列之4.7地磁传感器


    4.7地磁传感实验

    一、实验目的

    1.掌握LPC2378芯片的编程方法
    2. 掌握地磁传感器的工作原理
    3. 掌握地磁传感器的使用流程

    二、实验材料

    1.具有USB 串口通讯的PC 机1 台
    2.ADS1.2 集成开发软件1 套
    3.J-Link-ARM 仿真器及软件1 套
    4.NXP LPC2378 实验节点板1 个
    5.LCD 显示实验板1 个
    6.地磁传感器模块1个

    三、实验原理

      地磁传感器实验环境由PC机(安装有Windows XP操作系统、ADS1.2集成开发环境和J-Link-ARM-V410i仿真器)、J-Link-ARM仿真器、NXP LPC2378实验节点板、地磁传感器、实验模块和LCD显示实验模块组成,如图4.7.1所示。

    这里写图片描述
    图4.7.1 传感器实验环境

    1. 地磁传感器的应用

    1. 健身计划(step-counter)
    2. 导航应用、盲区导航(过隧道,地下商场)
    3. 驴行天下(electronic compass)
    4. 游戏应用
    5. 手势及姿态识别
    6. 其它

    2.地磁传感器的工作原理

      地磁传感器是一类利用被测物体在地磁场中的运动状态不同,通过感应地磁场的分布变化而指示被测物体的姿态和运动角度等信息的测量装置。
    三类不同传感器的区别:

    名称 区别
    G-sensor 线性加速度
    陀螺仪 角速度
    地磁 sensor角度

      由于被测设备在地磁场中处于不同的位置状态,地磁场在不同 方向上的磁通分布是不同的,地 磁sensor就是通过检测三个轴线 上磁场强度的变化而指示被测设备的状态的。
    目前,可用于检测地磁场分布变化的技术原理主要有:

    1. 磁阻效应:当沿着一条长而且薄的铁磁合金的长度方向施 加一个电流,在垂直于电流的方向施加一个磁场,则合金带自身的阻值将会发生变化,此阻值变化的大小与磁场和 电流的大小密切相关。
    2. 霍尔效应:通过电流的半导体在垂直电流方向的磁场作用 下,在与电流和磁场垂直的方向上形成电荷的积累而出现 电势差。
    3. 电磁感应:线圈切割地磁场的磁力线则将在线圈的两端产 生感应电动势。
    4. AMR(相异性磁力阻抗感应)
    5. GMR(巨磁) 效应

    2.1电磁感应:

    2.1.1电磁感应现象的发现

    这里写图片描述
    图4.7.2 电磁感应现象

      在1831年法拉第发现了电磁感应,这个重要的发现来自于,当他将两条独立的电线环绕在一个大铁环,固定在椅子上,并在其中一条导线通以电流时,另外一条导线竟也产生电流。他因此进行了另外一项实验,并发现若移动一块磁铁通过导线线圈,则线圈中将有电流产生。同样的现象也发生在移动线圈通过静止的磁铁上方时。
      
      他的展示向世人建立起“磁场的改变产生电场”的观念。此关系由法拉第电磁感应定律建立起数学模型,并成为四条麦克斯韦方程组之一。这个方程组之后则归纳入场论之中。法拉第并依照此定理,发明了早期的发电机,此为现代发电机的始祖。

    2.1.2基于电磁感应原理的地磁sensor特点:

    1. 结构比较复杂,不利于实现;
    2. 结构原因,不能完全消除失调;
    3. 尤其需要注意的是:基于电磁感应原理的地磁sensor与其它地磁sensor的主要区别在于,电磁感应原理的地磁 sensor其工作条件不仅要求要有磁场的存在而且还要有切割磁场的运动,与被测物的运动速度密切相关,在便携式产品中应用极少。

    2.2霍尔效应:

    2.2.1霍尔效应的发现

      如图2(a)所示:假设,处于磁场的一条宽片型载流导线,其电流垂直于磁场,则其电荷载子会因为感受到洛伦兹力而偏向一边,从而在垂直于磁场、电流的方向产生电压于导线两侧。1879年,艾德温·霍尔(Edwin Hall)发现这效应,称为霍尔效应。由于能够辨明电荷载子到底带有正电还是带有负电,这效应最先证实,在载流导线里流动的电流,是由移动中的电子形成的,与质子无关。
      
      磁强计(magnetometer)应用霍尔效应为运作原理,可以用来测量磁场,或检查像不銹钢管道一类物体因腐蚀而产生的磁通量泄漏(magnetic flux leakage)。由于霍尔效应元件产生的讯号幅值非常微弱,必须加以放大,才能被侦测,所以,现在许多霍尔效应传感器都加入一个高增益集成电路放大器。霍尔效应传感器可以用来测量磁场、旋转速度、液体流速、电流、压力等等。
      
      在半导体领域,霍尔效应也可以应用于侦测在半导体一类物质内的主要电荷载子是负电子还是正空穴。霍尔效应推进器 是一种低功率的离子推进器。当太空船进入轨道或太空时,可以用霍尔效应推进器来推进太空船。

    这里写图片描述
    图4.7.3霍尔效应

    2.2.2霍尔效应传感器的特点

    1. Hall感应器能够检测半导体Hall薄膜的电压差VH;
    2. 结构比较简单,易于实现;
    3. 差分的实现方式;
    4. 失调的消除很重要。

    2.3磁阻效应

    2.3.1磁阻效应的发现

      磁阻效应(Magnetoresistance Effects)是指某些金属或半导体的电阻值随外加磁场变化而变化的现象。同霍尔效应一样,磁阻效应也是由于载流子在磁场中受到洛伦兹力而产生的。在达到稳态时,某—速度的载流子所受到的电场力与洛伦兹力相等,载流子在两端聚集产生霍尔电场,比该速度慢的载流子将向电场力方向偏转,比该速度快的载流子则向洛伦兹力方向偏转。这种偏转导致载流子的漂移路径增加。或者说,沿外加电场方向运动的载流子数减少,从而使电阻增加。这种现象称为磁阻效应。
      
    2.3.2磁阻效应传感器的特点

    1. Z 轴sensor的实现与高度的问题;
    2. sensor需要高精度的驱动电路。

    这里写图片描述
    图4.7.4 磁感现象

    2.4AMR(相异性磁力阻抗感应)

    2.4.1AMR简介
      
      AMR(Anisotropy of magnetoresistance)磁阻是一种受到外加磁场作用时改变其电阻值性质的材料。各向异性磁阻是材料的一种性质,在材料中可观察到电阻独立于电流方向和磁场方向之间的角度。这一效应是归于电子在磁场方向上s-d散射的更大可能性。净效应是,当电阻具有最大值时,电流方向平行于磁场。AMR效应能够用在多种传感器,作用于地球磁场测量(电子罗盘),用作GPS导航和磁场探测应用,以及智能交通系统。具有一定方向的初始磁偏置,在外磁场的作用下,两对阻抗一个变大一个变小,检测电路通过检测这一对阻抗变化的差值,输出一个大小与外磁场成比例的检测电压。
    这里写图片描述

    2.5自旋电子与GMR(巨磁) 效应:
      
      所谓巨磁阻效应,是指磁性材料的电阻率在有外磁场作用时较之无外磁场作用时存在巨大变化的现象。巨磁阻是一种量子力学效应,它产生于层状的磁性薄膜结构。这种结构是由铁磁材料和非铁磁材料薄层交替叠合而成。当铁磁层的磁矩相互平行时,载流子与自旋有关的散射最小,材料有最小的电阻。当铁磁层的磁矩为反平行时,与自旋有关的散射最强,材料的电阻最大。

      早在1988年,费尔和格林贝格尔就各自独立发现了这一特殊现象:非常弱小的磁性变化就能导致磁性材料发生非常显著的电阻变化。那时,法国的费尔在铁、铬相间的多层膜电阻中发现,微弱的磁场变化可以导致电阻大小的急剧变化,其变化的幅度比通常高十几倍,他把这种效应命名为巨磁阻效应(Giant Magneto-Resistive,GMR)。有趣的是,就在此前3个月,德国优利希研究中心格林贝格尔教授领导的研究小组在具有层间反平行磁化的铁/铬/铁三层膜结构中也发现了完全同样的现象。
    GMR纳米结构多层膜的电阻 随外磁场的变化而变化,而且具有 很高的灵敏度。

    2.5.1GMR效应

    1. 电子的自旋取向与铁磁层磁化方向相同时,电子所受到的散射较小,电子比较容易通过通路,反之,则受到的散射较大,不太容易 通过通路。
    2. 当相邻的铁磁层磁化方向是反向平行时, GMR纳米结构薄膜之间呈高阻态。
    3. 当外磁场较大时,铁磁层被磁化为同一个方 向,GMR纳米结构薄膜之间呈低阻态。

      如图4.7.5.1,当反铁磁耦合时(外加磁场为0)处于高阻态的导电输运特性,电阻=R1/2。如图4.7.5.2,外加磁场使得该磁性多层薄膜处于饱和状态时(相邻磁性层磁矩平行分布,而电阻处于低阻态的导电输运特性,电阻为 ,这里写图片描述

    这里写图片描述
    图4.7.5GMR原理

    3.MAG3110实验模块

      MAG3110是一款小型的低功耗、数字3轴磁力计,具有宽广的动态范围,能够在带有外部磁场的印刷电路板(PCB)中运行。MAG3110磁力计可以测量所处位置磁场(由地磁场和电路板组件产生的磁场加在一起的总和)的三个轴向的组成部分。与3轴加速度传感器结合使用时,可以获得不依赖方向的精确罗盘航向信息。MAG3110包括标准的I2C串行接口,能够测量高达10高斯的所在位置磁场,输出数据速率(ODR)可达80 Hz。相应的输出数据速率可以从12ms到数秒钟的采样间隔内调整。下面对MAG3110做简单介绍,具体内容请参考MAG3110的芯片使用手册。
      
    3.1MAG3110芯片引脚

      MAG3110的芯片连接图如图4.7.6所示。引脚的电气特性如表4.7.6所示

    这里写图片描述
    图4.7.6MAG3110芯片引脚图

      表4.7.1是MAG3110芯片的引脚说明。

    表4.7.1 MAG3110芯片引脚说明

    引脚 名称 功能
    1 Cap-A Bypass Cap for Internal Regulator
    2 VDD Power Supply, 1.95V – 3.6V
    3 NC No Connect – do not connect
    4 Cap-R Cap for Reset Pulse
    5 GND GND
    6 SDA I2C Serial Data (Write = 0x1C; Read = 0x1D)
    7 SCL I2C Serial Clock
    8 VDDIO Power for I/O Buffers, 1.65V - VDD
    9 INT1 Interrupt - Active High Output
    10 GND GND

    图4.7.7是MAG3110的框图。

    这里写图片描述
    图4.7.7.1MAG3110框图

      MAG3110的作用电路。芯片的供电通过VDD引线,电源衰减电容应该放在离PIN1或者PIN2附近。控制信号SCL和SDA不允许超过VDDIO+0.3V,当VDDIO撤去后,控制信号SCL和SDA将会通过内部的保护二极管所损逻辑信号。MAG3110传感器电路图如图4.7.7.2所示。

    这里写图片描述
    图4.7.7.2MAG3110电路图

    这里写图片描述
    图4.7.6 MAG3110的作用电路

    3.3MAG3110的测量模式

      MAG3110有3种测量模式。

    1. 连续测量模式
      在连续测量模式下,传感器以配置的频率进行连续的测量,然后将测量的数据置于数据寄存器中。
    2. 单次测量模式
      上电后的默认测量模式,在单次测量模式下,传感器进行单次测量,然后将测量的数据置于数据寄存器中。单次测量完成后,传感器变为空闲模式。
    3. 空闲模式
      在空闲模式下,传感器仍然可以通过I2C接口被访问,但是大多数耗电的功 能被禁用, 例如ADC, 放大器。

    3.4 MAG3110寄存器

    3.4.1 MAG3110寄存器列表

      下表列出了寄存器和他们的访问方式。所有的地址位置是8-bit。

    表4.7.2 MAG3110的寄存器列表

    地址位置 寄存器名 访问
    01 状态寄存器
    01 数据输出X MSB寄存器
    02 数据输出X LSB寄存器
    03 数据输出Z MSB寄存器
    04 数据输出Z LSB寄存器
    05 数据输出Y MSB寄存器
    06 数据输出Y LSB寄存器
    07 识别寄存器
    08 当前系统模式寄存器
    09 用户校准X MSB寄存器 读/写
    0A 用户校准X LSB寄存器 读/写
    0B 用户校准Y MSB寄存器 读/写
    0C 用户校准Y LSB寄存器 读/写
    0D 用户校准Z MSB寄存器 读/写
    0E 用户校准ZLSB寄存器 读/写
    0F 温度寄存器
    10 控制寄存器1 读/写
    11 控制寄存器2 读/写

    • 控制寄存器1:配置寄存器是用来设置数据的输出率和测量配置的装置。
    • 控制寄存器2:配置寄存器2对于设置装置增益。
    • 模式寄存器:一个8-bit且可以被读或写的模式寄存器。
    • 数据输出X 寄存器MSB和LSB:数据输出X是两个8-bit寄存器,数据输出寄存器A和数据输出寄存器B。这- 些寄存器保存从通道X得来的测量结果。数据输出X寄存器MSB包含测量结果中的MSB,并且数据输出X寄存器LSB 的测量结果中包含了LSB。
    • 数据输出Y寄存器MSB和LSB:同数据输出X相似。
    • 数据输出Z寄存器MSB和LSB:同数据输出X相似。
    • 状态寄存器:是一个8-bit的只读寄存器,它用来表明设备的状态,SR0到SR7指出了bit的位置,SR7表示第一个位的数据流。
    • 识别寄存器:识别寄存器用来识别设备,IRA0到IRA7指出位的位置,在识别寄存器中用IRA来表示位。
    • 用户校准X MSB和LSB寄存器:用户用来校正X的MSB和LSB数据。
    • 用户校准Y MSB和LSB寄存器:与识别寄存器A相似
    • 用户校准Z MSB和LSB寄存器

    3.4.2 常用寄存器说明

    3.4.2.1控制寄存器 CTRL_REG1

      除待机模式需要用到SANDBY寄存器,其他内容的设置都要通过控制寄存器来设置,控制寄存器的地址见表4.7.2,控制寄存器1的寄存器格式如表4.7.3所示,控制寄存器1的每一位的组合方式如表4.7.4所示。

    表4.7.3 控制寄存器1寄存器格式

    Bit7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    DR2 DR1 DR0 OS1 OS0 FR TM AC

    表4.7.4 控制寄存器1位组合方式

    组合 功能
    DR[2:0] Data rate selection. Default value: 000.See Table 30 for more information.
    OS[1:0] This register configures the over sampling ratio or measurement integration time.Default value: 0 0. See Table 30 for more information.
    FR Fast Read selection. Default value: 0. 0: The full 16-bit values are read.1: Fast Read, 8-bit values read from the MSB registers.
    TM Trigger immediate measurement. Default value: 0. 0: Normal operation based on AC condition.1: Trigger measurement.If part is in ACTIVE mode, any measurement in progress will complete before triggered measurement.In STANDBY mode triggered measurement will occur immediately and part will return to STANDBY mode as soon as themeasurement is complete.
    AC Operating mode selection. Default value: 0. 0: STANDBY mode.1: ACTIVE mode.ACTIVE mode will make periodic measurements based on values programmed in the Data Rate (DR) and Over Sampling Ratio bits (OS).

    3.4.2.2数据收发准备寄存器

      这个只读状态寄存器提供对每个样本为基础的采集状态信息,并反映实时更新X、Y、Z分量的值。表4.7.5为数据收发准备寄存器的寄存器格式,表4.7.6为各位的组合方式。

    表4.7.5 数据收发准备寄存器格式

    Bit7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    ZYXOW ZOW YOW XOW ZYXDR ZDR YDR XDR

    表4.7.6控制寄存器位组合方式

    组合 功能
    ZYXOW X, Y, Z-axis Data Overwrite. Default value: 0.0: No data overwrite has occurred.1: Previous X or Y or Z data was overwritten by new X or Y or Z data before it was completely read.
    ZOW Z-axis Data Overwrite. Default value: 0.0: No data overwrite has occurred.1: Previous Z-axis data was overwritten by new Z-axis data before it was read.
    YOW The some as Z.
    XOW The some as Z.
    ZYXDR X or Y or Z-axis new Data Ready. Default value: 0.0: No new set of data ready.1: New set of data is ready.
    ZDR Z-axis new Data Available. Default value: 0.0: No new Z-axis data is ready.1: New Z-axis data is ready.
    YDR The some as Z.

    4.IIC总线接口特性

      SCL和SDA信号由漏极开路缓冲器驱动和一个上拉电阻是必需的,使信号上升到高状态。的上拉电阻的值取决于系统的I2C时钟速率和I2C总线上的电容负载。
      
      高电阻值的上拉电阻消耗较少的功率,但是有一个较慢的上升时间(由于RC时间常数总线电容和上拉电阻器之间)和将限制I2C时钟频率。
      
      低阻值的上拉电阻消耗更多的功率,但实现更高的I2C时钟工作频率。高总线电容由于长期总线线或大量连接到总线的I2C器件。较低的电阻值上拉电阻就需要在更高的总线电容系统。
      
      对于标准的100 kHz时钟I2C ,上拉电阻通常是5K和10kΩ之间。对于重负载总线,上拉电阻值可能需要被减少。对于更高速度400 kHz或800 kHz的时钟I2C ,总线电容将需要保持在较低水平,除了选择较低值电阻的上拉电阻。对于高速总线上拉电阻通常是约1千欧。
      
      在一个设计良好的系统总线上的一个微处理器和一个I2C器件,具有良好的电路板布局和布线时,I2C总线电容可以保持在20pF的。用一个1K的上拉电阻, I2C时钟速率可以远远超过几兆赫的。

    这里写图片描述
    图4.7.8 MAG3110的I2C总线工作时序图

    表4.7.7MAG3110串行接口引脚说明

    引脚名称 引脚说明
    VDDIO IO voltage(电压)
    SCL I2C Serial Clock
    SDA I2C Serial Data
    INT Data ready interrupt pin

    5.主要程序及程序流程图

    5.1主要程序

      下面的程序区给出了MAG3110启动I2C总线并对I2C总线完成初始化,包括设置I2C总线速率、初始化其中断为向量IRQ中断、以及终端优先级为最高。主程序中首先对I2C进行初始化和对硬件资源LCD进行初始化。通过向CTRL_REG1 (0x10)寄存器中写入控制字0x39完成初始化,再读取DR_STATUS的状态,判断哪一个MSB和LSB输出寄存器的状态有效,如果有效通过采集MSB和LSB寄存器获取相应的值。

    void  I2C_Init(uint32 fi2c)
    {  
       if (fi2c > 400000) 
       {    
           fi2c = 400000;
       }
       PINSEL1  = (PINSEL1 & ~(0xff << 22)) | (0x05 << 22);  
       // 设置I2C控制口有效,P0.27、P0.28
       I2SCLH   = (Fpclk / fi2c + 1) / 2;   // 设置I2C时钟为fi2c
       I2SCLL   = (Fpclk / fi2c) / 2;
       I2CONCLR = 0x2C;
       I2CONSET = 0x40;                     // 使能主I2C
       /* 设置I2C中断允许 */
        VICIntSelect = 0x00;                // 所有中断通道设置为IRQ中断       
        VICVectPri9  = 00;                  // 设I2C中断最高优先级  
        VICVectAddr9 = (uint32)IRQ_I2C;     // 设置中断服务程序地址       
        VICIntEnable = 1 << 0x09;           // 使能I2C中断
    }

    主程序:

    int main()
    {
        char *p;
        int idx;
        int xpos,ypos;
        long count;
        long count2;
        uint8 sndBuf[20];
        unsigned char hbyte,lbyte;
        //delay(100000);
    
        //传感板类型识别CODE0~CODE3,作为输入端
        FIO2DIR &=~(1<<5);
        FIO2DIR &=~(1<<6);
        FIO2DIR &=~(1<<7);
        FIO2DIR &=~(1<<8);
        Uart1ToUart0=0;
        //设置LCD屏幕引脚   
        PINSEL3=PINSEL3 & 0x00000000;
        IO1DIR=IO1DIR|0x05700000;
        //初始化串口操作
        ClearRcvBuf();
        UART0_Init();//蓝牙模块设置模式下速率9600,运行模块速率自设
        PINMODE0 = PINMODE0 & 0x000000A0;   
        //去除P0.16上拉电阻
        //PINMODE0 |= 0x80000000;
        PINMODE1 |= 0x00000002;
        I2C_Init(10000);    // I2C配置及端口初始化
        RESET0;     //复位                           
        delay(50);
        RESET1;                     
        delay(100); 
        lcd_init();
        delay(20);
        LCD_Frame();
        DispAscStr(0,12,"Magnetic",8,&xpos,&ypos);
        DispChnStr(xpos,ypos,"模块测试",4,&xpos,&ypos);    
       //设置激活模式,采样速率
        //数据输出率5HZ
        //取样速率为8
        //16bits
        //AC=1激活模式
        sndBuf[0]=0x39;
        /**
        *器件从地址:0x1c
        *器件子地址结构:单字节
        *器件子地址:0x10
        *写sndBuf的一个字节到指定的地址中
        */
        I2C_WriteNByte(0x1c,1,0x10,sndBuf,1);
        while(1)
        {
            I2C_ReadNByte(0x1c,1,0x00,&sndBuf[10],1);
            //读取DR_STATUS的状态
            //0bxxxxxx01为X轴坐标有效
            //0bxxxxxx10为Y轴坐标有效
            //0bxxxxxx11为Y轴坐标有效
            //以下内容为计算X、Y、Z三个方向的磁感应量的值
            if((sndBuf[10]&0x01)==0x01)
            {
                //读取OUT_X_MSB Register和OUT_X_LSB Register
                //也即读取X轴的最高有效数据和最低位有效数据
                I2C_ReadNByte(0x1c,1,0x01,sndBuf,2);
                //计算数据的结果
                idx=sndBuf[0]*256+sndBuf[1];//-2500;
                sndBuf[0]='X';
                sndBuf[1]=':';
                sndBuf[2]=idx/10000+'0';
                sndBuf[3]=idx%10000/1000+'0';
                sndBuf[4]=idx%1000/100+'0';
                sndBuf[5]=idx%100/10+'0';
                sndBuf[6]=idx%10+'0';
                DispAscStr(0,40,sndBuf,7,&xpos,&ypos);
            }
            if((sndBuf[10]&0x02)==0x02)
            {
                //读取OUT_Y_MSB Register和OUT_Y_LSB Register
                //也即读取Y轴的最高有效数据和最低位有效数据
                I2C_ReadNByte(0x1c,1,0x03,sndBuf,2);
                //计算数据的结果
                idx=sndBuf[0]*256+sndBuf[1];//-63400;
                sndBuf[0]='Y';
                sndBuf[1]=':';
                sndBuf[2]=idx/10000+'0';
                sndBuf[3]=idx%10000/1000+'0';
                sndBuf[4]=idx%1000/100+'0';
                sndBuf[5]=idx%100/10+'0';
                sndBuf[6]=idx%10+'0';
                DispAscStr(0,56,sndBuf,7,&xpos,&ypos);
            }
            if((sndBuf[10]&0x04)==0x04)
            {
                //读取OUT_Z_MSB Register和OUT_Z_LSB Register
                //也即读取Z轴的最高有效数据和最低位有效数据
                I2C_ReadNByte(0x1c,1,0x05,sndBuf,2);
                //计算数据的结果
                idx=sndBuf[0]*256+sndBuf[1];
                sndBuf[0]='Z';
                sndBuf[1]=':';
                sndBuf[2]=idx/10000+'0';
                sndBuf[3]=idx%10000/1000+'0';
                sndBuf[4]=idx%1000/100+'0';
                sndBuf[5]=idx%100/10+'0';
                sndBuf[6]=idx%10+'0';
                DispAscStr(0,72,sndBuf,7,&xpos,&ypos);
            }
        }
       return 0;
    }

    5.2程序流程图

      如图4.7.9所示,为MAG3110传感器工作的流程图。在使用MAG3110的程序中按照流程图中的步骤进行操作,即可完成MAG3110的初始化和数据获取。
      

    这里写图片描述
    图4.7.9 程序流程图

    四、实验内容

      本实验所使用的M1G3110实验模块实物图如图4.7.10所示。
      

    这里写图片描述
    图4.7.10 MAG3110实物图

      
      将地磁传感器模块安装到节点板上(断电安装),然后将AK100或者JLINK仿真器的一端用USB接口与电脑相连,一端的20Pin的JTAG引脚与NXP LPC2378节点板的J2相连,并给NXP LPC2378节点板上电。如图4.7.11所示

    这里写图片描述
    图4.7.11实验电路连接图

    1. 地磁通量测量

    DispAscStr(0,12,"Magnetic",8,&xpos,&ypos);
    DispChnStr(xpos,ypos,"模块测试",4,&xpos,&ypos);
    //设置激活模式,采样速率
    //数据输出率5HZ
    //取样速率为8
    //16bits
    //AC=1激活模式
    sndBuf[0]=0x39;
    /**
    *器件从地址:0x1c
    *器件子地址结构:单字节
    *器件子地址:0x10
    *写sndBuf的一个字节到指定的地址中
    */
    I2C_WriteNByte(0x1c,1,0x10,sndBuf,1);
    while(1)
    {
        I2C_ReadNByte(0x1c,1,0x00,&sndBuf[10],1);
        //读取DR_STATUS的状态
        //0bxxxxxx01为X轴坐标有效
        //0bxxxxxx10为Y轴坐标有效
        //0bxxxxxx11为Y轴坐标有效
        //以下内容为计算X、Y、Z三个方向的磁感应量的值
        if((sndBuf[10]&0x01)==0x01)
        {
            //读取OUT_X_MSB Register和OUT_X_LSB Register
            //也即读取X轴的最高有效数据和最低位有效数据
            I2C_ReadNByte(0x1c,1,0x01,sndBuf,2);
            //计算数据的结果
            idx=sndBuf[0]*256+sndBuf[1];//-2500;
            sndBuf[0]='X';
            sndBuf[1]=':';
            sndBuf[2]=idx/10000+'0';
            sndBuf[3]=idx%10000/1000+'0';
            sndBuf[4]=idx%1000/100+'0';
            sndBuf[5]=idx%100/10+'0';
            sndBuf[6]=idx%10+'0';
            DispAscStr(0,40,sndBuf,7,&xpos,&ypos);
        }
        if((sndBuf[10]&0x02)==0x02)
        {
            //读取OUT_Y_MSB Register和OUT_Y_LSB Register
            //也即读取Y轴的最高有效数据和最低位有效数据
            I2C_ReadNByte(0x1c,1,0x03,sndBuf,2);
            //计算数据的结果
            idx=sndBuf[0]*256+sndBuf[1];//-63400;
            sndBuf[0]='Y';
            sndBuf[1]=':';
            sndBuf[2]=idx/10000+'0';
            sndBuf[3]=idx%10000/1000+'0';
            sndBuf[4]=idx%1000/100+'0';
            sndBuf[5]=idx%100/10+'0';
            sndBuf[6]=idx%10+'0';
            DispAscStr(0,56,sndBuf,7,&xpos,&ypos);
        }
        if((sndBuf[10]&0x04)==0x04)
        {
            //读取OUT_Z_MSB Register和OUT_Z_LSB Register
            //也即读取Z轴的最高有效数据和最低位有效数据
            I2C_ReadNByte(0x1c,1,0x05,sndBuf,2);
            //计算数据的结果
            idx=sndBuf[0]*256+sndBuf[1];
            sndBuf[0]='Z';
            sndBuf[1]=':';
            sndBuf[2]=idx/10000+'0';
            sndBuf[3]=idx%10000/1000+'0';
            sndBuf[4]=idx%1000/100+'0';
            sndBuf[5]=idx%100/10+'0';
            sndBuf[6]=idx%10+'0';
            DispAscStr(0,72,sndBuf,7,&xpos,&ypos);
        }
    }

    2.读取MAG3110温度寄存器中的数据

    //读取温度数据
    //温度数据以2补码形式存储
    I2C_ReadNByte(0x1c,1,0x0f,sndBuf,1);
    tempure=sndBuf[0];
    sndBuf[0]='T';
    sndBuf[1]='e';
    sndBuf[2]='m';
    sndBuf[3]='p';
    sndBuf[4]=':';
    sndBuf[5]=tempure/100+'0';
    sndBuf[6]=(tempure%100)/10+'0';
    sndBuf[7]=(tempure%10)+'0';
    DispAscStr(0,100,sndBuf,8,&xpos,&ypos);

    五、实验思考

    1.地磁传感器的用途?
    2.列出MAG3110传感器的功能。
    3.调研其他型号的地磁传感器。

  • 相关阅读:
    hdu-4638
    一个简单的询问
    CoderForces-617B
    HYSBZ-2002弹飞绵羊
    邻接表
    CoderForces-913-C
    CoderForces-913D
    CoderFocers-620C
    CoderForces-375D
    HDU-6119
  • 原文地址:https://www.cnblogs.com/shugen/p/6863012.html
Copyright © 2020-2023  润新知