HMC5883L是一种IIC通信的电子罗盘芯片,输出与北的角度偏差,数值是0-360度,靠西方向增长,可以理解为逆时针为正。配合GPS模块简直就是四轴飞行器的铁杆标配。驱动分为驱动IIC和转换角度两块。

1.驱动IIC

void IIC_IO_Init(void)
{                    GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB, ENABLE ); //ê1?üGPIOBê±?óGPIO_InitStructure.GPIO_Pin = GPIO_SCL|GPIO_SDA;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //í?íìê?3?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(IIC_PERIPH, &GPIO_InitStructure);GPIO_SetBits(IIC_PERIPH,GPIO_Pin_8|GPIO_Pin_9);   //PB6,PB7 ê?3???
}void i2c_Start(void)
{  /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */  SDA_OUT();IIC_SDA = 1;  delay_us(10);  IIC_SCL = 1;  delay_us(10);  IIC_SDA = 0;  delay_us(10);  IIC_SCL = 0;  delay_us(10);
}
void i2c_Stop(void)
{  /* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */  SDA_OUT();IIC_SDA = 0;  delay_us(10);  IIC_SCL = 1;  delay_us(10);  IIC_SDA = 1;
}
void i2c_SendByte(u8 _ucByte)
{  u8 i;  SDA_OUT();/* 先发送字节的高位bit7 */  for (i = 0; i < 8; i++)  {       if (_ucByte & 0x80)  {  IIC_SDA = 1;  }  else  {  IIC_SDA = 0;  }  delay_us(10);  IIC_SCL = 1;  delay_us(10);      IIC_SCL = 0;  if (i == 7)  {  IIC_SDA = 1; // 释放总线  }  _ucByte <<= 1;    /* 左移一个bit */  delay_us(10);  }
}
u8 i2c_ReadByte(void)
{  u8 i;  u8 value;  IIC_SDA = 1;  SDA_IN();/* 读到第1个bit为数据的bit7 */  value = 0;  for (i = 0; i < 8; i++)  {  value <<= 1;  IIC_SCL = 1;  delay_us(10);  if (READ_SDA)  {  value++;  }  IIC_SCL = 0;  delay_us(10);  }  return value;
}
u8 i2c_WaitAck(void)
{  u8 re;  SDA_IN();IIC_SDA = 1;  /* CPU释放SDA总线 */  delay_us(10);  IIC_SCL = 1;  /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */  delay_us(10);  if (READ_SDA)   /* CPU读取SDA口线状态 */  {  re = 1;  }  else  {  re = 0;  }  IIC_SCL = 0;  delay_us(10);  return re;
}
void i2c_Ack(void)
{  SDA_OUT();IIC_SDA = 0;  /* CPU驱动SDA = 0 */  delay_us(10);  IIC_SCL = 1;  /* CPU产生1个时钟 */  delay_us(10);  IIC_SCL = 0;  delay_us(10);  IIC_SDA = 1;  /* CPU释放SDA总线 */
}
void i2c_NAck(void)
{  SDA_OUT();IIC_SDA = 1;  /* CPU驱动SDA = 1 */  delay_us(10);  IIC_SCL = 1;  /* CPU产生1个时钟 */  delay_us(10);  IIC_SCL = 0;  delay_us(10);
}
void HMC5883L_Init()
{  IIC_IO_Init();//i2c_CheckDevice(HMC5883L_Write_Address);  i2c_Start();  i2c_SendByte(HMC5883L_Write_Address);  i2c_WaitAck();  i2c_SendByte(0x00);  i2c_WaitAck();  i2c_SendByte(0x70);  i2c_WaitAck();  i2c_SendByte(0x01);  i2c_WaitAck();  i2c_SendByte(0xe0);  i2c_WaitAck();  i2c_SendByte(0x02);  i2c_WaitAck();  i2c_SendByte(0x01);  i2c_Stop();
}  

总结:都是常规的IIC设置,注意延时长短。宏定义了一些东西,参数如下

#define SDA_IN()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)8<<4;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)3<<4;}
#define IIC_SCL    PBout(8) //SCL
#define IIC_SDA    PBout(9) //SDA
#define GPIO_SCL    GPIO_Pin_8
#define GPIO_SDA    GPIO_Pin_9
#define IIC_PERIPH GPIOB
#define READ_SDA   PBin(9) 

SDA_IN()和SDA_OUT()是直接操作寄存器,IO口地址是0XFFFFFF0F,(u32)8中的8是输入模式,左移4是移到当前IO的寄存器设置地址(1x4)

2.转换角度

int x,y,z,X,Y,Z;
float Get_Current_Angle()
{  u8 i;  u8 a[6];  float Curent_Angle;  HMC5883L_Init();  i2c_Start();  i2c_SendByte(HMC5883L_Write_Address);  i2c_WaitAck();  i2c_SendByte(0x03);  i2c_WaitAck();  i2c_Start();  i2c_SendByte(HMC5883L_Read_Address);  i2c_WaitAck();  for(i=0;i<6;i++)  {  a[i] = i2c_ReadByte();  if(i==5)  {  i2c_NAck();  }  else  {  i2c_Ack();  }  }  i2c_Stop();  x=a[0];  x=x<<8;  x=x|a[1];  y=a[2];  y=y<<8;  y=y|a[3];  z=a[4];  z=z<<8;  z=z|a[5];  if(x>32768)  {  x = -(0xFFFF - x + 1);  }  if(y>32768)  {  y = -(0xFFFF - y + 1);  }  if(z>32768)  {  z = -(0xFFFF - z + 1);  }  X = (s16)x;    //x分量  Y = (s16)y;    //y分量  Z = (s16)z;    //z分量  Curent_Angle = (atan2(Y,X) * (180 / 3.14159265) + 180);  //实际水平角度  return Curent_Angle;
}  

这个实际上就是数据处理函数,只要IIC初始化OK直接copy过来就能用上。函数返回的直接是和北偏离的度数,指南针就做好了。现在手机上自带罗盘,一般打开地图点位置模式就能看到箭头方向。

基于STM32F1的HMC5883L电子罗盘驱动——妈妈从此再也不担心我迷路了相关推荐

  1. android 傻瓜式 MultiDex 插件,从此再也不用担心方法数问题!

    ndroid-Easy-MultiDex 项目地址:TangXiaoLv/Android-Easy-MultiDex 简介:Android 傻瓜式 MultiDex 插件,从此再也不用担心方法数问题! ...

  2. html5课件动画制作,从此再也不担心课件/动画的开发了!

    原标题:从此再也不担心课件/动画的开发了! 数字学习工具 定期推送优质地数字学习工具,敬请期待! 本期编辑:王幸娟.冯孟坭.丁雪菲 在前面的文章中,我们向大家隆重推出了本公众号运营团队的精诚之作--& ...

  3. 户外lisp导向牌如何安装_有了激光切割导向牌,妈妈再也不用担心我迷路啦

    据说每个人都有这样一个路痴朋友 当你们要见面的时候都会产生类似这样的对话 他们时常迷失在约定的地点 他们的字典里没有东南西北 只有上下左右 他们过度相信导航 却时常被导航坑 对于路痴朋友们来说 一个清 ...

  4. STM32F1与STM32CubeIDE编程实例-HMC5883电子罗盘驱动

    HMC5883电子罗盘驱动 1.HMC5883介绍 Honeywell的HMC5883L 是一款表面贴装多芯片模块,专为低场磁场感应而设计,具有数字接口,适用于低成本罗盘和磁力测量等应用. HMC58 ...

  5. BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序

    BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序, 无传感的实现是基于反电动势过零点实现的,有传感是霍尔实现. 永磁同步电机有 ...

  6. 基于STM32F1的手势识别PJ7602和测温报警MLX90614

    基于STM32F1的手势识别和测温报警 器件:我使用的是正点原子的STM32f103MiNi和手势识别模块PJ7602还有红外测温模块MLX90614 温度模块MLX9061 ![在这里插入图片描述] ...

  7. 基于STM32F1与NRF24L01模块的SPI简单通信

    一.前言 1.简介: 本文是基于STM32F1,将数据发送至NRF模块的寄存器,并将数据重新读取,通过串口发送出来的简单SPI单通信. 2.SPI简介: 调过STM8的都已经对SPI有所了解,调法都一 ...

  8. 基于STM32F1自写移植代码分享系列之0.96寸OLED模块

    基于STM32F1自写移植代码分享系列之0.96寸OLED模块 文章目录 基于STM32F1自写移植代码分享系列之0.96寸OLED模块 文件获取 文件使用方法 参数配置 引脚配置 函数介绍 函数说明 ...

  9. 基于I2C协议的EEPROM驱动控制

    基于I2C协议的EEPROM驱动控制 `timescale 1ns / 1ps module i2c_ctrl #(parameter DEVICE_ADDR = 7'b1010_000,//i2c设 ...

  10. linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写

    摘要:媒介 Device Tree是一种用去描绘硬件的数据布局,类似板级描绘说话,发源于OpenFirmware(OF).正在现在遍及应用的kernel 2.6.x版本中,对分歧仄台.分歧硬件,往] ...

最新文章

  1. (C++)1002 写出这个数
  2. python 函数(二)
  3. OpenCV 图像缩放
  4. func_num_args()
  5. Qt学习笔记之QTranslator
  6. matlab int 积不出,matlab – 点积:*命令与循环给出不同的结果
  7. js导出的xlsx无法打开_js文件操作之——导出Excel (js-xlsx)
  8. js两个等号和三个等号_这两个号段开头的手机号,已成“古董号”,手里有的保存好...
  9. git切换分支出现head is now at_git寻根——^和~的区别
  10. ewebeditor高版本=5.50day
  11. 基于FFMPEG+Python实现大视频分隔+水印+合并片头片尾
  12. win7 64bit部署SharePoint Server2010
  13. SCT芯洲DC-DC-SCT2430是一款输出电流高达3.5A的高功率密度全集成同步降压DCDC转换器。其输入电压范围为3.8V到40V,替代TPS54340
  14. 科技爱好者周刊(第 209 期):程序员是怎样的人
  15. 国家队上场——国家测绘局网络地图网站评测
  16. mysql的month_MySQL MONTH()用法及代码示例
  17. 使用VLC把视频转换为一帧一帧的图片
  18. 这几个宝藏网站,一旦知道,你就离不开了!!!
  19. 给CheckBox换样式
  20. STC15W4K32S4单片机ADC应用实现

热门文章

  1. JVM监控及诊断工具之JConsole
  2. ubuntu软件默认安装位置
  3. 如何做好企业SWOT分析?用这个企业项目设计工具就足够了!
  4. 基于Web的酒店客房管理系统的设计与实现
  5. MineCraft建模工具
  6. 菜菜PyTorch深度学习框架最全笔记(第二次课)
  7. 1人30天44587行代码,分享舍得网开发经验(修改版)
  8. java混淆器最好_使用混淆器,保护你的java程序
  9. pdfFactory2020最新7许可密钥-激活码版虚拟打印软件 中文特别授权版下载
  10. 如何一次性保存html图片大小,保存网页图片的几种方法(批量)