0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在GD32F310G-START开发板上读取三轴加速度计

冬至配饺子 来源:兆易创新GD32 MCU 作者:烟花易冷 2022-09-23 17:58 次阅读

我拿到的开发板实际板载的 MCUGD32F310G8,QFN28pin 封装,基于 ARM CORTEX M4 内核,主频 72MHz, 芯片内置 64KB flash,8KB SRAM, 两路 I2C 外设。

整体概述

首先感谢极术社区给我试用GD32开发板的机会,让我体验一下近几年国产MCU开发体验。该芯片是基于arm cortex-M4内核,主频72Mhz,flash 64k,ram 8k,以及丰富的外设。

本次试用是一个读取三轴加速度计的实验,主要使用的是硬件iic

硬件连接

传感器介绍

SC7A20 是一款高精度 12bit 数字三轴加速度传感器芯片,内置功能 更丰富,功耗更低,体积更小,测量更精确。

芯片通过 IC²/SPI 接口与 MCU 通信,加速度测量数据以中断方式或 查询方式获取。INT1和INT2中断管脚提供多种内部自动检测的中断信号, 适应多种运动检测场合,中断源包括 6D/4D 方向检测中断信号、自由落体 检测中断信号、睡眠和唤醒检测中断信号、单击和双击检测中断信号。

芯片内置高精度校准模块,对传感器的失调误差和增益误差进行精确补偿。 ±2G、±4G、±8G 和±16G 四种可调整的全量程测量范围,灵活测量外 部加速度,输出数据率 1HZ 和 400HZ 间可选。

软件功能

该软件主要使用了GD32开发板的硬件iic,外部中断以及串口,这三部分功能,串口的配置在其他文章的当中已经有叙述,本文只主要介绍iic和外部中断的使用.

硬件iic

初始化gpio
poYBAGMtgqCAENdTAADYMDp2gJQ927.png

配置硬件iic

pYYBAGMtgrKANlA0AACpU0eW9Ys853.png

根据厂商提供的库函数(具体参考gd32f3x0_i2c.c文件),我们可以很容易的初始化iic。剩下的就是对传感器进行配置了,该传感器需要配置寄存器较多,厂商直接提供了一份demo程序,只需要适配读取写入的接口就可以很快的使用了。

pYYBAGMtgsiAZ6_LAADBYOow3zU754.png

我需要做的就是把iic的读取和写入进行适配适配函数如下:

void I2C_LeaderWrite(uint16_t followerAddress, , uint8_t targetAddress, uint8_t *txBuff,
                     uint8_t numBytes) {
    /* wait until I2C bus is idle */
    while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))
        ;
    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C0);
    /* wait until SBSEND bit is set */
    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))
        ;
    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, followerAddress, I2C_TRANSMITTER);
    /* wait until ADDSEND bit is set */
    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))
        ;
    /* clear ADDSEND bit */
    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
    /* wait until the transmit data buffer is empty */
    while (!i2c_flag_get(I2C0, I2C_FLAG_TBE))
        ;

    for (i = 0; i < numBytes; i++) {
        /* data transmission */
        i2c_data_transmit(I2C0, txBuff[i]);
        /* wait until the TBE bit is set */
        while (!i2c_flag_get(I2C0, I2C_FLAG_TBE))
            ;
    }
    /* send a stop condition to I2C bus */
    i2c_stop_on_bus(I2C0);
    /* wait until stop condition generate */
    while (I2C_CTL0(I2C0) & 0x0200)
        ;
}
void I2C_LeaderRead(uint16_t followerAddress, uint8_t targetAddress, uint8_t *rxBuff,
                    uint8_t numBytes) {
    /* wait until I2C bus is idle */
    while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))
        ;

    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C0);

    /* wait until SBSEND bit is set */
    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))
        ;

    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, followerAddress, I2C_TRANSMITTER);

    /* wait until ADDSEND bit is set */
    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))
        ;

    /* clear the ADDSEND bit */
    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);

    /* wait until the transmit data buffer is empty */
    while (SET != i2c_flag_get(I2C0, I2C_FLAG_TBE))
        ;

    /* enable I2C0*/
    i2c_enable(I2C0);

    /* send the EEPROM's internal address to write to */
    i2c_data_transmit(I2C0, targetAddress);

    /* wait until BTC bit is set */
    while (!i2c_flag_get(I2C0, I2C_FLAG_BTC))
        ;

    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C0);

    /* wait until SBSEND bit is set */
    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))
        ;

    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, followerAddress, I2C_RECEIVER);

    /* wait until ADDSEND bit is set */
    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))
        ;

    /* clear the ADDSEND bit */
    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);

    /* while there is data to be read */
    for (int i = 0; i < numBytes; i++) {
        /* code */

        /* read a data from I2C_DATA */
        rxBuff[i++] = i2c_data_receive(I2C0);
        /* send a stop condition */
        i2c_stop_on_bus(I2C0);
    }

    /* wait until the stop condition is finished */
    while (I2C_CTL0(I2C0) & 0x0200)
        ;

    /* enable acknowledge */
    i2c_ack_config(I2C0, I2C_ACK_ENABLE);

    i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT);
}

然后把这两个函数适配:

poYBAGMtgtqAJ3rOAAB9FKfsQfM576.png

然后对传感器进行设置

poYBAGMtgvyAM0GkAADiuobSYW4011.png

外部中断

使用外部中断可以使用用于唤醒mcu,这对设计低功耗的产品很有意义,当传感器超过设定的阈值的时候,那么就会产生一个中断来通知mcu,需要进一步的处理数据,外部中断的配置如下所示:

void exit_wakeup_interrupt_config(void)
{
     /* configure the priority group */
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);

    /* enable the key wakeup clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_CFGCMP);

    /* configure button pin as input */
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);

    /* enable and set key wakeup EXTI interrupt to the higher priority */
    nvic_irq_enable(EXTI0_1_IRQn, 2U, 0U);

    /* connect key wakeup EXTI line to key GPIO pin */
    syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);

    /* configure key wakeup EXTI line */
    exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_0);
}

数据处理

由于我们使用的是三轴传感器,对于姿态位置的计算并不是很精确,因此,此处只用简单角度计算,倾角的计算原理如下

poYBAGMtgxqAX2ZzAADMRlEI1A4650.png


pYYBAGMtgymATucYAAAfnX5F69k016.png


计算代码如下:

#define DEG_TO_RAD(x) ((x) * 0.01745329252)
#define RAD_TO_DEG(x) ((x) * 57.2957795131)
void angle_calculation() {
    double pitch, roll, paw;
    pitch = atan(xyz_mg[X] / sqrt(pow(xyz_mg[Y], 2) + pow(xyz_mg[Z], 2)));
    roll = atan(xyz_mg[Y] / sqrt(pow(xyz_mg[X], 2) + pow(xyz_mg[Z], 2)));
    paw = atan(sqrt(pow(xyz_mg[X], 2) + pow(xyz_mg[Y], 2)) / xyz_mg[Z]);

    printf("[RAD]pitch:%.2f | roll:%.2f | paw:%.2f rn", pitch, roll, paw);
    printf("[DEG]pitch:%.2f° | roll:%.2f° | paw:%.2f° rn", RAD_TO_DEG(pitch), RAD_TO_DEG(roll),
           RAD_TO_DEG(paw));
}



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17143

    浏览量

    351143
  • 三轴加速度计

    关注

    1

    文章

    29

    浏览量

    13350
  • SRAM控制器
    +关注

    关注

    0

    文章

    11

    浏览量

    5893
  • GD32F3
    +关注

    关注

    0

    文章

    11

    浏览量

    3853
收藏 人收藏

    评论

    相关推荐

    基于加速度计的评估的设计演示

    加速度计是任何需要响应运动或设备方向的便携式或非固定式设备的关键部件 - 不仅仅是游戏控制器和手机,还包括工业机器人和过程控制机械。仅从其数据表中选择加速度计是不够的;你需要在实践中评估它的表现。本文将介绍飞思卡尔和德州仪器公司的两款基于
    的头像 发表于 03-07 08:18 4626次阅读

    加速度计加速度计的使用区别?

    有个问题请教一下:静态测量的情况下,两加速度计测得X、Y
    发表于 12-29 06:06

    请问两加速度计加速度计的使用区别是什么?

    有个问题请教一下:静态测量的情况下,两加速度计测得X、Y
    发表于 08-08 09:12

    加速度计的威廉希尔官方网站 规格详解

    与封装的对齐精度控制约1°以内。(正交)对齐误差:多器件之间的角度与理想角位移(通常为90°)的偏差(参加图2)。 ADI加速度计单片硅
    发表于 10-18 10:47

    2476-100加速度计

    `SDI的高级型号2470和2476高性能MEMS可变电容式加速度计坚固耐用,即插即用适用于各种苛刻要求的测量设备应用程序。两种型号的性能均优于零至中频应用中使用的温度经历大的或
    发表于 05-27 19:18

    2460-010加速度计

    的噪声和长期稳定性是绝对要求。2460包含3英尺长的集成电缆,并且操作与2466相同,它具有一个连接器,可轻松定制电缆的长度和位置。每个SDI
    发表于 05-28 14:41

    基于流行的ADXL335模拟加速度计

    。下图描述了 Arduino 的哪些引脚应连接到加速度计的引脚:使用 Arduino 进行测试,示例程序如下所示。使用这个程序,我们
    发表于 06-22 09:05

    ADXL345 MEMS加速度计开发板的设置和使用方法

    ADXL345 MEMS加速度计开发板。由ADI公司的Nitzan Gadish说明如何设置和使用ADXL345开发板。该能够捕捉3
    的头像 发表于 07-16 06:06 5008次阅读

    digilentPmodACL加速度计介绍

    PmodACL是一个数字加速度计模块,可为主板提供相应的输入。
    的头像 发表于 12-02 11:23 2272次阅读
    digilentPmodACL<b class='flag-5'>三</b><b class='flag-5'>轴</b><b class='flag-5'>加速度计</b>介绍

    UG-242:加速度计评估

    UG-242:加速度计评估
    发表于 03-19 13:26 11次下载
    UG-242:<b class='flag-5'>三</b><b class='flag-5'>轴</b><b class='flag-5'>加速度计</b>评估<b class='flag-5'>板</b>

    ADXL311EB:双加速度计评估

    ADXL311EB:双加速度计评估
    发表于 04-26 15:39 2次下载
    ADXL311EB:双<b class='flag-5'>轴</b><b class='flag-5'>加速度计</b>评估<b class='flag-5'>板</b>

    EVAL-ADXL325Z:加速度计评估

    EVAL-ADXL325Z:加速度计评估
    发表于 05-13 11:29 11次下载
    EVAL-ADXL325Z:<b class='flag-5'>三</b><b class='flag-5'>轴</b><b class='flag-5'>加速度计</b>评估<b class='flag-5'>板</b>

    EVAL-ADXL335Z:加速度计评估

    EVAL-ADXL335Z:加速度计评估
    发表于 05-14 16:26 2次下载
    EVAL-ADXL335Z:<b class='flag-5'>三</b><b class='flag-5'>轴</b><b class='flag-5'>加速度计</b>评估<b class='flag-5'>板</b>

    EVAL-ADXL327Z:加速度计评估

    EVAL-ADXL327Z:加速度计评估
    发表于 05-24 12:31 5次下载
    EVAL-ADXL327Z:<b class='flag-5'>三</b><b class='flag-5'>轴</b><b class='flag-5'>加速度计</b>评估<b class='flag-5'>板</b>

    加速度计、陀螺仪和磁力的应用原理

    加速度计是一种惯性传感器,能够测量物体的比力,即去掉重力后的整体加速度或者单位质量作用的非引力。当
    的头像 发表于 10-09 15:43 7512次阅读