Files
2024-09-18 11:50:26 +08:00

129 lines
2.9 KiB
C

/*
* qmc5883l.c
*
* Created on: Mar 4, 2024
* Author: gxms0
*/
#include "qmc5883l.h"
void qmcxxx_init(QMC_ptr ptr,I2C_ptr i2c,uint16_t address)
{
ptr->address = address;
ptr->i2c = i2c;
ptr->read = &i2c_read;
ptr->write = &i2c_write;
uint8_t cmd = QMC5883_CMD_SOFT_RST_ENABLE;
//使能软件复位
cmd = QMC5883_CMD_SOFT_RST_ENABLE;
ptr->write(ptr->i2c, ptr->address, QMC5883_REG_CTRL2, &cmd , 1);
//连续模式、满量程为8G、过采样率
cmd = QMC5883_CMD_MODE_CON|QMC5883_CMD_ODR_10HZ|QMC5883_CMD_RNG_8G|QMC5883_CMD_OSR_512;
ptr->write(ptr->i2c, ptr->address, QMC5883_REG_CTRL1, &cmd , 1);
//不使用中断,数据指针自动移动到下一个地址(在寄存器00H~05H之间)
cmd = QMC5883_CMD_INT_DISABLE|QMC5883_CMD_ROL_PNT_ENABLE ;
ptr->write(ptr->i2c, ptr->address, QMC5883_REG_CTRL2, &cmd , 1);
}
uint8_t qmcxxx_checkchip(QMC_ptr ptr)
{
uint8_t ChipID=0;
ptr->read(ptr->i2c, ptr->address, QMC5883_REG_PRODUCTID ,&ChipID, 1);
if(ChipID==0xFF)
{
return 0x01;
}
else
{
return 0x00;
}
}
void qmcxxx_getdata(QMC_ptr ptr)
{
int16_t mxyz[10][3] = {0};
int32_t avermxyz[3]={0};
uint8_t buffer[6]={0};
static float magGaussData[3] = {0.0};
static uint8_t cnt=0;
ptr->read(ptr->i2c, ptr->address, QMC5883_REG_DATA ,buffer, 6);
//printf("Xl=%d,Xh=%d,Yl=%d,Yh=%d,Zl=%d,Zh=%d\r\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]);
mxyz[cnt][0] = (int16_t)(buffer[1] << 8 | buffer[0]);
mxyz[cnt][1] = (int16_t)(buffer[3] << 8 | buffer[2]);
mxyz[cnt][2] = (int16_t)(buffer[5] << 8 | buffer[4]);
cnt++;
if(cnt>=10)
{
cnt=0;
for(uint8_t i=0,j=0;i<3;i++)
{
for(j=0;j<10;j++)
{
avermxyz[i]+=mxyz[j][i];
}
avermxyz[i]=avermxyz[i]/10;
}
//printf("average original data :x=%d,y=%d,z=%d\r\n",avermxyz[0],avermxyz[1],avermxyz[2]);
for(uint8_t k=0;k<3;k++)
{
magGaussData[k]=magGaussData[k]-32768; //32768:Null Field Output
magGaussData[k]=avermxyz[k]/3000; //3000:sensitivity, 3000 counts/G
}
//printf("convert the raw data :x=%f,y=%f,z=%f\r\n",magGaussData[0],magGaussData[1],magGaussData[2]);
//printf("\r\n");
}
//DelayMs(3000);
}
/*
3、空间校准:把椭球修到正球
a)、空间旋转芯片,找出xyz的最大最小值xmax、xmin、ymax 、ymin、zmax 、zmin。
b)、于是,x的偏移: Xoffset= (xmax + xmin) / 2;
c)、x的比例取:x_gain=1
d)、y的偏移:Yoffset =(ymax + ymin) / 2;
e)、y的比例:y_gain=(xmax - xmin) / (y_max -y_min);
f)、 z的偏移:Zoffset =(zmax + zmin) / 2;
g)、z的比例:z_gain=(xmax - xmin) / (z_max -z_min);
X_QMC = QMC_Xgain *(X_QMC - QMC_Xoffset);
Y_QMC = QMC_Ygain * (Y_QMC - QMC_Yoffset);
Z_QMC = QMC_Zgain * (Z_QMC- QMC_Zoffset);
*/