把 MultiWii 移植到arduino-due中

原文: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强制转型后,问题消失了。







你可能感兴趣的:(arduino)