ITPub博客

首页 > 嵌入式/内核开发 > 嵌入式/内核开发 > 《STM32H7R7开发指南 V1.1 》第四十六章 QMC6308磁力计实验

《STM32H7R7开发指南 V1.1 》第四十六章 QMC6308磁力计实验

原创 嵌入式/内核开发 作者:正点原子 时间:2025-09-18 09:45:54 0 删除 编辑

第四十六章 QMC6308磁力计实验


       STM32H7R7开发板自带了QMC6308传感器。本章,我们将介绍如何使用磁力计QMC6308,将读取到的XYZ原始数据显示到LCD,并将XY数据转换为XY平面的方位角(角度范围0~360°,正北方向为0°)、将读取到的T转换为温度显示到LCD。本章分为如下几个小节:

       本章分为如下几个小节:

       46.1 QMC6308介绍

       46.2 硬件设计

       46.3 程序设计

       46.4 下载验证


        46.1 QMC6308介绍


       46.1.1 QMC6308简介

       QMC6308是一款QST(上海矽睿)的一款三轴地磁传感器,内部进行信号处理,通过IIC接口进行输出。QMC6308提供的输出信号与它在XYZ方向上测量的磁场成比例,如果需要消除比例因子,需要用户自行校准。QMC6308主要特点如下:

       1)测量范围:最大±30高斯

       2)高分辨率:0.15μT/LSB(X/Y轴),0.25μT/LSB(Z轴)

       3)高灵敏度:三个轴正交:90°±1,灵敏度:1000 LSBs/Gauss

       4)工作温度范围:-40~+85℃

       5)供电电压:1.65~1.95V

       6)16位ADC采样

       7)内部带有温度传感器

       8)支持中断

       QMC6308传感器的检测轴如图46.1.1.1所示:


图46.1.1.1 QMC6308检测轴与方向


       在QMC6308传感器,通过MUX选择器选择采集的是X、Y、Z的数据,然后通过16位ADC获取X、Y、Z的数据,同样,传感器的温度也是通过ADC采集,采集到的数据通过IIC接口进行输出。QMC6308内部结构图如图46.1.1.2所示:


图46.1.1.2 QMC6308内部结构图


       图46.1.1.2中SDA和SCL是连接MCU的IIC接口,QMC6308的WLCSP封装只支持IIC协议,这里我们主要介绍使用IIC驱动QMC6308。

       每一个IIC设备都有自己的设备地址,QMC6308也不例外,QMC6308的设备地址是包括不可编程部分和可编程部分。

       本实验将A1接地,那么设备地址为0x2C。


       46.1.2 QMC6308工作模式简介

       接下来我们分别QMC6308三种工作模式:单次测量模式、连续模式、挂起模式。


       1. 单次测量模式

       在单次测量模式(Mode bits=10)时,整个芯片只运行一次,在完成一次测量后进入暂时挂起模式。噪声性能也可以通过OSR2设置来控制。


       2. 连续模式

       在连续模式(mode位= 11)期间,磁传感器连续进行测量,并将测量数据放入数据输出寄存器。字段范围寄存器位于控制寄存器(OBH)中,数据输出速率与OSR2设置有关,它们应该在连续模式下为应用程序正确设置。


       3. 挂起模式

       挂起模式是磁力计在POR和软复位时的默认状态。在这种模式下,只有少数功能块被激活,从而使功耗尽可能低。在这种状态下,寄存器值由低功耗LDO保持,I2C接口处于活动状态,允许所有寄存器读写。在悬浮状态下没有磁力计测量。


       46.1.3 QMC6308工作时序简介

       在STM32H7R7开发板的上,A1是接GND的,所以QMC6308的设备地址是0x2C。在前面我们已经介绍过IIC总线的基本读写,所以我们只介绍QMC6308的数据传输时序。

       下面把实验中到的数据传输时序讲解一下,分别是对QMC6308的写时序和读时序。QMC6308写寄存器时序图如图46.1.4.1所示:


图46.1.4.1 QMC6308写时序图


       I2C写序列以主机生成的起始条件开始,后面跟着7位从机地址和一个写位(R/W-0)。从机发送一个确认位(ACK-0)并释放总线。主机发送一个字节的寄存器地址。从机再次确认传输,并等待8位数据写入指定的寄存器地址。从机确认数据字节后,主机产生停止信号并终止写入协议。

       说完寄存器写入方式之后,下面看一下图46.1.4.2关于QMC6308的读寄存器时序。


图46.1.4.2 QMC6308读时序图


       读取寄存器的过程是一个复合的时序,其中包含写时序和读时序。启动条件必须在两个时序之间产生。先看第一个通信过程,这里是写时序,起始信号产生后,主机发送QMC6308写设备地址,获取从机的应答信号后,然后主机释放总线并等待数据字节被释放在从机读出。在每个数据字节之后,主机必须生成一个确认位(ACK-0)来启用进一步的数据传输。来自主服务器的NACK将停止从服务器传输数据。从机释放总线,以便主机可以产生一个停止条件和终止传输。


        46.2 硬件设计


       1. 例程功能

       开机的时候先检测QMC6308是否存在,在检测到QMC6308之后,可以通过KEY0进入校准模式。在初始化完成后(必须进入一次校准,不然数据不是准确的数据),就会不断的读取QMC6308的数据,同时在LCD上面显示相关信息。LED0闪烁用于提示程序正在运行。


       2. 硬件资源


       1)LED灯

              LED0 – PD14


       2 ) 独立按键

              KEY0 – PE9

              KEY_UP – PC13


       3)正点原子 2.8/3.5/4.3/7寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)


       4)串口1(PB14/PB15连接在板载USB转串口芯片CH340上面)


       5)磁力计 QMC6308


       3. 原理图

       我们主要来看看QMC6308和开发板的连接,如下图所示:


图46.2.3.1 QMC6308连接原理


       QMC6308的SCL和SDA分别连接在STM32的PF1和PF0上。本实验通过软件模拟IIC信号建立起与QMC6308的通信,进行数据发送与接收,LCD屏幕进行显示。通过原理图可知本实验使用的QMC6308没有INT引脚,所以源码里面只使用单次测量模式读取数据。


        46.3 程序设计


       46.3.1 程序解析

       本实验中,我们通过GPIO来模拟IIC,所以不需要在Drivers/STM32H7RSxx_HAL_Driver分组下添加IIC的HAL库文件支持。实验工程中,我们复制IIC实验工程,重命名为磁力计实验,新增qmc6308.c文件存放QMC6308驱动。


       1. QMC6308驱动代码

       这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。QMC6308驱动源码包括两个文件:qmc6308.c和qmc6308.h。

       在IIC实验中已经对IIC协议中的需要用到的信号都用函数封装好了,那么现在就要定义符合QMC6308时序的函数。为了使代码功能更加健全,所以在qmc6308.h中宏定义了QMC6308的相关寄存器,具体定义如下:

#define QMC6308_ADDR                0X2C    /* QMC6308 IIC器件地址 */
#define QMC6308_CHIP_ID_REG         0x00    /* 芯片ID寄存器 */
#define QMC6308_DEVICE_ID           0x80    /* ID号 */
 
/* QMC6308寄存器地址 */
#define QMC6308_DATA_X_L_REG        0x01    /* x轴低8位数据输出寄存器 */
#define QMC6308_DATA_X_H_REG        0x02    /* x轴高8位数据输出寄存器 */
#define QMC6308_DATA_Y_L_REG        0x03    /* y轴低8位数据输出寄存器 */
#define QMC6308_DATA_Y_H_REG        0x04    /* y轴高8位数据输出寄存器 */
#define QMC6308_DATA_Z_L_REG        0x05    /* z轴低8位数据输出寄存器 */
#define QMC6308_DATA_Z_H_REG        0x06    /* z轴高8位数据输出寄存器 */
#define QMC6308_STATUS_REG          0x09    /* 状态寄存器 */
#define QMC6308_CTL_REG1            0x0A    /* 控制寄存器1 */
#define QMC6308_CTL_REG2            0x0B    /* 控制寄存器2 */
#define QMC6308_CTL_REG3            0x0D    /* 控制寄存器3 */
#define QMC6308_CTL_REG4            0x0F    /* 控制寄存器4 */

       下面先看一下qmc6308_read_nbytes函数,实现从QMC6308芯片指定地址读取N字节数据,代码如下:

/**
 * @brief       从QMC6308读取N字节数据
 * @note        QMC6308的命令发送, 也是用该函数实现(不带参数的命令, 也会有一个状态寄存器
*              需要读取)
 * @param       addr  : 寄存器地址/命令
 * @param       buf   : 数据存储buf
 * @param       length: 读取长度
 * @retval      0, 操作成功
 *              其他, 操作失败
 */
uint8_t qmc6308_read_nbytes(uint8_t addr, uint8_t *buf, uint8_t length)
{
    uint8_t i;
 
    iic_start();
    iic_send_byte((QMC6308_ADDR << 1) | 0X00);  /* IIC地址最低位是0, 表示写入 */
 
    if (iic_wait_ack())
    {
        iic_stop();
        return 1;
    }
 
    iic_send_byte(addr);                        /* 写地址/命令 */
    iic_wait_ack();
 
    iic_start();
    iic_send_byte((QMC6308_ADDR << 1) | 0x01);  /* IIC地址最低位是1, 表示读取 */
    iic_wait_ack();
 
    for (i = 0; i < length; i++)
    {
        buf[i] = iic_read_byte((i == (length - 1)) ? 0 : 1);
    }
    iic_stop();
 
    return 0;
}

       该函数首先调用iic_start函数产生起始信号,然后调用iic_send_byte函数发送第1个字节数据设备写地址,等待QMC6308设备返回应答信号;收到应答信号后,继续发送第2个1字节数据内存地址addr;等待接收应答后,发送第3个1字节数据设备读地址;最后QMC6308最 先收到的是状态字节(一个字节),随后是读取的数据(数据都是两个字节),返回应答信号,主机调用iic_stop函数产生停止信号终止数据传输,等待QMC6308读取完毕。

       接下来看一下qmc6308_write_register函数,实现从QMC6308芯片指定地址写入数据,其定义如下:

/**
 * @brief       QMC6308写寄存器
 * @param       reg  : 寄存器地址
 * @param       data : 写入的值
 * @retval      0, 操作成功
 *              其他, 操作失败
 */
uint8_t qmc6308_write_register(uint8_t reg, uint8_t data)
{
    iic_start();
    iic_send_byte((QMC6308_ADDR << 1) | 0X00);  /* IIC地址最低位是0, 表示写入 */
    if (iic_wait_ack())
    {
        iic_stop();
        return 1;
    }
    iic_send_byte(reg);                         /* 发送写寄存器命令 */
    if (iic_wait_ack() != 0)
    {
        iic_stop();
        return 1;
    }
    
    iic_send_byte(data);                        /* 发送数据 */
    if (iic_wait_ack() != 0)
    {
        iic_stop();
        return 1;
    }
    iic_stop();
 
    return 0;
}

       该函数首先调用iic_start函数产生起始信号,然后调用iic_send_byte函数发送第1个字节数据设备写地址,等待QMC6308设备返回应答信号;收到应答信号后,继续发送第2个1字节写入数据内存地址reg;等待接收应答后,发送第3个1字节数据写入内存地址的数据data高字节;QMC6308设备写完数据,返回应答信号,主机调用iic_stop函数产生停止信号终止数据传输,等待QMC6308写入完毕。

       介绍完写寄存器函数,那么我们接下来开始介绍qmc6308_read_register函数,实现QMC6308内部寄存器的读取,代码如下:

/**
 * @brief       QMC6308读寄存器
 * @param       reg  : 寄存器地址
 * @retval      读取到的值
 *              0XFFFF, 则可能表示错误
 */
uint16_t qmc6308_read_register(uint8_t reg)
{
    uint8_t temp = 0;
 
    iic_start();
    iic_send_byte((QMC6308_ADDR << 1) | 0X00);  /* IIC地址最低位是0, 表示写入 */
    iic_wait_ack();
 
    iic_send_byte(reg);                         /* 发送读寄存器命令 */
    iic_wait_ack();
 
    iic_start();
    iic_send_byte((QMC6308_ADDR << 1) | 0x01);  /* IIC地址最低位是1, 表示读取 */
    if (iic_wait_ack() != 0)
    {
        iic_stop();
        return 1;
    }
    temp = iic_read_byte(0);
    iic_stop();
    return temp;
}

       该函数与我们介绍第一个函数相似,首先调用iic_start函数产生起始信号,然后调用iic_send_byte函数发送第1个字节数据设备写地址,等待QMC6308设备返回应答信号;收到应答信号后,继续发送第2个1字节数据内存地址reg<<1(读取地址的低1位也为0);等待接收应答后,发送第3个1字节数据设备读地址;最后QMC6308设备接收完数据(一个状态字节和一个两字节的数据),返回应答信号,主机调用iic_stop函数产生停止信号终止数据传输,等待QMC6308读取完毕。

       最后,我们介绍三个读取数据函数,代码如下:

/**
 * @brief       QMC6308读取磁力计数据(只读 X,Y,Z轴数据)
 * @param       pmagx    : X轴磁力计原始值指针
 * @param       pmagy    : Y轴磁力计原始值指针
 * @param       pmagz    : Z轴磁力计原始值指针
 * @retval      0, 成功
 *              其他, 异常
 */
uint8_t qmc6308_read_magdata(float *pmagx, float *pmagy, float *pmagz)
{
    int res = 0;
    unsigned char mag_data[6];
    short hw_d[3] = {0};
    short raw_c[3];
    int t = 0;
    unsigned char rdy = 0;
    
    /* Check status register for data availability */
    while(!(rdy & 0x01) && (t < 5))
    {
        qmc6308_read_nbytes(QMC6308_STATUS_REG, &rdy, 1);
        t++;
    }
res = qmc6308_read_nbytes(QMC6308_DATA_X_L_REG, mag_data, 6);   
/* 读取XYZ轴数据 */
    if(res != 0)
    {
        return 1;                                   /* 读取失败直接返回 */
    }
    /* 组合数据 */
    hw_d[0] = (short)(((mag_data[1]) << 8) | mag_data[0]);
    hw_d[1] = (short)(((mag_data[3]) << 8) | mag_data[2]);
    hw_d[2] = (short)(((mag_data[5]) << 8) | mag_data[4]);
    
    /* Unit:mG  1G = 100uT = 1000mG */
    raw_c[AXIS_X] = (int)(c_map.sign[AXIS_X] * hw_d[c_map.map[AXIS_X]]);
    raw_c[AXIS_Y] = (int)(c_map.sign[AXIS_Y] * hw_d[c_map.map[AXIS_Y]]);
    raw_c[AXIS_Z] = (int)(c_map.sign[AXIS_Z] * hw_d[c_map.map[AXIS_Z]]);
    
    *pmagx = (float)raw_c[AXIS_X] / 10.0f;
    *pmagy = (float)raw_c[AXIS_Y] / 10.0f;
    *pmagz = (float)raw_c[AXIS_Z] / 10.0f;
    return res;
    
}
 
/**
 * @brief       QMC6308读取磁力计数据(只读 X,Y,Z轴数据),读times次取平均
 * @note        本函数耗时 ≈ 15 * times ms
 *
 * @param       pmagx    : X轴磁力计原始值指针
 * @param       pmagy    : Y轴磁力计原始值指针
 * @param       pmagz    : Z轴磁力计原始值指针
 * @param       times    : 读取多少次取平均
 * @retval      0, 成功
 *              其他, 异常
 */
uint8_t qmc6308_read_magdata_average(float *pmagx, float *pmagy, float *pmagz, uint8_t times)
{
    uint8_t i = 0;
    uint8_t error_cnt = 0;
    int32_t magx = 0;
    int32_t magy = 0;
    int32_t magz = 0;
 
    while (i < times)                                   /* 连续读取times次 */
    {
        if (qmc6308_read_magdata(pmagx,pmagy,pmagz)==0) /* 读取数据是否正常? */
        {
            magx += *pmagx;                             /* 累加 */
            magy += *pmagy;
            magz += *pmagz;
            
            i++;
            error_cnt = 0;
        }
        else
        {
            error_cnt++;                                /* 错误计数器 */
            delay_ms(10);
            if (error_cnt > 100)         /* 连续100次出错, 直接返回异常 */
            {
                return 0XFF;
            }
        }
    }
    *pmagx = magx / times;                              /* 取平均值 */
    *pmagy = magy / times;                              /* 取平均值 */
    *pmagz = magz / times;                              /* 取平均值 */
    
    return 0;
}

       qmc6308_read_magdata函数:首先设置为单次模式,然后读取一次磁力计的x,y,z轴原始数据,iic数据有7位:status,x高八位,x低八位,y高八位,y低八位,z高八位,z低八位。

       qmc6308_read_magdata_average函数:调用qmc6308_read_magdata函数,读取多次磁力计的x,y,z轴原始数据,取平均值。

       我们在main函数主要调用qmc6308_read_magdata函数实现读取磁力计的数据。


       2. main.c代码

       我们读取到的x,y,z轴数据是原始数据,此时的数据还不能直接用作方位角的计算,因为此时的磁力计可能受到其他一些磁性材料的影响,导致圆心坐标偏移,所以我们要对磁力计进行校准,将漂移值移除,使圆心回到原点。

       常用校准方法有:平面校准法、立体八字校准法、十面校准法。本实验采用平面校准法,针对XY轴进行校准,将开发板在XY平面内旋转一周,等价于将地球磁场矢量绕着点O(x0,y0)(即圆心)垂直于XY平面的法线旋转,这样就可以得到圆心的位置x_offeset = (x_max + x_min) / 2,y_offeset = (y_max + y_min) / 2。立体八字校准法与十面校准法我们不做介绍,感兴趣的可以自己去了解一下。

       我们以XY平面为例,假设圆心O点发生了偏移,如图46.3.1.2.1所示:


图46.3.1.2.1 圆心偏移示意图


       我们校准后,使得圆心O点回到零点(0,0),如图46.3.1.2.2所示:


图46.3.1.2.2 圆心在零点示意图


       最后,我们打开main.c,这里就不全部贴出来了,仅介绍三个重要函数:

/**
 * @brief    罗盘(磁力计)校准函数
 * @note     这里我们使用最简单的平面校准方法.
 *           进入此函数后,请水平转动开发板至少一周(360°),转动完成后, 按WKUP键退出!
 * @param    无
 * @retval   无
 */
void compass_calibration(void)
{
    int16_t x_min = 0;
    int16_t x_max = 0;
    int16_t y_min = 0;
    int16_t y_max = 0;
 
    int16_t magx, magy, magz;
    uint8_t res;
    uint8_t key = 0;
    
    lcd_clear(WHITE);
    lcd_show_string(10, 90, 240, 16, 16, "Compass Calibration", RED);
    lcd_show_string(10, 110, 240, 16, 16, "Pls rotate horiz one cycle!", RED);
    lcd_show_string(10, 130, 240, 16, 16, "If done, press WKUP key!", RED);
    
    while (1)
    {
        key = key_scan(0);
        
        if (key == WKUP_PRES)    /* 结束校准 */
        {
            break;
        }
        
        res = qmc6308_read_magdata(&magx, &magy, &magz);  /* 读取数据 */
        
        if (res == 0)
        {
            x_max = x_max < magx ? magx : x_max;             /* 记录x最大值 */
            x_min = x_min > magx ? magx : x_min;             /* 记录x最小值 */
            y_max = y_max < magy ? magy : y_max;             /* 记录y最大值 */
            y_min = y_min > magy ? magy : y_min;             /* 记录y最小值 */
        }
        
        LED0_TOGGLE();      /* LED0闪烁,提示程序运行 */
    }
    
    g_magx_offset = (x_max + x_min) / 2;   /* X轴偏移量 */
    g_magy_offset = (y_max + y_min) / 2;   /* Y轴偏移量 */
   
    /* 串口打印水平校准相关参数 */
    printf("x_min:%d\r\n", x_min);
    printf("x_max:%d\r\n", x_max);
    printf("y_min:%d\r\n", y_min);
    printf("y_max:%d\r\n", y_max);
    
    printf("g_magx_offset:%d\r\n", g_magx_offset);
    printf("g_magy_offset:%d\r\n", g_magy_offset);
}
 
/**
 * @brief       罗盘获取角度
 * @note        获取当前罗盘的角度(地磁角度)
 * @param       无
 * @retval      角度
 */
float compass_get_angle(void)
{
    float angle;
    int16_t magx, magy, magz;
 
    /* 读取原始数据, 10次取平均 */
    qmc6308_read_magdata_average(&magx, &magy, &magz, 10);
    
    magx = (magx - g_magx_offset) ;   /* 根据校准参数, 计算新的输出 */
    magy = (magy - g_magy_offset) ;    /* 根据校准参数, 计算新的输出 */
 
    /* 根据不同的象限情况, 进行方位角换算 */
    if ((magx > 0) && (magy > 0))
    {
        angle = (atan((double)magy / magx) * 180) / 3.14159f;
    }
    else if ((magx > 0) && (magy < 0))
    {
        angle = 360 + (atan((double)magy / magx) * 180) / 3.14159f;
    }
    else if ((magx == 0) && (magy > 0))
    {
        angle = 90;
    }
    else if ((magx == 0) && (magy < 0))
    {
        angle = 270;
    }
    else if (magx < 0)
    {
        angle = 180 + (atan((double)magy / magx) * 180) / 3.14159f;
    }
    
    if (angle > 360) angle = 360;  /* 限定方位角范围 */
    if (angle < 0) angle = 0;      /* 限定方位角范围 */
 
    return angle;
}
 
int main(void)
{
    uint8_t t = 0;
    uint8_t key;
    float angle;
    float magx, magy, magz;
    
    sys_mpu_config();                   /* 配置MPU */
    sys_cache_enable();                 /* 使能Cache */
    HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(300, 6, 2);    /* 配置时钟,600MHz */
    delay_init(600);                    /* 初始化延时 */
    usart_init(500000);                 /* 初始化串口 */
    led_init();                         /* 初始化LED */
    key_init();                         /* 初始化按键 */
    hyperram_init();                    /* 初始化HyperRAM */
    lcd_init();                         /* 初始化LCD */
    
    while (qmc6308_init())              /* QMC6308初始化 */
    {
        lcd_show_string(30, 110, 200, 16, 16, "QMC6308 Error", RED);
        delay_ms(200);
        lcd_fill(30, 110, 239, 130 + 16, WHITE);
        delay_ms(200);
    }
    RST:
    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "QMC6308 TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 110, 200, 16, 16, "KEY0 to calibration", RED);
 
    while (1)
    {
        key = key_scan(0);
        
        if (key == KEY0_PRES)            /* KEY0 按下 ,执行校准 */
        {
            compass_calibration();       /* 校准函数 */
            lcd_clear(WHITE);            /* 清屏 */
            goto RST;                    /* 校准完后,跳到RST, 重新显示提示信息 */
        }
        
        delay_ms(10);
 
        t++;
        
        if (t == 10)                     /* 0.1秒左右更新一次磁力计原始值 */
        {        
            angle = compass_get_angle();                /* 执行一次约150ms */
            user_show_angle(30, 130, 360 - angle);      /* 显示角度 */
            qmc6308_read_magdata(&magx, &magy, &magz);  /* 读取原始数据 */
            user_show_mag(30, 170, "MagX:", magx);      /* 显示magx */
            user_show_mag(30, 190, "MagY:", magy);      /* 显示magy */
            user_show_mag(30, 210, "MagZ:", magz);      /* 显示magz */
            
            t = 0;
            LED0_TOGGLE();                              /* LED0闪烁 */
        }
    }
}

       下面分别介绍一下这三个函数。

       compass_calibration,该函数用于校准磁力计QMC6308,校准方法采用的是我们前面介绍的平面校准法,校准完成后的偏移量offeset存到全局变量g_magx_offset和g_magy_offset。

       compass_get_angle,该函数用于计算XY平面的方位角angle。首先,获取x,y,z的原始数据,然后x和y加上校准完成后的偏移量,最后再计算XY平面的方位角angle,atan求出来的角度范围-90°~+90°,所以想要得到0°~360°,我们进行方位角计算式,就要根据x,y判断象限,不同象限的情况下进行不同的计算。

       main函数,则比较简单,初始化相关外设,在循环中不断获取磁力计数据,并在LCD上显示数据;我们可以通过按键KEY0进入校准模式。


        46.4 下载验证

       在代码编译成功后,我们通过下载代码到开发板上,可以看到LED0不停闪烁,提示程序已经在运行了。LCD显示磁力计的MagX,MagY,MagZ原始数据和计算后的Angle,Temp数据,如图46.4.1所示:


图46.4.1 程序运行效果图


       按下KEY0,进入校准模式,如图46.4.2所示:


图46.4.2 校准模式效果图


       退出校准模式后,可以与手机指南针的航向角进行对比,如果发现误差较大,则需要再次进行校准。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3095988/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-08-30

  • 博文量
    588
  • 访问量
    764724