GY-273 三轴电子指南针STM32F1x开发

一、指南针型号
1.1 GY-273 QMC5883L电子指南针罗盘模块 三轴磁场传感器
在这里插入图片描述

1.2 模块线的连接

注意:
1)这个模块使用时,焊在板子上才好,不要用杜邦线接,会不灵敏。
2)调试时候,可以杜邦线用一下。

GY-273连接单片机
VCC5V
GNDGND
SCLPA 11
SDAPA 12
DRDY不接
串口调试模块
5V5V
TXDPA10
RXDPA9
GNDGND
ST-LINK
SWCLK缺口靠左-左排-上至下-第5 个针
SWDIO缺口靠左-左排-上至下-第4 个针
GND缺口靠左-右排-上至下-最后1个针
3.3v缺口靠左-右排-上至下-第2 个针

二、程序开发

程序链接:
最新版:点击 3—GY273.zip,去我资源 库里面找 吧。

这版修改了上版的问题,最新的亲测,有效。

上一版(stm32f10x 电子指南针GY-273.zip),做一个参考吧!

2.1 main 函数

#include "stm32f10x.h"
#include "usart.h"	
#include "delay.h"
#include "sys.h"
#include "GY273.h"

extern double gy273_data;
extern void gy273_work(void);

 int main(void) {	
    delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(9600); 
	Init_HMC5883();      //GY273 初始化
  while(1){
	    gy273_work();
		printf("gy273_data is %f \r\n",gy273_data); 	
	}
 }

2.2 .h文件

#ifndef GY273_H
#define GY273_H
#include "sys.h"
#include "delay.h"

//                           第一部分:IIC通信 的协议驱动函数   	   		   
//IO方向设置
#define SDA_IN() {GPIOA->CRH&=0XFFF0FFFF;GPIOA->CRH|=8<<16;}
#define SDA_OUT() {GPIOA->CRH&=0XFFF0FFFF;GPIOA->CRH|=3<<16;}

//IO操作函数	 
#define IIC_SCL    PAout(11) //SCL
#define IIC_SDA    PAout(12) //SDA	 
#define READ_SDA   PAin(12)  //输入SDA 
//                           第二部分:GY273 的设置函数

#define  uchar unsigned char
#define  uint  unsigned int	

#define	SlaveAddress   0x3C	  //定义器件5883在IIC总线中的从地址
typedef unsigned char BYTE;
typedef unsigned short WORD;




//                           第一部分:IIC通信 的协议驱动函数
//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号

void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	  
//                           第二部分:GY273 的设置函数
void  Multi_read_HMC5883(void);                 //连续读出HMC5883内部角度数据,地址范围0x3~0x5
void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //单个写入数据
//uchar Single_Read_HMC5883(uchar REG_Address);                   //单个读取内部寄存器数据
void Init_HMC5883(void);            //初始化5883
void conversion(uint temp_data);
void gy273_work(void);

#endif
### 使用STM32F103单片机实现指南针功能 #### 硬件配置 为了实现指南针的功能,硬件部分主要由STM32F103C8T6单片机最小系统电路、LCD1602液晶显示电路以及GY-271指南针罗盘模块构成[^1]。这些组件共同协作来获取并展示方向和角度信息。 #### 软件编程环境设置 对于软件开发而言,推荐使用Keil MDK作为IDE来进行项目的创建与管理[^2]。在此环境中编写用于驱动各个模块工作的固件代码,并通过调试工具下载到目标板上运行测试。 #### 主要工作流程概述 整个系统的运作依赖于几个关键环节: - **初始化阶段**:启动时先完成对I/O端口、定时器以及其他必要资源的初始化操作; - **数据采集过程**:利用I²C总线协议读取来自HMC5883L磁传感器的数据流; - **计算处理步骤**:依据所获得的信息计算当前指向的角度值; - **结果显示机制**:最后把最终结果发送给LCD显示屏呈现出来供用户查看。 下面给出一段简化版的示例源码片段用来说明上述逻辑的具体实施方法: ```c #include "stm32f1xx_hal.h" #include <string.h> #include <stdio.h> // 定义IIC接口引脚定义及相关变量声明... #define HMC5883_ADDRESS (0x1E<<1) void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); // 配置系统时钟 /* 初始化所有外设 */ MX_GPIO_Init(); while(1){ uint8_t buffer[6]; // 发送命令至HMC5883, 请求测量模式下的一组原始X/Y/Z磁场强度样本 HAL_I2C_Master_Transmit(&hi2c1,(uint16_t)(HMC5883_ADDRESS),"\x09",1,HAL_MAX_DELAY); // 接收返回来的六个字节长度的数据包(每两个连续bit表示一个坐标分量) HAL_I2C_Master_Receive(&hi2c1,HMC5883_ADDRESS,buffer,sizeof(buffer),HAL_MAX_DELAY); int16_t x = ((int16_t)((buffer[0]<<8)|buffer[1])); int16_t y = ((int16_t)((buffer[2]<<8)|buffer[3])); float heading; if(y<0) heading=atan2(-y,x)+PI; // 计算北向角 else if(x>0 && y==0) heading=ATAN2_PI/2; else if(x<0 && y==0) heading=-ATAN2_PI/2; else heading=atan2(-y,-x)-PI; char str[16]=""; sprintf(str,"%d",(int)(heading*180/M_PI)); lcd_display_string(str); // 向LCD写入字符串 HAL_Delay(1000); // 延迟一秒再重复循环 } } ``` 这段代码展示了如何从HMC5883L传感器中提取XYZ上的磁场强度数值,并据此推导出相对于地理北极的方向角度,之后将其转换成易于理解的形式并通过字符形式输出到外部显示器上去。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值