磁传感器
磁传感器是把磁场、电流、应力应变、温度、光等外界因素引起敏感元件磁性能变化转换成电信号,以这种方式来检测相应物理量的器件。
磁传感器广泛用于现代工业和电子产品中以感应磁场强度来测量电流、位置、方向等物理参数。在现有技术中,有许多不同类型的传感器用于测量磁场和其他参数。
磁传感器是把磁场、电流、应力应变、温度、光等外界因素引起敏感元件磁性能变化转换成电信号,以这种方式来检测相应物理量的器件。磁传感器分为三类:指南针、磁场感应器、位置传感器。指南针:地球会产生磁场,如果你能测地球表面磁场就可以做指南针。电流传感器:电流传感器也是磁场传感器。电流传感器可以用在家用电器、智能电网、电动车、风力发电等等。位置传感器: 如果一个磁体和磁传感器相互之间有位置变化,这个位置变化是线性的就是线性传感器,如果转动的就是转动传感器。
大生活中用到很多磁传感器,比如说指南针,电脑硬盘、家用电器等等。
在传统产业改造中的应用及市场
据报道,1995年仅工业过程控制传感器的全球市场已达到260亿美元;2001年计算机HDD用SV-GMR磁头的市场超过了4000亿日元(约合34亿美元)。若采用新型微型磁传感器,既使操作更简便,又提高了可靠性,增长了器件寿命,降低了成本。
使用新型磁传感器可以显着提高测量和控制精度,如使用GMI(巨磁阻抗)磁场传感器,检测分辨率和常用磁通门磁强计一样,而响应速度却快了一倍,消耗功率仅为后者的1%;若用霍尔器件,其分辨率仅4A/m,而所需外场比前者高300余倍;在应力检测中,SI 传感器的灵敏度是常用电阻丝的2000倍高,是半导体应变规的20~40倍。工业机床的油压或气压汽缸活塞位置检测,广泛采用套在活塞杆上的永磁环和AMR元件组成的磁传感器,检测精度达0.1mm,检测速度可在0~500mm/s内以高低速度变换;改用GMI或SV-GMR传感器后,测量精度至少可以提高1个数量级。在机床数控化时代,数字磁尺帮助设计师们实现了闭环控制。使用绝对信号输出的磁尺,则不受噪声、电源电压波动等干扰,也不必原点复位。使用工作状态磁敏开关,还可以完成手动与数控之间的转换。
旋转磁编码器在旋转量的检测控制中起关键作用,它在数控机床、机器人、工厂自动化设备的位置检测、传输速度控制,磁盘、打印机之类的自动化设备通讯设备的旋转量检测中都是不可缺少的重要部件。其检测对象是光磁图形,不受油雾粉尘的影响,因此比目前最先进的光编码器的可靠性高寿命长,尤其适合于自动焊接、油漆机器人和与钢铁有关的位置检测以及各种金属、木材、塑料等加工行业的应用。而仍大量使用光编码器,由于这种器件易受粉尘、油污和烟雾的影响,用在自动焊接、油漆机器人、纺织和钢铁、木料、塑料等的加工中,可靠性极差。应用AMR、GMR 、GMI敏感元件构成的旋转磁编码器,就不存在上述缺点,因此,它们的市场需求年增长率在30%以上。在家用电器和节能产品中也也有其广泛的应用潜力,在节能环保产品中也大有用武之地。若使用微型磁编码器和控制微机一体化,更有利于简化控制系统结构,减少元件数和占空体积,这在精密制造和加工业中意义十分重大。
在环境监测中的应用
环境保护的前提是对各个环境参数(温度、气压、大气成份、噪声。..。..。)的监测,这里需要使用多种大量的传感器。采用强磁致伸缩非晶磁弹微型磁传感器,可以同时测量真空或密闭空间的温度和气压,而且不用接插件,可以遥测和远距离访问。在食品包装、环境科学实验等方面,应用前景广阔。
在交通管制中的应用
交通事故和交通阻塞是城市中和城市间交通存在的一个大问题。国内外都在加强高速公路行车支持道路系统(AHS)、智能运输系统(ITS)和道路交通信息系统(VICS)等的开发与建设。在这些新系统中,高灵敏度、高速响应微型磁传感器大有用武之地。例如,用分辨率可达1nT的GMI和SI传感器,可构成ITS传感器(作高速路上的道路标志,测车轮角度,货车近接距离),汽车通过记录仪(测通行方向、速度、车身长度、车种识别),停车场成批车辆传感器,加速度传感器(测车辆通过时路桥的振动等)。
磁传感器在电子罗盘中的应用
几个世纪以来,人们在导航中一直使用磁罗盘。有资料显示早在二千多年前中国人就开始使用天然磁石-一种磁铁矿来指示水平方向。电子罗盘(数字罗盘,电子指南针,数字指南针)是测量方位角(航向角)比较经济的一种电子仪器。如今电子指南针广泛应用于汽车和手持电子罗盘,手表,手机,对讲机,雷达探测器,望远镜,探星仪,穆斯林麦加探测器(穆斯林钟),手持 GPS 系统,寻路器,武器/导弹导航( 航位推测 ),位置/方位系统,安全/定位设备,汽车、航海和航空的高性能导航设备,电子游戏机设备等需要方向或姿态显示的设备。
地球本身是一个大磁铁,地球表面的磁场大约为0.5Oe,地磁场平行地球表面并始终指向北方。利用GMR薄膜可做成用来探测地磁场的传感器。图5显示这种传感器的具体工作原理。我们可以制出能够探测磁场X和Y方向分量的集成GMR传感器。此传感器可作为罗盘并应用在各种交通工具上作为导航装置。美国的NVE公司已经把GMR传感器用在车辆的交通控制系统上。例如,放置在高速公路边的GMR传感器可以计算和区别通过传感器的车辆。如果同时分开放置两个GMR传感器,还可以探测出通过车辆的速度和车辆的长度,当然GMR也可用在公路的收费亭,从而实现收费的自动控制。另外高灵敏度和低磁场的传感器可以用在航空、航天及卫星通信技术上。大家知道,在军事工业中随着吸波技术的发展,军事物件可以通过覆盖一层吸波材料而隐蔽,但是它们无论如何都会产生磁场,因此通过GMR磁场传感器可以把隐蔽的物体找出来。当然,GMR磁场传感器可以应用在卫星上,用来探测地球表面上的物体和底下的矿藏分布。
门磁传感器在智能家居中的应用
在智能家居门禁系统中门磁开关的作用是负责门磁通电否,通电带磁(闭门),断电消磁(开门),门磁安装于门与门套上,开关安装于屋内,配合自动闭门器使用,一般可承受150公斤的拉力。
有线门磁为嵌入式安装更加隐蔽,感应门窗的开合,适用于木质或铝合金门窗发出有线常闭/常开开关信号。门磁是用来探测门、窗、抽屉等是否被非法打开或移动。它由无线发射器和磁块两部分组成。门磁系统其实和床磁等原理相同。
磁场传感器(Magnetic Field Sensors)
磁场传感器可以用来检测磁场大小,和加速度传感器一样,有x、y、z轴三个方向,单位为uT(microteslas)。磁场传感器也称为compass(指南针),在uses-feature中使用android.hardware.sensor.compass作为其名字。说实在的,单看磁场数值也看不出所以然。
说个故事,单位部门调整,一拨同事到10楼,这是上下移动实验室的夹层,下面是移动网络(有4G小基站)实验室。一听要挪过去,各个忧心忡忡,这辐射如何办?按秘书的说法,怎么办,凉拌。正好玩磁场传感器,虽然magneTIc不是electromagneTIc,电场、磁场相互作用,在具体的都还给老师了。手头上也没有什么能够进行测试的,就用磁场传感器测一测。这种事情多半都是自己吓自己,智能手机将成为摸金校尉的必备工具。
下面是小例子代码片段:
public class MagneTIcFieldSensorAcTIvity extends Activity implements SensorEventListener{
。..。..
@Override
protected void onCreate(Bundle savedInstanceState) {
。..。..
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
。..。.. //注册和注销磁场传感器监听器
private int count = 1;
@Override
public void onSensorChanged(SensorEvent event) {
if( count++ == 20){ //磁场传感器很敏感,每20个变化,显示一次数值
double value = Math.sqrt(event.values[0]*event.values[0] + event.values[1]*event.values[1]
+event.values[2]*event.values[2]);
String str = String.format(“X:%8.4f , Y:%8.4f , Z:%8.4f \n总值为:%8.4f”,
event.values[0],event.values[1],event.values[2],value);
count = 1;
tv.setText(str);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// Nothing here
}
}
方位传感器(Orientation Sensors)
磁场传感器和加速度传感器结合可或者设备摆放角度,两者结合可以获取方位。这些计算由Android代劳了,SensorManager提供getRotationMatrix(),获得转动的矩阵,并进一步通过getOrientation()获得方位矩阵。Android还有方位传感器(orientation Sensors),不是物理实体,而是通过acceleration传感器和磁场感应器来获取方位,而在Android2.2开始方位传感器就被deprecated了。
设备摆放情况通过azimuth、pitch和roll来表示。
azimuth即方位角,就是手机方向和正北的夹角,百度百科这样描述方位角:是从某点的指北方向线起,依顺时针方向到目标方向线之间的水平夹角。pitch和roll可能是引用了航天的术语。azimuth,pitch和roll分别是z轴、X轴和Y轴的旋转角度。
老方法采用orientation传感器,azimuth从0~360。pitch是在x轴方向的转动角度,其实就是Y轴和水平面的仰角,范围为-180~180,正的为朝下(手机头低于水平面),负的为朝上,pitch的方向逆时针为正。roll是Y轴防线的转动角度,实际就是X轴和水平面的角度,范围在-90~90,同样逆时针为正,右轴高于左轴时为正,右轴高于左轴时为负。
新的方法,azimuth的范围是-180~180,当然我们可以进行适当的处理,如果小于零,则加360,这样就可以和orientation的得到的值一样。需要注意的是pitch的范围是-90~90,机头上翘为负;roll的范围是-180~180,和老方法相反,右轴高时为负。
这两种方式的数值可能会使人有些迷糊,我们在使用之前先查文档弄清楚就是了。我曾经有个疑惑为何有两个数值的范围是360度,其中一个数值只有180度。想想球面就知道了,以地球仪为例,经度范围是360°,维度范围是180°,就可以确定球面上的任何一点,以球心到该点假设是手机中轴线,还有一个围绕Y轴360°转的角度的第三维,这就可以确定所有的排放方式。
小例子
下面小例子我们将同时展现新旧两种方式。
public class VirtualJax extends Activity implements SensorEventListener{
。.. 。.. //注册和注销传感器监听器,本例涉及三个传感器(加速度传感器、地磁传感器和方位传感器),可以用sensorManager.unregister(this)注销监听器所涉及的全部传感器。
private Sensor accelSensor = null, compassSensor = null, orientSensor = null;
private float[] accelValues = new float[3], compassValues = new float[3],orientValues = new float[3];
private boolean ready = false; //检查传感器是否正常工作,即是否同时具有加速传感器和磁场传感器。
private float[] inR = new float[9];
private float[] inclineMatrix = new float[9];
private float[] prefValues = new float[3];
private double mInclination;
private int count = 1;
@SuppressWarnings(“deprecation”) //因为orientaion已经不再使用,为了不要显示warning,加上此标识
@Override
public void onSensorChanged(SensorEvent event) {
//【1】将相关传感器的数值分别读入accelValues,compassValues(磁力感应器的数值)和orientValues数组中
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
for(int i = 0 ; i 《 3 ; i ++){
accelValues[i] = event.values[i];
}
if(compassValues[0] != 0) //如果accelerator和magnetic传感器都有数值,设置为真
ready = true;
break;
case Sensor.TYPE_MAGNETIC_FIELD:
for(int i = 0 ; i 《 3 ; i ++){
compassValues[i] = event.values[i];
}
if(accelValues[2] != 0) //检查accelerator和magnetic传感器都有数值,只是换一个轴向检查
ready = true;
break;
case Sensor.TYPE_ORIENTATION:
for(int i = 0 ; i 《 3 ; i ++){
orientValues[i] = event.values[i];
}
break;
}
if(!ready)
return;
//【2】根据加速传感器的数值accelValues[3]和磁力感应器的数值compassValues[3],进行矩阵计算,获得方位
//【2.1】计算rotation matrix R(inR)和inclination matrix I(inclineMatrix)
if(SensorManager.getRotationMatrix(inR, inclineMatrix, accelValues, compassValues)){
/* 【2.2】根据rotation matrix计算设备的方位。,范围数组:
values[0]: azimuth, rotation around the Z axis.
values[1]: pitch, rotation around the X axis.
values[2]: roll, rotation around the Y axis.*/
SensorManager.getOrientation(inR, prefValues);
//【2.2】根据inclination matrix计算磁仰角,地球表面任一点的地磁场总强度的矢量方向与水平面的夹角。
mInclination = SensorManager.getInclination(inclineMatrix);
//【3】显示测量值
if(count++ % 100 == 0){
doUpdate(null);
count = 1;
}
}else{
Toast.makeText(this, “无法获得矩阵(SensorManager.getRotationMatrix)”, Toast.LENGTH_LONG);
finish();
}
}
//【3】显示测量值
public void doUpdate(View v){
if(!ready)
return;
//preValues[0]是方位角,单位是弧度,范围是-pi到pi,通过Math.toDegrees()转换为角度
float mAzimuth = (float)Math.toDegrees(prefValues[0]);
/*//纠正为orientation的数值。
* if(mAzimuth 《 0)
mAzimuth += 360.0;*/
String msg = String.format(“推荐方式:\n方位角:%7.3f\npitch: %7.3f\nroll: %7.3f\n地磁仰角:%7.3f\n”,
mAzimuth,Math.toDegrees(prefValues[1]),Math.toDegrees(prefValues[2]),
Math.toDegrees(mInclination));
nowOne.setText(msg);
msg = String.format(“老方式:\n方位角:%7.3f\npitch: %7.3f\nroll: %7.3f”,
orientValues[0],orientValues[1],orientValues[2]);
oldOne.setText(msg);
}
}