原文: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板子,以便进行条件编译
2)include <arm/ pgmspace.h> 使用 Flash读取接口
3)定义pins的设置
代码改动
以 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强制转型后,问题消失了。