马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 payne.pan 于 2015-11-10 16:09 编辑
昨日突然想能否把 MultiWii 移植到arduino-due中, google一下,国外有人做了,翻译如下:
原文:http://technicaladventure.blogspot.com/2014/05/porting-multiwii-to-arduino-due.html GitHub 在 https://github.com/HefnySco/MultiWii_DUE, 请使用 Arduino-1.5.6r2 or later 编译 Due 微控板使用 SAM3X8E ARM Cortex-M3 CPU, 可能是下一代Arduino 主流,使用它作飞控板的好处是:
1) 32位core, 可以进行一个时钟周期可以操作 4bytes数据 2) 84M 主频,而现在arduino 主流是16M 96KB SRAM( Mega 2560是8KB) 512KB Flash memory ( Mega 2560是256KB) 3)有DMA控制其,读取数据不占用CPU
有两个主要问题 1)Due 没有EEPROM , 只能使用外置 Flash memory 来保存数据 2)Due 运行在3.3 v 电压,I/O pins也只能承受3.3V
看这两个问题是如何解决的 1)cmaglie 写了Due上操作Flash的库,直接用它 2)3.3v好像不是个问题 3.3v 足以让电调认为是高电位 RX的5V电压是50Hz的,有间隔,平均电压不足以烧坏Due
为何用MultiWii 1)MultiWii 比较出名,也不那么复杂 2)很多Arduno板子(Pro Mini, Mega 2560) 都支持 MultiWii 3) Arduino 社区或许可以在此基础上做出更强的飞控
步骤 1)定义DUE板子,以便进行条件编译 #if defined (ARDUINO_DUE)2)include <arm/ pgmspace.h> 使用 Flash读取接口 3)定义pins的设置 THR: PIN 62 - A8
ALE: PIN 63 - A9
ELE: PIN 64 - A10
RUD: PIN 65 - A11
AUX1: PIN 66 -DAC0
AUX2: PIN 67 - DAC1
Motor 1: PIN 34
Motor 2: PIN 36
Motor 3: PIN 38
Motor 4 / Servo 4: PIN 40
代码改动 以 MultiWii 2.3为base, 大部分代码都是小改,只有下面3个文件是大改 EEPROM.cpp :使用了cmaglie的 Flash class
RX.cpp: 使用了 Rouan的代码,读取接受机的pwm Output.cpp: 又使用 Rouan的代码,输出pwm Sensors.cpp: 基于原生wire.h库写了Wire_DUE.h,提高效率,原生的I2C也备份了,防止新代码让旧的不work
遇到的问题 1)使用 __CM3_REV 而不是 ARDUINO_ARCH_SAM 检查是否是 DUE 板子,结果出现linker错误,问题bypass了,但没有找到原因 2)大量 cast 在 _getADC() 在sensors.cpp中,因为左移位操作( << )对负数是错误的 3)对齐! 连接WiiGUI, 出现错误,原来是 structue 序列化(protocol.cpp)时候出现的, 32bits的编译器保存数据是4byte对齐;应该使用__attribute__ ((packed)) 让其按实占字节对齐 4)GYRO Hopping ( 陀螺仪数据跳跃) scale = (currentT - previousT) * (GYRO_SCALE * 65536);
发现问题在 使用int32_t 对 bothcurrentT & previousT强制转型后,问题消失了。
|