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

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

3天内不再提示

教你i.MX RT1052的开源AutoQuad飞控

lPCU_elecfans 来源:未知 作者:李倩 2018-08-03 10:08 次阅读

【背景描述】

AutoQuad是德国的一款老牌开源飞控(硬件闭源),其旨在提供稳定、动态飞行和自动驾驶功能的飞控控制器

由于AutoQuad硬件闭源的特性,国内的玩家很少,但AutoQuad 的ukf算法“独步天下”,绝对是一绝,我对其垂涎已久。15年时我自己做出了Autoquad的M4版本硬件(基于stm32f405rgt6),可以运行官方源码。

17年时我将Autoquad移植到mdk环境下并且将其rtos替换为RT-Thread。后续玩这个玩了蛮久时间,这个版本的AutoQuad有一个问题:由于UKF算法占用了很多cpu资源使得整个系统cpu占用率太高,再者就是片内ram资源捉襟见肘。

对于这个版本的AutoQuad目前有挺多模友想继续深入的开发,比如网名为“我的世界观”的网友想将L1自适应控制算法加入到其中,但这个L1自适应算法也是极耗费cpu资源的。在这个背景下我开始着手AutoQuad在imx-rt1052上的实现,以期留出足够的资源给大家来给模友们深入开发,同时我也借机熟悉下RT-Thread的3.x版本。

另外参加这个作品征集活动只是这个项目的开始,我后续会将成果放在github,欢迎大家一起来加入这个项目,继续延续AutoQuad的传奇。

【所用物料】

主控:

iMX-RT1052DVL6B

传感器

ICM20602、SPL06、HMC5983

编译环境:

WIN10、MDK5.25

RT-Thread 版本:

3.0.4

实物图:

硬件板子目前基于野火1052 mini开发板,传感器是从马家买的现成模块,采用飞线的形式固定在开发板上(后期会重新设计一款小的适合飞控的板子)

主控+传感器

全部的连接都使用飞线(感谢火哥不杀之恩)

为了上盖能盖的下,将底板上的usb座和网络接口座去掉了(感谢火哥不杀之恩)

勉强能扣好

【硬件设计】

系统框图

硬件设计解析

A、传感器部分:

各个传感器接到IMX-RT1052的SPI3上,进行分时操作。

B、SBUS输入

由于SBUS信号是一个反向电平的串口信号,这里使用一个三级管搭了一个简单的反向电路,从而将信号正确到接入到处理器的串口输入端。

C、PWM 信号输出

用于控制ESC的PWM信号,使用主控上PWM1和PWM2中的AB通道,这里3的意思是使用submode3。

D、GPS

GPS模块是一个独立的单元,通过串口接到主控的串口5上,上图中的原理图是我早期时候设计的基于Ublox M8N的GPS模块,这里刚好用到。

【软件设计】

软件设计流程

整个AutoQuad源码是一个较大的系统,我这里抽丝剥茧,将其中的主脉络流程贴出来:

关键代码解析

此版和之前在stm32f405上的版本最大的区别在于加速度+陀螺仪传感器、磁力计、高度计的数据读取上。原版直接使用spi进行驱动,这个版本我使用了RT-Thread的SPI设备驱动框架来进行数据读取。

这里将加速度传感器&陀螺仪驱动源码列出来,进行一个简单解析:

1、将总线设备挂到总线上(配置CS引脚)

rt1050_spi_bus_attach_device("spi3", "spi32", 64);

此段代码表示将icm20602作为spi3上的第三个设备和spi总线进行关联,并使用 GPIO_AD_B1_05 作为其cs引脚(其中64代表 GPIO_AD_B1_05 ,即icm20602的cs引脚是 GPIO_AD_B1_05 )。

2、配置SPI总线相关参数

struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0 and Mode 3 */ cfg.max_hz = MPU6000_SPI_BAUD; /* 1M */ rt_spi_configure(spi_acc_gyro_device->rt_spi_device, &cfg);

3、对总线的互斥操作

为保证多个设备对spi3的互斥使用,需要对icm20602加入互斥锁操作:

static void sensor_lock(struct spi_acc_gyro_device * sensor_device) { rt_mutex_take(sensor_device->lock, RT_WAITING_FOREVER); } static void sensor_unlock(struct spi_acc_gyro_device * sensor_device) { rt_mutex_release(sensor_device->lock); }

4、寄存器的读写操作

static void icm20602_write_reg(uint8_t reg, uint8_t value) { uint8_t send_buffer[2]; send_buffer[0] = reg&0x7f; send_buffer[1] = value; rt_spi_send(spi_acc_gyro_device->rt_spi_device, send_buffer, 2); } static uint8_t icm20602_read_reg(uint8_t reg) { uint8_t rxBuf[2]; uint8_t txBuf[2]; txBuf[0] = reg|0x80; rt_spi_send_then_recv(spi_acc_gyro_device->rt_spi_device, txBuf, 1, rxBuf, 2); return rxBuf[0]; } static uint8_t icm20602_read_buffer(uint8_t reg, uint8_t *buffer, uint16_t len) { uint8_t txBuf[2]; uint8_t rxBuf[20]; sensor_lock(spi_acc_gyro_device); txBuf[0] = reg|0x80; rt_spi_send_then_recv(spi_acc_gyro_device->rt_spi_device, txBuf, 1, rxBuf, len); rt_memcpy(buffer, rxBuf, len); sensor_unlock(spi_acc_gyro_device); return 0; }

5、读取加速度和陀螺仪数据

static uint8_t icm20602_get_accel(int16_t *accel, int16_t *temp) { uint8_t buf[10]; icm20602_read_buffer(ICM20_ACCEL_XOUT_H,buf,8); accel[0] = ((int16_t)buf[0]<<8) + buf[1];    accel[1] = ((int16_t)buf[2]<<8) + buf[3];    accel[2] = ((int16_t)buf[4]<<8) + buf[5];    *temp     = ((int16_t)buf[6]<<8) + buf[7];    //ICM_TRACE("acc0=%d, acc1=%d, acc2=%d ",accel[0],accel[1],accel[2]);    return 0; } static uint8_t icm20602_get_gyro(int16_t *gyro) {    uint8_t buf[8];    icm20602_read_buffer(ICM20_GYRO_XOUT_H,buf,8);    gyro[0] = (buf[0]<<8) + buf[1];    gyro[1] = (buf[2]<<8) + buf[3];    gyro[2] = (buf[4]<<8) + buf[5];    // ICM_TRACE("gyro0=%d, gyro1=%d, gyro2=%d ",gyro[0],gyro[1],gyro[2]);    return 0; }

因为 icm20602_read_buffer 函数内部已经加入了互斥,所以读取时不再需要互斥操作。

RT-Thread 使用情况

1、动态内存管理;

2、GPIO设备驱动架构;

3、RTC设备驱动架构;

4、SPI设备驱动架构;

5、SDIO设备驱动架构;

6、串口设备驱动架构;

7、MSH命令行;

8、FatFs文件系统。

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

    关注

    2522

    文章

    47986

    浏览量

    739712
  • 开发板
    +关注

    关注

    25

    文章

    4403

    浏览量

    93789
  • 自动驾驶
    +关注

    关注

    773

    文章

    13001

    浏览量

    163138

原文标题:一文教你i.MX RT1052的开源AutoQuad飞控——周四RTOS专栏

文章出处:【微信号:elecfans,微信公众号:电子发烧友网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    凌嵌入式推出i.MX RT1052跨界开发板

    `2018年8月23日凌嵌入式最新发布基于NXP i.MX RT1052处理器的核心板FET1052-C与开发板套件OK1052-C,核心
    发表于 08-31 15:12

    凌嵌入式FET1052-C解决方案 实现7.1声道FLAC播放器

    本文介绍了采用凌嵌入式FET1052-C核心板快速的实现7.1声道FLAC播放器。核心板CPU采用i.MX RT1052,具备528MHz的主频,其Arm Cortex-M7核心支持
    发表于 10-23 10:00

    求野火I.MX RT1052上手指南?

    那位大神有没有野火 I.MX RT1052 上手指南啊?
    发表于 04-02 06:24

    求正点原子号令者I.MX RT1052的上手指南?

    谁能介绍一下I.MX RT1052 号令者呢?有没有正点原子 I.MX RT1052 号令者上手指南 啊?
    发表于 04-02 06:26

    恩智浦i.MX RTxxx系列MCU的特性

    芯片i.MX RT1052,主频高达600MHz,直接引爆众多MCU开发者的神经。如今i.MX RT发布已近三年,陆续推出了9款型号,细心的你会发生其实际上已经衍生为两大阵营,分别是C
    发表于 11-04 07:08

    【资料】基于RT-Thread的四轴控项目汇总

    RT1052开源AutoQuadAutoQuad是德国的一款老牌开源
    发表于 03-28 15:24

    i.MX RT1020到i.MX RT1010的迁移手册

    i.MX RT1020到i.MX RT1010的迁移指南
    发表于 12-12 06:25

    i.MX RT1060到i.MX RT1064的迁移手册

    i.MX RT1060到i.MX RT1064的迁移指南
    发表于 12-12 07:21

    如何使用Pendrive通过USB更新i.MX RT1052 EVK上的外部闪存固件?

    寻找为使用外部闪存的 i.MX RT1052 (EVK) 更新固件的解决方案。新文件将在笔式驱动器中可用,该驱动器将连接到 EVK 上的 USB 主机端口。请帮助/建议任何现成的示例代码来实现这一点。
    发表于 04-11 06:40

    I.MX RT1052代码执行在哪里?

    试用的开发板里有了I.MX RT1052 但是看I.MX RT1052有代码与数据的SPI Flash,还有SRAM,还有片上的TCM 代码可以执行在TCM上么?还是在SRAM上运行。
    发表于 11-09 06:49

    i.MX RT1052的FLex通过FLI_ SPI(4-wire) 接口访问FPGA时,如何取消中间的闲置部分?

    我使用i.MX RT1052的FLex。 当通过 FLI_ SPI(4-wire) 接口访问 FPGA时, ARM 发送的写数据显示在下图中。 我如何取消中间的闲置部分( 没有时钟) ? 或者如何将
    发表于 11-13 06:04

    i.MX RT1052芯片的核心板,性能和代码详细资料概述

    i.MX RT1052i.MX RT系列芯片,是由 NXP 半导体公司推出的跨界处理器芯片,该系列下又包
    的头像 发表于 06-10 10:55 2.4w次阅读

    野火电子基于RT-Thread的i.MX RT1052 EVK Pro板卡特点介绍

    RT-Thread合作伙伴野火电子携RT-Thread Inside板卡i.MX RT1052 EVK Pro参展NXP技术日,现场展示了多个基于R
    的头像 发表于 07-16 09:44 8624次阅读

    RT-Thread文档_野火 I.MX RT1052上手指南

    RT-Thread文档_野火 I.MX RT1052 上手指南
    发表于 02-22 18:25 2次下载
    <b class='flag-5'>RT</b>-Thread文档_野火 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT1052</b>上手指南

    RT-Thread文档_正点原子 I.MX RT1052号令者上手指南

    RT-Thread文档_正点原子 I.MX RT1052 号令者上手指南
    发表于 02-22 18:26 3次下载
    <b class='flag-5'>RT</b>-Thread文档_正点原子 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT1052</b>号令者上手指南