本帖最后由 qixiyi 于 2013-1-21 11:40 编辑
MEMS陀螺仪
基于MEMS(MEMS是 微机电系统“Micro-Electro-Mechanical Systems”的英文缩写)的陀螺仪价格相比光纤或者激光陀螺便宜很多,但使用精度非常低,需要使用参考传感器进行补偿,以提高使用精度。 基于MEMS 技术的陀螺仪因其成本低,能批量生产,目前已经能够广泛应用于汽车牵引控制系统、医用设备、军事设备等低成本需求应用中。
1. MEMS陀螺仪工作原理 MEMS陀螺仪利用科里奥效应测量运动物体的角速率,如下图所示。
根据科里奥效应,当一个物体(m)沿(V)方向运动且施加角旋转速率(Ω)时,该物体将受到一个黄色箭头方向的力。然后,从一个电容感应结构可以测到科里奥效应最终产生的物理位移。
2.MEMS陀螺仪应用 ● MEMS陀螺仪能够测量角速率。数码相机使用陀螺仪检测人手的旋转运动,能够对图像起到稳定的作用。 ● 当汽车导航系统无法接收GPS卫星信号时,偏航陀螺仪能够测量汽车的方位,使汽车始终沿电子地图的规划路线行驶,这个功能被称之为航位推测系统。 在汽车上,偏航陀螺仪可以开启电子稳定控制(ESC)制动系统,防止汽车急转弯时发生意外事故。当汽车出现翻滚状况时,滚转陀螺仪可以引爆安全气囊。 ● 偏航陀螺仪还能用于室内机器人控制。 ● 安装在机器人四肢上的多路惯性测量单元(IMU)能够跟踪和监测身体运动。
3.MEMS陀螺仪测试 在陀螺仪校准后,应测试陀螺仪的性能,了解如何从陀螺仪原始数据中获取有价值的角位移信息。 下面是板载陀螺仪L3GD20的特性: · Three selectablefull scales (250/500/2000 dps) · I2C/SPIdigital output interface · 16 bit-rate valuedata output · 8-bit temperaturedata output · Two digital outputlines (interrupt and data ready) · Integrated low-and high-pass filters with user-selectable bandwidth · Wide supplyvoltage: 2.4 V to 3.6 V · Lowvoltage-compatible IOs (1.8 V) · Embeddedpower-down and sleep mode · Embeddedtemperature sensor · Embedded FIFO · High shocksurvivability · Extended operatingtemperature range (-40 °C to +85 °C) · ECOPACK® RoHS and“Green” compliant
打开Demonstration文件夹里的工程,main.c文件里: #define L3G_Sensitivity_250dps (float) 114.285f #define L3G_Sensitivity_500dps (float) 57.1429f #define L3G_Sensitivity_2000dps (float) 14.285f 宏定义了在不同情况下的陀螺仪分辨率。
第161行,Demo_GyroConfig( )函数对陀螺仪进行了初始化 下面介绍陀螺仪的结构体,里面存储了关键的参数 /* L3GD20struct */ typedefstruct { uint8_t Power_Mode; /* 电源模式选择 */ uint8_t Output_DataRate; /* 输出速率 */ uint8_t Axes_Enable; /* 坐标轴时能 */ uint8_t Band_Width; /* 带宽选择 */ uint8_t BlockData_Update; /* 快数据更新 */ uint8_t Endianness; /* 大小端数据选择 */ uint8_t Full_Scale; /* 分辨率选择 */ }L3GD20_InitTypeDef;
那么,我们如何读到陀螺仪的值,通过Demo_GyroReadAngRate(Buffer)函数,在477行。在487 行,L3GD20_Read(tmpbuffer,L3GD20_OUT_X_L_ADDR,6)用于读取X轴的角度。
voidDemo_GyroReadAngRate (float* pfData) { uint8_t tmpbuffer[6] ={0}; int16_t RawData[3] = {0}; uint8_t tmpreg = 0; float sensitivity = 0; int i =0;
/* 检测 controlregister 4 数据是大端还是小端存储的*/ L3GD20_Read(&tmpreg,L3GD20_CTRL_REG4_ADDR,1); /* 读取X轴的角度 */ L3GD20_Read(tmpbuffer,L3GD20_OUT_X_L_ADDR,6); /* 如果是小端模式 */ if(!(tmpreg & 0x40)) { for(i=0; i<3; i++) { RawData=(int16_t)(((uint16_t)tmpbuffer[2*i+1]<< 8) + tmpbuffer[2*i]); } } /* 如果是大端模式 */ else { for(i=0; i<3; i++) { RawData=(int16_t)(((uint16_t)tmpbuffer[2*i] << 8) +tmpbuffer[2*i+1]); } } /* 记录灵敏度 */ switch(tmpreg & 0x30) { case 0x00: sensitivity=L3G_Sensitivity_250dps; break; case 0x10: sensitivity=L3G_Sensitivity_500dps; break; case 0x20: sensitivity=L3G_Sensitivity_2000dps; break; } /* X轴角度除以灵敏度 */ for(i=0; i<3; i++) { pfData=(float)RawData/sensitivity; } }
最终,我们关心的就是Demo_GyroReadAngRate(Buffer)的Buffer的值。 |