加速度计和陀螺仪设备在嵌入式应用中使用

所需积分/C币:9 2015-04-15 20:26:17 435KB PDF
19
收藏 收藏
举报

在这篇文章中我将概括这么几个基本并且重要的话题: - 加速度计(accelerometer)检测什么 - 陀螺仪(gyroscope,也称作 gyro)检测什么 - 如何将传感器 ADC 读取的数据转换为物理单位(加速度传感器的单位是 g,陀螺仪的单位 是 度/秒) - 如何结合加速度传感器和陀螺仪的数据以得到设备和地平面之间的倾角的准确信息 在整篇文章中我尽量将数学运算降低到最少。如果你知道什么是正弦、余弦、正切函数,那 无论你的项目使用哪种平台你应该都会明白和运用这篇文章中的思想,这些平台如 Arduino、Propeller、Basic Stamp、Ateml 芯片、PIC 芯片等等。总有些人认为使用 IMU 单元需要复杂的数学运算(复杂的 FIR 或 IIR 滤波,如卡尔曼滤波,Parks-McClellan 滤波 等)。你如果研究这些会得到很棒且很复杂的结果。我解释事情的方式,只需要基本的数学。 我非常坚信简单的原则。我认为一个简单的系统更容易操作和监控,另外许多嵌入式设备并 不具备能力和资源去实现需要进行矩阵运算的复杂算法。
力,X轴输出值为-1g。 X=-1 Y=0q ACCELERATION g INERTIAL FICTITIOUS FORCE 1g 请注意加速度计检测到得力的方向与它本身加速度的方向是相反的。这种力量通常被称为惯 性力或假想力。在这个模型中你你应该学到加速度计是通过间接测量力对一个墙面的作用 来测量加速度的,在实际应用中,可能通过弹簧等装置来测量力。这个力可以是加速度引起 的,但在下血的例子中,我们会发现它不一定是加速度引起的。 如果我们把模型放在地球上,球会落在Z-墙面上并对其施加一个1g的力,见下图 GRAVITATION Z 1g Y Z=19 GROUM 在这种情况下盒子没有移动但我们任然读取到Z轴冇-lg的值。球在墙壁上施加的压力是由 引力造成的。在理论上,它可以是不同类型的力量例如,你可以想象我们的球是铁质的, 将一个磁铁放在盒子旁边那球就会撞上另一面墙。引用这个例子只是为了说明加速度计的本 质是检测力而非加速度。只是加速度所引起的惯性力正好能被加速度计的检测装置所捕获 虽然这个模型并非一个MEMS传感器的真实构造,但它用来解决与加速度计相关的问题相当 有效。实际上有些类似传感器中有金属小球,它们称作倾角开关,但是它们的功能更弱,只 能检测设备是否在定程度內倾斜,却不能得到倾斜的程度。 到日前为止,我们己经分析了单轴的加速度计输出,这是使用单轴加速度计所能得到的 轴加速度计的真正价值在于它们能够检测全部三个轴的惯性力。让我们回到盒子模型,并将 盒子向右旋转45度。现在球会与两个面接触:Z-和X-,见下图: GRAVITATION FORCE Z lO X=0.71 Y=Og Z=-0.719 GROUND 0.71g这个值是不是任意的,它们实际上是12的平方根的近似值。我们介绍加速度计的下 个模型时这一点会更清楚。 在上一个模型中我们引入了重力并旋转了盒子在最后的两个例子中我们分析了盒子在两种 情况下的输出值,力矢量保持不变。虽然这有助于理解加速度计是怎么和外部力相互作用的, 但如果我们将丛标系换为加速度的三个轴并想象矢量力在周围旋转,这会更方便计算。 MF R R 请看看在上面的模型,我保留了轴的颜色,以便你的思维能更好的从上一个模型转到新的模 型中。想象新模型中每个轴都分别垂直」原模型中各自的墙面。矢量R是加速度计所检测的 矢量(它可能是重力或上面例子中惯性力的合成)。RX,RY,RZ是矢量R在X,Y,Z上的 投影。请注意下列关系 R·2=Rx2+By2+Rz·2(公式1) 此公式等价」三维空间勾股定理。 还记得我刚才说的1/2的平方根0.71不是个随机值吧。如果你把它们代回上式,回顾一下 重力加速度是1g,那我们就能验证 1^2-(SQRT(1/2))2+02+(SQRT(1/2))2 在公式1中简单的取代:R=1,Rx=-0R(12),Ry=0,Rx=-R12) 经过一大段的理论疗言后,我们和实际的加速度计很靠近了。RX,RY,RZ值是实际中加速 度计输出的线性相关值,你可以用它们进行各种计算。 在我们运用它之前我们先讨论一点获取加速度计数据的方法。大多数加速度计可归为两类: 数字和模拟。数字加速度计可通过I2C,SPI或USAT方式获取信息,而模拟加速度计的输 出是一个在狈定范围内的电压值,你需要用ADC℃(模拟量转薮字量)模块将其转换为数字值。 我将不会详细介绍ADC是怎么工作的,部分原因是这是个很广的话题,另一个原因是不同平 台的AC都会有差别。有些MU具有内置AD模块,而有些则需要外部电路进行ADX转换。 不管使用什么炎型的ADC模块,你都会得到一个在一定范围内的数值。例如一个10位ADC 模块的输出值范围在0.1023间,请注意,1023=2^101。一个12位ADC模块的输 出值范围在0..4095内,注意,1095=212-1。 我们继续,先考虑下一个简单的例子,假设我们从10位ADC模块得到了以下的三个轴的数 据: AdcRx =586 Adry=630 Adcrz =561 每个ADC模块都有一个参考电压,假设在我们的例子中,它是3.3V。要将一个10位的ADC 值转成电压值,我们使用下列公式 VoltsRx- AdcRx VREF/1023 小注:8位ADC的最大值是255=2^8-1,12位ADC最大值是4095=2^12 将3个轴的佰代入上式,得到 Volts=586*3.3/1023=~1.89V(结果取两位小数) VoltsRy=630*3.3/1023=~2.03V Voltsrz-561*3.3/1023-~1.81V 每个加速度计都有一个零加速度的电压值,你可以在它的说明书中找到,这个电压值对应于 加速度为0g。通过计算相对og电压的偏移量我们可以得到一个有符号的电压值。比方说, 0g电压值 Zeros=1.65V,通过下面的方式可以得到相对0g电压的偏移量 Deltavoltsrx= 1. 89V-165V=0. 24V DeltaVoltsRy=2.03 V-1 65V=0. 38V DeltaVoltsrz =1.81V-165V=0. 16V 现在我们得到了加速度计的电压值,但它的单位还不是g(9.8m/s^2),最后的转换,我们 还需要引入加速度计的灵敏度( Sensitivity),单位通常是mV/g。比方说,加速度计的灵 敏度 Sensitivity-478.5mV′g-0.4785V/g。灵敏度值可以在加速度计说明书中找到。 要获得最后的单位为g的加速度,我们使用下列公式计算 RX= DeltavoltsRx /Sensitivit RX-0.24V/0.4785V/G-~0.5g RY=0.38V/0.4785V/G=~0.79g RZ=0.16V/0.4785VG=~0.33g 当然,我们可以把所有的步骤全部放在一个式子里,但我想通过介绍每一个步骤以便让你了 解怎么读取一个ADC值并将其转换为单位为g的矢量力的分量。 Rx-(0 dcRx Vref/1023- Acrot6)/ Sensitivity(公式2 Ry(AdcRy Vref/1023-Vzerog)/ Sensitivity Z=(AdcRz *h Vref /1023- VzeroG)/ Sensitivity 现在我们得到∫惯性力矢量的三个分量,如果设备除了重力外不受任何外力影响,那我们就 可以认为这个方向就是重力矢量的方向。如果你想计算设备相对于地面的倾角,可以计算这 个矢量和Z轴之间的火角。如果你对每个轴的倾角都感兴趣,你可以把这个结果分为两个分 量:K轴、Y轴倾角,这可以通过计算重力矢量和Ⅹ、Y轴的夹角得到。计算这些角度比你想 象的简单,现在我们已经算出了Rx,Ry,Rz的值,让我们回到我们的上一个加速度模型 再加一些标注上去 MF R Axr Rx 我们感兴趣的角度是向量R和X,Y,Z轴之间的夹角,那就令这些角度为Axr,Ayr,Azre 观察由R和Rx组成的直角三角形: COs(Axr)-Rx/R,类似的 cos (ayr)=Ry/r (Azr)= rz/r 从公式1我们可以推导出R-s0Rr(Rx2+Ry2+Rz2) 通过 arccos(函数(cos(的反函数)我们可以计算出所需的角度 Axr= arccos (Rx/R) Ayr= arccos(Ry/R) Azr= arccos(rz/r) 我们花∫大段的篇幅来解释加速度计模型,最后所要的只是以上这几个公式。根据你的应用 场合,你可能会用到我们推导出来的几个过渡公式。我们接下来要介绍陀螺仪模块,并向大 家介绍怎么融合加速度计和陀螺仪的数据以得到更精确的倾角值。 但在此之前,我们再介绍几个很常用的公式 cosX= cos(Axr)=Rx/R .Y- coS(Ayr)-Ry/R COSZ COS(Azr) Rz/R 这三个公式通常称作方向余弦,它主要表达了单位向量(长度为1的向量)和R向量具有 相同的方向。你可以很容易地验证: SQRT (cosX 2I COSY 2+ COsZ 2)=1 这是个很好的性质,因为它避免了我们一直检测R向量的模(长度)。通常如果我们只是对 惯性力的方向感兴趣,那标准化模长以简化其他计算是个明智的选择。 第二部分陀螺仪 对于陀螺仪我们将不会像加速度计一样介绍它的等价盒子模型,而是直接跳到加速度计的第 二个模型,通过这个模型我们会向大家介绍陀螺仪是怎么工作的 R A Rx 陀螺仪的每个通道检测一个轴的旋转。例如 轴陀螺仪检测绕Ⅹ和Y轴的旋转。为了 用数字来表达这些旋转,我们先引进一些符号。首先我们定义: Rxz-惯性力矢量R在XZ平面上的投影 Ryz-惯性力矢量R在YZ平面的上投影 在由Rxz和Rz组成的直角三角形中,运用勾股定理可得 Rxz2=Rx2+Rz2,同样: 2= Ry 2+rz 2 可时注意: R2=Rxz2+Ry2,这个公式可以公式1和上面的公式推导出来,也可山R和Ry2 所组成的直角三角形推导出来 R 2=Ryz 2I RX 2 在这篇文章中我们不会用到这些公式,但知道模型中的那些数值间的关系有助于理解。 相反,我们按如下方法定义Z轴和Rxz、Ryz向量所成的夹角: AXZ RXZ(矢量R在KZ平面的投影)和Z轴所成的火角 AYZ-Ryz(矢量R在YZ平面的投影)和Z轴所成夹角 现在我们离陀螺仪要测量的东西又近了一步。陀螺仪测量上面定义的角度的变化率。换句话 说,它会输出一个与上面这些角度变化率线性相关的值。为了解释这一点,我们先假设在 t0时刻,我们已测得绕Y轴旋转的角度(也就是Axz),定义为Axz0,之后在t1时刻我们 再次测量这个角度,得到Axz1。角度变化率按下面方法计算 RateAxz =(Axz1- Axz0)/(tl 如果用度来表示角度,秒来表示时间,那这个值的单位就是度/秒。这就是陀螺仪检测的东 西。 在实际运用中,陀螺仪一般都不会直接给你一个单位为度/秒的值(除非它是个特殊的数宁 陀螺仪)。就像加速度计一样,你会得到一个ADC值并且要用类似公式2的式子将其 转换成单位为度/秒的值。让我们来介绍陀螺仪输岀值转换中的ADC部分(假设使用10位 ADC模块,如果是8位ADC,用1023代替25,如果是12为ADC用4095代替1023)。 RateAxz=(AdcGyroXZ Vref 1023-VzeroRate)/ Sensitivity AIt3 RateAyz=(AdcGyroYZ Vref/1023-VzeroRate)/ Sensitivity AdcGyroXZ, AdcGyroYz-这两个值由ADC读取,它们分别代表矢量R的投景在XZ和YZ平 面内里的转角,也可等价的说,旋转可分解为单独绕Y和X轴的运动。 Vref-ADC的参考电压,上例中我们使用3.3V Perorate-是零变化率电压,换句话说它是陀螺仪不受任何转动影响时的输出值,对Acc Gyro板来说,可以认为是1.23V(此值通常可以在说明书中找到一一但千万别相信这个值, 因为大多数的陀螺仪在焊接后会有一定的偏差,所以可以使用电压计测量每个通道的输出 值,通常这个值在焊接后就不会改变,如果有跳动,在设备使用前写·个校准程序对其进行 测量,用户应当在设备启动的时候保持设各静止以进行校准)。 Sensitivity-陀螺仪的灵敏度,单位mV/(deg/s),通常写作mV/deg/s,它的意思就是如果 旋转速度增加1°/s,陀蠓仪的输出就会增加多少m。 Acc gyro板的灵敏度值是2mV/deg/s 或0.002V/deg/s 让我们举个例子,假设我们的ADC模块返回以下值: AdcGyroXZ- 571 Adc GyroXz= 323 用上面的公式,在代入 Acc Gyro板的参数,可得: Rateaxz=(571*3.3V/1023-1.23V)/(0.002/eg/s)=306deg/s Rateau=(323*3.3V/1023-1.23V)/(0.002V/deg/s)=-94deg/s 换句话说设备绕Y轴(也可以说在XZ平面内)以306°/速度和绕X轴(或者说YZ平面内) 以94°/s的速度旋转。请注意,负号表示该设备朝着反方向旋转。按照惯例,一个方向的 旋转是正值。一份好的陀螺仪说明书会告诉你哪个方向是正的,否则你就要自己测试出哪个 旋转方向会使得输出脚电压增加。最好使用示波器进行测试,因为一旦你停止了旋转,电压 就会掉回岺速率水平。如果你使用的是万用表,你得保持一定的旋转速度几杪钟并冋时比较 电压值和零速率电压值。如果值大于零速率电压值那说明这个旋转方向是正向。 第三部分将它们综合起来。融合加速度 计和陀螺仪的数据 如果你在阅读这篇文章你可能已经有了或准备购买一个IMU设各,或者你准备用独立的加速 度计和陀螺仪搭建一个。 注:具体的代码实现和算法测试,请阅读这篇文章: http://starlino.com/imukalmanarduino.html 在使用整合了加速度计和陀螺仪的IMU设备时,首先要做的就是统一它们的坐标系。最简单 的办法就是将加速度计作为参考坐标系。大多数的加遮度计技术说明书都会指出对应于物理 芯片或设备的KzY轴方向。例如,下面就是 Acc Gyro板的说明书中给出的XYZ轴方向: Z 接下来的步骤是: 确定陀螺仪的输出对应到上述讨谂的 RateA, Ratey值。 根据陀螺仪和加速度计的位置决定是否要反转输岀值 不要设想陀螺仪陀的输出有XY,它会适应加速度计坐标系里的任何轴,尽管这个输出是IMU 模块的·部分。最好的办法就是测试。 接下来的示例用来确定哪个陀螺仪的输出对应 RateAxz 首先将设备保持水平。加速度计的XY轴输出会是零加速度电压( Acc Gyro板的值是1.65V) 接下来将设备绕Y轴旋转,换句话说就是将改备在Ⅺ平面内旋转,所以Ⅹ、Z的加速度输 出值会变化而Y轴保持不变 当以匀速旋转设备的时侯,注意陀螺仪的哪个逦道输岀值变化了,其他输岀应该保持不变。 在陀螺仪绕Y轴旋转(在XZ平面内旋转)的时候输出值变化的就是 AdcGyroXz,用于计 算 Rateaxz 最后一步,确认旋转的方向是否和我们的模型对应,因为陀螺仪和加遠度的位置关系,有 时候你可能要把 Rateaxz值反向 重复上面的测试,将设备绕Y轴旋转,这次查看加速度计的Ⅹ轴输出(也就是 AdcRx)。 如果 AdcRx堦大(从水平位置开始旋转的第一个90°),那 Adegyroxz应当减小。这是因 为我们观察的是重力矢量,当设备朝一个方向旋转时久量会朝相反的方向旋转(相对坐标系 运动)。所以,如果你不想反转 RateAxz,你可以在公式3中引入正负号来解决这个问题: RateAxz= InvertAxz *k(Adc GyroXZ Vref /1023-VzeroRate)/ Sensitivity, I'+ overtax- 1或-1 同样的方法可以用来测试 Rateayz,将设备绕X轴旋转,你就能测出陀螺仪的哪个输出对应 于 Rateavz,以及它是否需要反转。一旦你确定了 Invertayz,你就能可以用下面的公式米 计算 RateY RateAyz= InvertAyz k(AdcGyroYZ x Vref /1023- VzeroRate)/ Sensitivity 如果对 Acc Gyro板进行这些测试,你会得到下面的这些结果: Rateaxz的输出管脚是GX4, InvertAxz=1 RateAvz输出管脚是GY4, Invertayz=1 从现在开始我们认为你已经设置好了IMU模块并能计算岀正确的Axr,Ayr,Azr值(在第 部分加速度计中定义)以及 Rateau, Rateayz(在第二部分陀螺仪中)。下一步,我们分 析这些值之间的关系并得到更准确的设备和地平面之间的倾角。 你可能会问自己一个问题,如果加速度计已经告诉我们Axr,Ayr,Azr的倾角,为什么还要 费事去得到陀螺仪的教据?答案很简单:加速度计的数据不是100%准桷的。有几个原因

...展开详情
试读 14P 加速度计和陀螺仪设备在嵌入式应用中使用
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
加速度计和陀螺仪设备在嵌入式应用中使用 9积分/C币 立即下载
1/14
加速度计和陀螺仪设备在嵌入式应用中使用第1页
加速度计和陀螺仪设备在嵌入式应用中使用第2页
加速度计和陀螺仪设备在嵌入式应用中使用第3页

试读结束, 可继续读2页

9积分/C币 立即下载