qmc5883p芯片坐标系方向定义

本文探讨了在使用qmc5883P磁力计时遇到的坐标方向不清晰的问题。通过实验发现,该芯片的X、Y、Z轴方向与datasheet示例不完全一致,X轴始终与丝印字体水平,Y轴始终垂直,而Z轴垂直于丝印字体平面。同时,详细介绍了0x29寄存器的8种方向设置模式,并指出其对轴正负方向的影响。此外,还提到了芯片在正常模式和连续模式下的不同数据输出频率及对应的功耗情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

最近一个项目用到qmc5883p, 然而确定磁力计方向的时候发现datasheet上写的不是很清楚, 并且example中还有一个设置方向的一步, 于是测试了芯片坐标方向并记录了下来; 该芯片和qmc5883L方向并不一致;

结果

qmc5883P的datasheet给出来如下说明, Y为笔者添加的;

qmc5883P方向

但是这个方向是按照datasheet的example设置的结果:

    //Define the sign for X Y and Z axis
    qmc5883p_write_reg(0x29, 0x06);

芯片寄存器0x29datasheet中并未介绍, 但是经过测试存在 0x00-0x07八种方向设置, 但是x方向总是和丝印字体方向水平, y方向总是和丝印字体方向垂直, z方向总是垂直于丝印字体平面, 改变的只是x,y,z轴的正负方向;
不同值xyz的方向
另外该芯片normal mode下支持4中数据输出频率, 10Hz, 50Hz, 100Hz, 200Hz, continuous mode下, 最大支持1500Hz的数据输出频率; 正常模式下输出频率越高功耗越高, 连续模式下功耗最大;

### STM32 QMC5883 HAL库 示例代码 使用教程 对于STM32系列微控制器而言,利用HAL库实现QMC5883磁传感器的数据采集是一项常见需求。下面提供一段基于STM32 HAL库操作QMC5883的示例代码。 #### 初始化I2C通信接口 由于QMC5883通过I2C总线与STM32相连,在开始任何交互之前需先配置好相应的I2C外设参数并完成初始化工作[^3]: ```c // 定义 I2C 句柄结构体变量 extern I2C_HandleTypeDef hi2c1; void MX_I2C1_Init(void){ /* USER CODE BEGIN I2C1_Init 0 */ /* USER CODE END I2C1_Init 0 */ /* USER CODE BEGIN I2C1_Init 1 */ /* USER CODE END I2C1_Init 1 */ hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } ``` #### 配置QMC5883设备地址及寄存器映射关系表 为了简化后续编程复杂度,建议预先设定目标器件的具体物理地址以及内部各功能模块对应的存储单元编号: ```c #define QMC5883_ADDR ((uint8_t)0x0D<<1) // 设备默认地址左移一位适应I2C协议规定 #define REG_XOUT_LSB 0x00 // X轴低字节输出位置 #define REG_XOUT_MSB 0x01 // X轴高字节输出位置 #define REG_YOUT_LSB 0x02 // Y轴低字节输出位置 #define REG_YOUT_MSB 0x03 // Y轴高字节输出位置 #define REG_ZOUT_LSB 0x04 // Z轴低字节输出位置 #define REG_ZOUT_MSB 0x05 // Z轴高字节输出位置 #define REG_STATUS 0x06 // 状态寄存器 #define REG_TEMP 0x07 // 温度测量值 #define REG_CONFIG 0x09 // 控制模式设置命令所在偏移量 #define CONFIG_ODR_MASK 0xC0 // 数据更新速率掩码 #define CONFIG_OS_MASK 0x38 // 过采样率控制位域范围 #define CONFIG_MODE_CONT 0x01 // 设置连续转换模式标志位 ``` #### 编写辅助函数用于发送单条指令给QMC5883芯片 当需要向指定寄存器写入特定数值时可调用此类方法来构建完整的传输序列: ```c static void qmc5883_write_reg(uint8_t reg_addr,uint8_t value){ uint8_t data[2]; data[0]=reg_addr; data[1]=value; HAL_I2C_Master_Transmit(&hi2c1,QMC5883_ADDR,data,2,HAL_MAX_DELAY); } ``` #### 实现获取磁场强度三维坐标的方法 最后一步就是封装一个能够一次性读回XYZ三个方向分量的功能入口,并将其转化为便于理解的实际单位表示形式: ```c typedef struct{ int16_t x,y,z; }mag_data_t; int get_magnetic_field(mag_data_t* mag){ uint8_t buffer[6]; // 存储原始二进制流 // 启动一次新的测量周期 qmc5883_write_reg(REG_CONFIG,(CONFIG_OS_MASK|CONFIG_MODE_CONT)); while(!(buffer[REG_STATUS]&0x01)); // 循环等待直到DRDY信号有效为止 // 执行批量接收动作 HAL_I2C_Mem_Read(&hi2c1,QMC5883_ADDR,REG_XOUT_LSB,I2C_MEMADD_SIZE_8BIT, buffer,sizeof(buffer),HAL_MAX_DELAY); // 将接收到的结果按照高低位顺序组合成有符号短整型数 mag->x=((int16_t)(buffer[1]<<8)|buffer[0]); mag->y=((int16_t)(buffer[3]<<8)|buffer[2]); mag->z=((int16_t)(buffer[5]<<8)|buffer[4]); return 0; } ``` 上述流程展示了如何借助于STM32 HAL库框架下的API集合轻松达成对QMC5883电子罗盘的有效操控目的。值得注意的是实际项目应用过程中还需考虑更多细节因素比如电源管理策略、异常处理机制等方面的内容以便提高系统的稳定性和可靠性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值