楼主这几天疯狂的学习这个模块,很是头疼,经过各种办法与尝试 有了以下的程序 亲测可用,在这里和大家分享一下,有写的不好的地方还请大家指出。
[/mw_shl_code]
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "nrf24l01.h"
#include "pwm.h"
#include "iic.h"
#include "hmc5883l.h"
#include "math.h"
u8 BUF[6];
int main()
{
SysTick_Init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init();
USART1_Init(115200);
NRF24L01_Init();
Init_HMC5883();
IIC_Init();
int x,y,z;
double angle;
u8 BUF[6];
while(1)
{
Multiple_read_HMC5883(BUF);
x=BUF[0] << 8 | BUF[1]; //
z=BUF[2] << 8 | BUF[3]; //
y=BUF[4] << 8 | BUF[5]; //分别读取x y z轴的数据
if(x>32768)
x = -(0xFFFF - x + 1);
if(z>32768)
z = -(0xFFFF - z + 1);
if(y>32768)
y = -(0xFFFF - y + 1);
if(x<0) //这里的数据楼主读出来x偶尔有负整数,而y永远是负整数
x=-x;
angle= (atan2((double)y,(double)x) * (180 / 3.14159265) + 180); // angle in degrees 这个公式算出来的角度是与x轴的夹角度数,但是x轴楼主觉得是一直在变得啊,这个角度到底是什么楼主现在也不能确定。。。 所以这个公式楼主并没有采用
//楼主采用的是直接去读x y z的数据,因为模块动的时候这些数据也在变化,水平转动的时候z轴是不变的,只有x y在变,所以楼主采用读取xy数据,根据xy的数据去确定大致的方向。
//以下是确定方向的代码 xy的值是楼主自己测出来然后拿手机上面的指南针对比的,所以每个人去的数据可能不一样,以下是楼主的数据
if((100< x )&&(x <150)&&(650< (-y))&&(700>(-y)))
{
printf(&quot;dong %d%d
&quot;,x,-y); //指向东面,同时打印出x -y的值
delay_ms(50);
}
else
printf(&quot;x,y %d%d
&quot;,x,-y); //如果指的不是东面,就打印出x -y的值 指向其他方向的楼主没有写,因为数据有点多,今天不想测了。。。
}
}
[/mw_shl_code]
这是头文件
[C] 纯文本查看 复制代码
#ifndef __HMC5883L_H
#define __HMC5883L_H
#include &quot;system.h&quot;
#include &quot;iic.h&quot;
#define SlaveAddress 0x3c //从机地址
void Init_HMC5883(void);
void Write_HMC5883(u8 add, u8 da);
u8 Read_HMC5883(u8 REG_Address);
void Multiple_read_HMC5883(u8*BUF);
#endif |