一,项目简介
项目名称:电子指南针
硬件:HMC5883L,STM32F103C8T6,SG90舵机
代码:https://github.com/zysampof/HMC5883L-STM32F1-.git
欢迎留言交流
二,制作过程
1.项目思路
项目分为三个步骤,一是通过HMC5883L采集磁场信息,传输到STM32内;二是STM32将角度信息传输到SG90;第三个步骤是将HMC5883L的信息转换为SG90的角度信息
2.HMC5883L
寄存器00,01,02配置如下:
HMC5883L_WriteReg(HMC5883L_REG_CONFIG_A, 0X70);
HMC5883L_WriteReg(HMC5883L_REG_CONFIG_B, 0X20);
HMC5883L_WriteReg(HMC5883L_REG_MODE, 0X00);
寄存器03-08数据读取:
void HMC5883L_GetData(int16_t *GaX, int16_t *GaY, int16_t *GaZ)
{
uint8_t DataH, DataL;
DataH = HMC5883L_ReadReg(HMC5883L_REG_OUT_X_M);
DataL = HMC5883L_ReadReg(HMC5883L_REG_OUT_X_L);
*GaX = (DataH << 8) | DataL;
DataH = HMC5883L_ReadReg(HMC5883L_REG_OUT_Z_M);
DataL = HMC5883L_ReadReg(HMC5883L_REG_OUT_Z_L);
*GaY = (DataH << 8) | DataL;
DataH = HMC5883L_ReadReg(HMC5883L_REG_OUT_Y_M);
DataL = HMC5883L_ReadReg(HMC5883L_REG_OUT_Y_L);
*GaZ = (DataH << 8) | DataL;
}
3.SG90
代码见仓库
4.信息转换
(1)磁力数据过滤
float EMA(float rawValue, float filteredValue)
{
return alpha * rawValue + (1 - alpha) * filteredValue;
}
原理:指数移动平均值(Exponential Moving Average,简称EMA)
(2)磁场强度转换角度
ArcTan = (double)y / (double)x;
Angle = atan(ArcTan)*57.3 + 90;
其中,x,y为磁场矢量在x,y轴上的投影(HMC5883L测量值)
三,感谢
江协科技江协科技
https://github.com/uestcgaosir/Embedded-system-recruitment/tree/master