精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教你i.MX RT1052的開源AutoQuad飛控

lPCU_elecfans ? 來源:未知 ? 作者:李倩 ? 2018-08-03 10:08 ? 次閱讀

【背景描述】

AutoQuad是德國的一款老牌開源飛控(硬件閉源),其旨在提供穩(wěn)定、動態(tài)飛行和自動駕駛功能的飛控控制器

由于AutoQuad硬件閉源的特性,國內(nèi)的玩家很少,但AutoQuad 的ukf算法“獨(dú)步天下”,絕對是一絕,我對其垂涎已久。15年時我自己做出了Autoquad的M4版本硬件(基于stm32f405rgt6),可以運(yùn)行官方源碼。

17年時我將Autoquad移植到mdk環(huán)境下并且將其rtos替換為RT-Thread。后續(xù)玩這個玩了蠻久時間,這個版本的AutoQuad有一個問題:由于UKF算法占用了很多cpu資源使得整個系統(tǒng)cpu占用率太高,再者就是片內(nèi)ram資源捉襟見肘。

對于這個版本的AutoQuad目前有挺多模友想繼續(xù)深入的開發(fā),比如網(wǎng)名為“我的世界觀”的網(wǎng)友想將L1自適應(yīng)控制算法加入到其中,但這個L1自適應(yīng)算法也是極耗費(fèi)cpu資源的。在這個背景下我開始著手AutoQuad在imx-rt1052上的實(shí)現(xiàn),以期留出足夠的資源給大家來給模友們深入開發(fā),同時我也借機(jī)熟悉下RT-Thread的3.x版本。

另外參加這個作品征集活動只是這個項(xiàng)目的開始,我后續(xù)會將成果放在github,歡迎大家一起來加入這個項(xiàng)目,繼續(xù)延續(xù)AutoQuad的傳奇。

【所用物料】

主控:

iMX-RT1052DVL6B

傳感器

ICM20602、SPL06、HMC5983

編譯環(huán)境:

WIN10、MDK5.25

RT-Thread 版本:

3.0.4

實(shí)物圖:

硬件板子目前基于野火1052 mini開發(fā)板,傳感器是從馬家買的現(xiàn)成模塊,采用飛線的形式固定在開發(fā)板上(后期會重新設(shè)計(jì)一款小的適合飛控的板子)

主控+傳感器

全部的連接都使用飛線(感謝火哥不殺之恩)

為了上蓋能蓋的下,將底板上的usb座和網(wǎng)絡(luò)接口座去掉了(感謝火哥不殺之恩)

勉強(qiáng)能扣好

【硬件設(shè)計(jì)】

系統(tǒng)框圖

硬件設(shè)計(jì)解析

A、傳感器部分:

各個傳感器接到IMX-RT1052的SPI3上,進(jìn)行分時操作。

B、SBUS輸入

由于SBUS信號是一個反向電平的串口信號,這里使用一個三級管搭了一個簡單的反向電路,從而將信號正確到接入到處理器的串口輸入端。

C、PWM 信號輸出

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

D、GPS

GPS模塊是一個獨(dú)立的單元,通過串口接到主控的串口5上,上圖中的原理圖是我早期時候設(shè)計(jì)的基于Ublox M8N的GPS模塊,這里剛好用到。

【軟件設(shè)計(jì)】

軟件設(shè)計(jì)流程

整個AutoQuad源碼是一個較大的系統(tǒng),我這里抽絲剝繭,將其中的主脈絡(luò)流程貼出來:

關(guān)鍵代碼解析

此版和之前在stm32f405上的版本最大的區(qū)別在于加速度+陀螺儀傳感器、磁力計(jì)、高度計(jì)的數(shù)據(jù)讀取上。原版直接使用spi進(jìn)行驅(qū)動,這個版本我使用了RT-Thread的SPI設(shè)備驅(qū)動框架來進(jìn)行數(shù)據(jù)讀取。

這里將加速度傳感器&陀螺儀驅(qū)動源碼列出來,進(jìn)行一個簡單解析:

1、將總線設(shè)備掛到總線上(配置CS引腳)

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

此段代碼表示將icm20602作為spi3上的第三個設(shè)備和spi總線進(jìn)行關(guān)聯(lián),并使用 GPIO_AD_B1_05 作為其cs引腳(其中64代表 GPIO_AD_B1_05 ,即icm20602的cs引腳是 GPIO_AD_B1_05 )。

2、配置SPI總線相關(guān)參數(shù)

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、對總線的互斥操作

為保證多個設(shè)備對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、讀取加速度和陀螺儀數(shù)據(jù)

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; }

因?yàn)?icm20602_read_buffer 函數(shù)內(nèi)部已經(jīng)加入了互斥,所以讀取時不再需要互斥操作。

RT-Thread 使用情況

1、動態(tài)內(nèi)存管理;

2、GPIO設(shè)備驅(qū)動架構(gòu);

3、RTC設(shè)備驅(qū)動架構(gòu);

4、SPI設(shè)備驅(qū)動架構(gòu);

5、SDIO設(shè)備驅(qū)動架構(gòu);

6、串口設(shè)備驅(qū)動架構(gòu);

7、MSH命令行;

8、FatFs文件系統(tǒng)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2548

    文章

    50740

    瀏覽量

    752142
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4959

    瀏覽量

    97214
  • 自動駕駛
    +關(guān)注

    關(guān)注

    783

    文章

    13694

    瀏覽量

    166166

原文標(biāo)題:一文教你i.MX RT1052的開源AutoQuad飛控——周四RTOS專欄

文章出處:【微信號:elecfans,微信公眾號:電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    凌嵌入式推出i.MX RT1052跨界開發(fā)板

    `2018年8月23日凌嵌入式最新發(fā)布基于NXP i.MX RT1052處理器的核心板FET1052-C與開發(fā)板套件OK1052-C,核心
    發(fā)表于 08-31 15:12

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

    那位大神有沒有野火 I.MX RT1052 上手指南啊?
    發(fā)表于 04-02 06:24

    求正點(diǎn)原子號令者I.MX RT1052的上手指南?

    誰能介紹一下I.MX RT1052 號令者呢?有沒有正點(diǎn)原子 I.MX RT1052 號令者上手指南 啊?
    發(fā)表于 04-02 06:26

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

    芯片i.MX RT1052,主頻高達(dá)600MHz,直接引爆眾多MCU開發(fā)者的神經(jīng)。如今i.MX RT發(fā)布已近三年,陸續(xù)推出了9款型號,細(xì)心的你會發(fā)生其實(shí)際上已經(jīng)衍生為兩大陣營,分別是C
    發(fā)表于 11-04 07:08

    【資料】基于RT-Thread的四軸控項(xiàng)目匯總

    RT1052開源AutoQuadAutoQuad是德國的一款老牌開源
    發(fā)表于 03-28 15:24

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

    尋找為使用外部閃存的 i.MX RT1052 (EVK) 更新固件的解決方案。新文件將在筆式驅(qū)動器中可用,該驅(qū)動器將連接到 EVK 上的 USB 主機(jī)端口。請幫助/建議任何現(xiàn)成的示例代碼來實(shí)現(xiàn)這一點(diǎn)。
    發(fā)表于 04-11 06:40

    I.MX RT1052代碼執(zhí)行在哪里?

    試用的開發(fā)板里有了I.MX RT1052 但是看I.MX RT1052有代碼與數(shù)據(jù)的SPI Flash,還有SRAM,還有片上的TCM 代碼可以執(zhí)行在TCM上么?還是在SRAM上運(yùn)行。
    發(fā)表于 11-09 06:49

    i.MX RT1052的FLex通過FLI_ SPI(4-wire) 接口訪問FPGA時,如何取消中間的閑置部分?

    我使用i.MX RT1052的FLex。 當(dāng)通過 FLI_ SPI(4-wire) 接口訪問 FPGA時, ARM 發(fā)送的寫數(shù)據(jù)顯示在下圖中。 我如何取消中間的閑置部分( 沒有時鐘) ? 或者如何將
    發(fā)表于 11-13 06:04

    i.MX RT1052芯片的核心板,性能和代碼詳細(xì)資料概述

    i.MX RT1052i.MX RT系列芯片,是由 NXP 半導(dǎo)體公司推出的跨界處理器芯片,該系列下又包
    的頭像 發(fā)表于 06-10 10:55 ?2.5w次閱讀

    野火電子基于RT-Thread的i.MX RT1052 EVK Pro板卡特點(diǎn)介紹

    RT-Thread合作伙伴野火電子攜RT-Thread Inside板卡i.MX RT1052 EVK Pro參展NXP技術(shù)日,現(xiàn)場展示了多個基于R
    的頭像 發(fā)表于 07-16 09:44 ?9045次閱讀

    i.MX RT1052對視頻應(yīng)用的支持

    Cortex-M7處理器的核心本質(zhì)為微控制器,卻擁有高達(dá)600MHz的主頻,高密度的512KB TCM SRAM和16MB的高速SDRAM,超快的實(shí)時響應(yīng),超強(qiáng)處理性能賦予了RT1052視頻編解碼
    發(fā)表于 09-22 07:03 ?449次閱讀

    i.MX RT開發(fā)筆記-08 | i.MX RT1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

    系列文章目錄i.MX RT開發(fā)筆記-01 | 初識 i.MX RT1062 跨界MCUi.MX RT
    發(fā)表于 12-01 13:51 ?2次下載
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>開發(fā)筆記-08 | <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

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

    RT-Thread文檔_野火 I.MX RT1052 上手指南
    發(fā)表于 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文檔_正點(diǎn)原子 I.MX RT1052號令者上手指南

    RT-Thread文檔_正點(diǎn)原子 I.MX RT1052 號令者上手指南
    發(fā)表于 02-22 18:26 ?3次下載
    <b class='flag-5'>RT</b>-Thread文檔_正點(diǎn)原子 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT1052</b>號令者上手指南

    i.MX RT的FlexRAM配置問題

    i.MX RT的FlexRAM配置問題
    的頭像 發(fā)表于 10-24 15:46 ?784次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置問題