zyh_126

电子指南针的设计

0
阅读(2568)

电子指南针的设计

指南针是一个重要的导航工具,甚至在 GPS 中也会用到。电子指南针将替代旧的针式

指南针或罗盘指南针,因为电子指南针全采用固态的元件,还可以简单地和其他电子系统接

口。电子指南针系统中磁场传感器的磁阻(MR)技术是最佳的解决方法,和现在很多电子

指南针还在使用的磁通量闸门传感器相比较,MR 技术不需要绕线圈而且可以用IC 生产过

程(IC-like process)生产,是一个更值得使用的解决方案。由于MR 有高灵敏度,它甚至

比这个应用范围中的霍尔元件更好。本方案采用的是霍尼韦尔HMC5883L,他是一种表面集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘。HMC5883L包括最先进的高分辨率HMC118X系列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器,偏差校准,能使罗盘精度控制在1°-2°的12位模拟转换器,简易的IIC接口,主要应用在手机,笔记本,消费电子,汽车导航和个人导航系统。该芯片的外围器件比较少,和CPU的接口如下:

  

HMC5883L作为从机通过IIC接口内置器内部寄存器和读取数据。51模拟IIC的程序得到发送数据子程序void Send(uchar Data);读字节程序uchar Read(void);void Start(void) /*起始条件*/;void Stop(void) /*停止条件*/;void Ack(void) /*应答位*/

HMC5883的寄存器操作如下:

Void write_rigest(unsigned char addr,unsigned char dat)

{

 Start();

 Send(0x3c);

 Ack();

 Send(addr);

 Ack();

 Send(dat);

 Stop();

}

Unsigned char read_rigest(addr)

{

 Unsigned char dat;

 Start();

 Send(0x3c);

 Ack();

 Send(addr);

 Ack();

 Send(0x3d);

 Ack();

 Dat= read();

 Stop();

 Return dat;

}

void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/

{

uchar BitCounter=8; /*位数控制*/

uchar temp; /*中间变量控制*/

do

{

temp=Data;

Scl=0;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

if((temp&0x80)==0x80)/* 如果最高位是1*/

Sda=1;

else

Sda=0;

Scl=1;

temp=Data<<1; /*RLC*/

Data=temp;

BitCounter--;

}while(BitCounter);

Scl=0;

}


uchar Read(void) /*读一个字节的数据,并返回该字节值*/

{

uchar temp=0;

uchar temp1=0;

uchar BitCounter=8;

Sda=1;

do{

Scl=0;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

Scl=1;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

if(Sda) /*如果Sda=1;*/

temp=temp|0x01; /*temp的最低位置1*/

else

temp=temp&0xfe; /*否则temp的最低位清0*/

if(BitCounter-1)

{ temp1=temp<<1;

temp=temp1;

}

BitCounter--;

}while(BitCounter);

return(temp);

}