ADIS16405介绍及入门程序实例
0赞ADIS16405 iSensor®是一款完整的三轴陀螺仪、磁力计与加速计惯性检测系统。这款传感器结合了ADI公司的iMEMS®与混合信号处理技术,能提供经过校准的数字惯性检测,是具有很高的集成度。每个传感器都拥有自身的动态补偿校正公式,能在的温度范围-40°C至+85°C为用户提供精确的测量数据。它通过SPI接口和简单的输出寄存器结构实现了方便的数据访问和配置控制。其功能框图如下:

通过SPI端口可以访问下列嵌入式传感器:X、Y和Z轴角速度;相对首向检测;X、Y和Z轴线性加速度;内部温度;电源;以及辅助模拟输入。ADIS16405惯性传感器在各个轴上执行精密对准,并对失调和灵敏度进行校准。这款紧凑型模块的尺寸约为23 mm × 23 mm × 23 mm,并提供方便的柔性连接器系统。其外形如下图所示:

ADIS16405具有以下特性:
具有数字量程刻度的三轴陀螺仪
设置:±75°/s, ±150°/s, ±300°/s
rms噪声:0.03 °/sec/√Hz
分辨率:14位
• 三轴磁力计
分辨率:14位
• 三轴加速计
测量范围:±18 g
分辨率:14位
• 带宽:350 Hz
• 出厂校准的灵敏度、偏置和对准
• 温度范围:-40°C 至 +105°C
• 数字控制偏置校准
• 数字控制采样速率
• 数字控制滤波
• 可编程条件监控
• 辅助数字输入/输出
通信方式:ADIS16405采用SPI通信方式输出数据,硬件连接如下:

以ADUC7026模拟微控制器作为系统处理器,实现读取ADIS16405数据为例,下面给出了实例代码:
/*-----------------------ADIS16405 Driver Test Code-----------------------------------
Date: 2010-04-22
Rev: V1.0
Description: Realize ADIS16405 Driver,Use ADuC7026 as MCU,Development Tool: KEIL C
Test program by reading triple axis gyroscope and triple axis accelerometer
and triple axis magnetometer and send the Z axis acceleration to PC through UART
#include <ADuC7026.h>
#include "ADIS16405_IO.h"
#include "ADIS16405.h"
#define GyroX 0
#define GyroY 1
#define GyroZ 2
#define AccX 3
#define AccY 4
#define AccZ 5
#define MagX 6
#define MagY 7
#define MagZ 8
unsigned char Calculate_Sign = 0; //Flag for Timer Out
union{unsigned int ui;unsigned char uc[4];}un;
{
COMTX = ch; //COMTX is an 8-bit transmit register.
while(!(0x020==(COMSTA0 & 0x020)))
{;}
}
{
if(0 != (IRQSTA & GP_TIMER_BIT)) //TIMER1 Interrupt
{
T1CLRI = 0;
Calculate_Sign = 1;
return;
}
}
void ADuC7026_Initiate(void)
{
//Clock Initial
POWKEY1 = 0x01; //Start PLL Setting
POWCON = 0x00; //Set PLL Active Mode With CD = 0 CPU CLOCK DIVIDER = 41.78MHz
POWKEY2 = 0xF4; //Finish PLL Setting
GP2DAT = GP2DAT | 0x04040000; //Disable LCD;
GP0DAT = GP0DAT | 0x02020000; //Disable LED;
GP0DAT = GP0DAT & 0xDFFFFFFF; //Configure the P0.5 pin as input for DOUT of ADIS16405
//Configure the P4.4 pin as output for SCLK of ADIS16405, SCLK Stall High
//Configure the P4.5 pin as output for DIN of ADIS16405
/*
//UART Initial,Baud Rate = 9600
COMCON0 = 0x080;
COMDIV0 = 0x088;
COMDIV1 = 0x000;
COMCON0 = 0x007;
*/
COMCON0 = 0x80;
COMDIV0 = 0x0B;
COMDIV1 = 0x00;
COMCON0 = 0x07;
COMDIV2 = 0x883E;
// T1LD = 0xCC010; //Interval = 20ms
T1LD = 0x13EC190; //Interval = 0.5s
T1CON = 0xC0;
IRQEN = GP_TIMER_BIT; //Enable Timer1 Interrupt
}
void main (void)
{
ADuC7026_Initiate();
ReadFromADIS16405ViaSpi(XGYRO_OUT,1,RegisterData);
{
if(1 == Calculate_Sign)
{
Calculate_Sign = 0;
RegisterData[1] &= 0x3F;
GyroAccMag[GyroX] = RegisterData[1];
GyroAccMag[GyroX] = (GyroAccMag[GyroX]<<8) | RegisterData[0];
ReadFromADIS16405ViaSpi(ZGYRO_OUT,1,RegisterData);
RegisterData[1] &= 0x3F;
GyroAccMag[GyroY] = RegisterData[1];
GyroAccMag[GyroY] = (GyroAccMag[GyroY]<<8) | RegisterData[0];
ReadFromADIS16405ViaSpi(XACCL_OUT,1,RegisterData);
RegisterData[1] &= 0x3F;
GyroAccMag[GyroZ] = RegisterData[1];
GyroAccMag[GyroZ] = (GyroAccMag[GyroZ]<<8) | RegisterData[0];
ReadFromADIS16405ViaSpi(YACCL_OUT,1,RegisterData);
RegisterData[1] &= 0x3F;
GyroAccMag[AccX] = RegisterData[1];
GyroAccMag[AccX] = (GyroAccMag[AccX]<<8) | RegisterData[0];
ReadFromADIS16405ViaSpi(ZACCL_OUT,1,RegisterData);
RegisterData[1] &= 0x3F;
GyroAccMag[AccY] = RegisterData[1];
GyroAccMag[AccY] = (GyroAccMag[AccY]<<8) | RegisterData[0];
RegisterData[1] &= 0x3F;
GyroAccMag[AccZ] = RegisterData[1];
GyroAccMag[AccZ] = (GyroAccMag[AccZ]<<8) | RegisterData[0];
ReadFromADIS16405ViaSpi(YMAGN_OUT,1,RegisterData);
RegisterData[1] &= 0x3F;
GyroAccMag[MagX] = RegisterData[1];
GyroAccMag[MagX] = (GyroAccMag[MagX]<<8) | RegisterData[0];
ReadFromADIS16405ViaSpi(ZMAGN_OUT,1,RegisterData);
RegisterData[1] &= 0x3F;
GyroAccMag[MagY] = RegisterData[1];
GyroAccMag[MagY] = (GyroAccMag[MagY]<<8) | RegisterData[0];
ReadFromADIS16405ViaSpi(XGYRO_OUT,1,RegisterData);
RegisterData[1] &= 0x3F;
GyroAccMag[MagZ] = RegisterData[1];
GyroAccMag[MagZ] = (GyroAccMag[MagZ]<<8) | RegisterData[0];
un.ui = GyroAccMag[AccZ];
putchar(un.uc[1]);
putchar(un.uc[0]);
}
