本帖最后由 xjf_hz 于 2015-5-26 15:44 编辑
本文详细介绍了 Crazyflie和Crazyflie2。转载文本请注明出处(阿莫论坛)和作者xjf(xjf_hz@126.com),由于工作关系写本文的时间比较长,内部有些重复请谅解,本文如果内容错误的地方请与我联系,我会及时订正,再次感谢。
内容较长先上资料。
CF1原理图
CF1源程序
CF2原理图
CF2源程序
CF2_IOS client源程序
CF 安卓源程序
CF client源程序
Crazyflie(以后简称CF)最早开始于2011年由Bitcraze AB的 Arnaud Taffanel Marcus Eliasson和 Tobias Antonsson完成的,最早的版本如图一所示,现在的版本为CF1.0和最新版本的CF2.0图二和图三所示。最早版本(下图一)的CF没有流行,目前用户比较多的是CF1.0(CF2.0为最新版本上市的时间为2014年12月,目前用户还比较少),下面将硬件和软件部分详细介绍CF1.0和CF2.0。
图一 CF最早版本
图二 CF1.0
图三 CF2.0
一、 CF1.0的硬件介绍
上面两个是CF1.0正面和反面电路板图片。主要特点如下:
体积小而轻,大小为9cm(电机到电机距离)和手掌差不多大,重量大约19克。
官方采用的是170mAh锂电池,大约连续飞行7分钟,充电时间20分钟左右。
板上自带一个标准的Mrcio_usb接口可用通过USB线给电池充电。
板载一个Nordic半导体公司的NRF24L01P芯片,与CrazyradioUSB通信,在空旷地带通信距离80米。
板载的微处理器自带bootloader引导程序,可通过无线模块更新固件。
采用ST公司的STM32F103CB 32位ARM处理器,主频72MHz,内部RAM容量20K,FLASH容量128。
采用Invensense公司的MPU6050三轴陀螺仪和三轴加速度传感器。
采用Honeywell公司的HMC5883L三轴磁阻传感器
采用Measurement Specialties公司的MS5611高精度气压传感器芯片。(官方提供的cf1.0有两个版本6DOF和10DOF,这两个版本的区别是6DOF没有焊接HMC5883L和MS5611).
板载一个2×10 1.27mm的孔(需要可以焊接一个排针)外扩展UART SPI IIC和JTAG调试接口。
电路分析
电气系统框图
1. 电源部分:
电池控制芯片采用TI公司的BQ24075,BQ24075开关控制脚SYSOFF有两种控制方式,USB插上时SYSOFF拉低有输出电压,此时对电池充电;另外通过MAX16054接了一个开关,按下开关MAX16054输出反转一次,MCU的一个管脚也接到MAX16054上也可以通过MAX16054自己关闭电源。多说一句的是BQ24075还有BQ24075T,两种芯片完全不同(TS引脚不同)。
BQ24075应用电路
BQ24075T应用电路
CF1.0内部的电源有两路:一路给三个传感器(模拟部分)供电;另一路是MCU通信(数字部分)供电。两路电源的地分别通过0欧姆的电阻接到外部的电池地上。两路的稳压电源是使用TI公司的TPS79301,TPS79301是超低噪声200mA的线性稳压模块,可以通过修改电阻设置输出电压。传感器供电的TPS79301输出电压为2.8V,MCU等供电的电压为2.8V(USB插上充电时为3.3V)。
CF1 电源部分原理图
CF1.0官方版本使用(现在官方更换了)的是Fullriver公司的671723HS25C锂电池。该电池电压3.7V,容量 170mAh 连续放电率25C,重量<5克。官方对电池的说法是测试了100mAH-400mAH的锂电池,发现150mAH到250mAH是最佳飞行性能的容量范围。
2. MCU
CF1.0使用的MCU是ST公司的STM32F103CB,主频72MHz,内部128KFlash和20K ram,CF1.0的程序中使用了FreeRTOS的操作系统,该系统对对Flash和RAM的消耗比较大,目前固件在62K左右的Flash和16K 的RAM(不包括对磁阻传感器的采样处理)。目前的处理能力使用了52%左右。该MCU有足够的空间和运算能力编写更多的算法和一些外部扩展。
3.传感器
CF1.0采用了三颗传感器芯片MPU6050、HMC5883L和MS5611.MPU6050是一个包括了三轴陀螺仪和三轴加速度计的芯片,可以保持CF 稳定飞行。MPU6050、MS5611和MCU采用IIC总线链接,MPU6050外部IIC接到HMC5883L。截至2014年10月为止飞控的算法没有使用HMC5883L。MS5611气压传感器在定高的功能中使用到了。
在开机时软件会检测是否焊接HMC5883L和MS5611只有其中一片焊接就认为是10DOF,可以通过修改固件将HMC5883L去掉。
CF1 传感器部分原理图
4.无线通信部分
通信部分芯片采用Nordic半导体公司的NRF24L01P芯片,该芯片外部使用一个0.5db的天线,可以增加通信距离。nRF24L01P的时钟使用的是MCU输出时钟。
CF1 无线通信部分原理图
5.扩展接口
扩展口位于Crazyflie的左侧,它是一个未焊接排针的10*2针1.27mm间距的过孔。我们是想通过这些过孔来连接上面或者两侧的扩展板。它甚至可以堆叠多个扩展板。
扩展口分为两部分。pin1到pin10是JTAG部分,pin11到pin20是总线/电源部分。UART的RX/TX位于JTAG部分,因为很多基于JTAG的FTDI可以用作串口通讯,这在调试的时候非常方便。
接口描述 接口名字描述
1 VCC 数字电源
2 TMS 测试模式使能
3 EXT_I2C_SCL/TX I2C_SCL 或 UART TX
4 TCK 测试时钟
5 EXT_I2C_SDA/RX I2C_SDA 或UART RX
6 TDO 测试数据输出
7 N/A 未使用
8 TDI 测试数据输入
9 DGND 数字地
10 SNRST 系统复位
11 EXT_SPI_CS/AIN4 SPI 片选或4管脚模拟输入
12 EXT_SPI_MOSI/AIN5 SPI 片上主机输出从机输入或5管脚模拟输入
13 EXT_SPI_SCK/AIN6 SPI 时钟或6管脚模拟输入
14 EXT_SPI_MISO/AIN7 SPI 片上主机输入从机输出或7管脚模拟输入
15 VCC 数字电源
16 VCOM 电池/USB 电源
17 DGND 数字地
18 DGND 数字地
19 AGND 模拟地
20 VCCA 模拟电源
6.电机驱动
CF1 电机驱动原理图
CF1.0使用的有刷电机驱动是一个简单的MOS驱动,如图所示。还有一个续流二极管来分流由电机在PWM工作模式下产生的反电动势尖峰。选择的是NXP公司的SOT-23封装的PMV31XN场效应管,它能很好的处理至少3A的大电流。MOSFET最重要的属性是能够影响电机可用电能的导通电阻(Rdson)。PMV31XN在VGS=2.5V ID =1A 时的导通电阻为44毫欧(最大53毫欧),VGS=4.5V ID =1.5A时的导通电阻约为31毫欧(最大37毫欧)。
这种微型四轴目前多数采用这种空心杯电机,空心杯电机属于有刷电机,驱动的方式是MCU的PWM输出经过MOS管后直接驱动电机,MCU的PWM输出占空比改变时加在电机两端的电压发生变化达到调速的目的。为什么微型四轴不使用无刷电机?无刷电机相比有刷效率高,但无刷驱动需要电调,有刷驱动简单,在微型四轴上现在流行使用空心杯电机。
7.电机和螺旋桨规格
额定电压4.2 V Max
适用电压3.7 V
空载转速45000 ±15% RPM
空载电流80 mA Max
启动电压0.8 V Max
额定负载转速21000 ±15% RPM
额定负载电流810 mA Max
电阻2.3 ±20% Ω
轴径0.8 mm
电机直径6 ± 0.05 mm
电机长度15 mm
质量1.7 g approx.
螺旋桨为46mm 0.8mm的正反桨两对。
二、 CF2的硬件介绍
CF2电气系统图
1.电源部分
CF2电池管理芯片还是BQ24075,和CF1一样的,从电路上看CF2不在使用CF中的开关芯片(美信的这个芯片价格太高了)。CF2也有两路电源输出,一个是NCP702SN30,一个LP2985-30;这个两路输出分别是给NRF51822供电,一个是给MCU等供电。两路的输出电压固定3.0V,为什么使用不同的LDO,从图中上可以看出NRF51822的电源是一直有电的,使用的是低静态功耗的电源调节器。另一路是在通过NRF51822控制的,使用的不是低静态功耗的电源调节器。另外一个SiP32431的开关芯片电源输出到了外部扩展接口上,功能可以给外部的扩展模块(像LED环扩展模块)提供电源。上面提到了给NRF51822部分是一直有点的,相比CF1 CF2的静态功耗会大,建议在不飞的时候将电池拔下,以防止电池过放。电路上当USB线接通时VEN_D置高,VCC部分电源也会有输出,CF2开始工作(没有电池也能工作)。图上是标注了VCC数字电源和VCCA模拟电源之间有一个1uH的磁珠隔离的。VCC给MCU供电,VCCA给传感器供电。
CF2 电源部分原理图
2.MCU
CF2.0使用的MCU是ST公司的STM32F405RG和NRF51822。STM32F405RG内核为Cortex-M4,主频168MHz,内部1MFlash和192K sram 。NRF51822内核Cortex-M0,主频32MHz,128KB Flash 16KB sram。相比CF1.0 CF2.0的系统资源大大提高,更快的MCU,更大的存储空间。用户可以增加自己所需要的一些其他功能。CF2中使用了两颗MCU,NRF51822主要负责无线通信、电源管理和bootloader的辅助功能。STM32F405RG为主控制芯片负责采集和处理传感器信号,飞行姿态控制,电机驱动等等。
3.传感器
CF2采用了MPU9250和LPS25H,MPU9250是一颗集成了三轴陀螺仪、三轴加速度和三轴磁阻的传感器的传感器,相比MPU6050集成度更高,性能更好些。LPS25H是ST公司的一颗气压传感器芯片。在硬件布局上LPS25H放在了电路板底层,可以有效防止螺旋桨在旋转过程中引起气流变化而引起的气压变化。从飞行的稳定性和cfclient上的RPY数据上看CF2更稳定。
CF2传感器部分原理图
4.无线通信部分
CF2无线通信使用了一个Cortex-M0内核的NRF51822,这个芯片功耗低,可以和手机之间蓝牙通信也兼容NRF24L01P这种的2.4G无线通信。CF2中最大的亮点是可以与IOS苹果或安卓系统之间进行蓝牙通信,可以通过蓝牙设备控制CF2的飞行。
CF2无线通信部分原理图
5.扩展口
CF2的外部扩展接口包括VCC(3.0V 100mA)、VCOM(MAX 1A)、1×I2C(400khz)、SPI、2×UART 、4×GPIO、单总线外部扩展识别和2×GPIO(接到NRF51822)。
相比CF1 CF2有两排对外部扩展接口为贴片插座,可以用来固定电池,也能接到外部的扩展板上。
CF2外部扩展口
6.电机驱动
CF2的电机驱动电路和CF1相同使用PMV31XN。
7.电机和螺旋桨参数
额定电压4.2 V Max
适用电压3.7 V
额定负载转速21000 ±15% RPM
额定负载电流1000 mA Max
轴径0.8 mm
电机直径7 ± 0.05 mm
电机长度16 mm
质量2.7 g approx.
8.内部EEPROM
CF2增加了一颗8K的EEPROM,用来存储一些配置信息(8K容量太大了)。
三、 CF和CF2的硬件对比
1.更换更强的MCU,CF2使用了192K的SRAM,CF1的SRAM只有20K,在软件部分CF1没有增加对磁阻传感器的数据处理,如果对磁阻传感器数据和对陀螺仪 加速度传感器采用相同的处理时,20K就不够用了(编译报错),需要修改FreeRTOS的堆栈的大小才能通过编译。
2.更换了无线通信芯片,CF2采用了nRF51822芯片可以兼容以前的nRF24LU1P的通信(和CrazyRadio通信)也能和蓝牙手机通信。CF1可以在PC上安装一个CFClients软件使用游戏手柄控制,也可用安卓手机(需要安装Crazyflie Android client 并使用USBOTG线接一个Crazyradio)控制,无法使用IOS的系统控制;CF2除了上面两种控制方式可以使用安装了Crazyflie iOS client的iPhone或iPad控制。
CF2无线部分还采用了一颗RFX2401C的无线射频放大器,这个芯片可以大大的增加通信的距离,官网数据使用Crazyradio PA可以达到1KM的通信距离。
3.更换更大的电机和电池。CF1使用的是6×14的空心杯电机、170mAh的锂电池,CF2使用了7×16、240mAh的锂电池;CF1的机体重量19克,CF2重量27克。对比看CF2更重些,但是电池容量和电机更大,可以载重了增加了。CF2的外部扩展口更丰富,可以非常方便对外扩展。官方已经推出了LED 和无线qi充电的扩展板,官方网站说明今年还将推出更多的扩展板。由于更大的电池和电机也允许CF2增加更多扩展。
4.电机连接方式更改。CF1的电机是在飞控板上预留了8个孔电机需要焊接,CF2板上预留了四个插座电机直接插上即可。这样做优点:方便组装,不在需要烙铁就能完成。缺点:增加了重量。两相比较还是优点多。
5.编程调试接口对比。CF1预留了JTAG的调试接口,不过也是几个孔,可以和JLINK或ST-LINK2等调试工具连接,但是孔过于小而且是非标准排列,需要使用连接线。CF2有两颗芯片STM32F405和nRF51822,STM32F405的调试接口引出了一个插座可以直接接到调试板上。nRF51822调试稍微复杂,还需要一块小的接口固定到飞控板上。
CF2专用调试板
CF2 nRF51822调试接线图
相比较CF2的调试接线方便许多。
6.传感器比较。CF1使用了三颗传感器芯片MPU6050、HMC5883L和MS5611。CF2使用了两颗传感器芯片 MPU9250和LPS25H。性能上CF2的使用的传感器更高,无论从软件上看到的飞控板的姿态数据还是从飞行的稳定性上CF2都更好些。安装上CF2的气压传感器放在飞控板的底层,这样大大较小了螺旋桨旋转产生的气压波动。CF1官方提供了两种版本6DOF和10DOF ,CF2只有一种版本10DOF。
7.使用阻容感器件比较。CF1采用0603的器件为主,CF2使用0402器件为主。两种比较CF2手工焊接会复杂些。
四、CF开发环境及其相关设置
官方使用的工具
电子CAD相关工具:
KiCad (http://www.kicad-pcb.org/display/KICAD/KiCad+EDA+Software+Suite)
机械CAD相关 工具
FreeCAD(http://sourceforge.net/projects/free-cad/)
相关软件
Eclipse(http://www.eclipse.org/)
Gcc(http://gcc.gnu.org/)
Python(https://www.python.org/)
QT(http://www.qt.io/developers/)
Meld (http://meldmerge.org/)
libUSB (http://www.libusb.org/)
openOCD(http://openocd.org/)
SDCC (http://sdcc.sourceforge.net/)
FreeRTOS (http://www.freertos.org/)
PySDL2 (https://pysdl2.readthedocs.org/en/latest/)
TortoiseHG(http://tortoisehg.bitbucket.org/)
ØMQ(http://zeromq.org/)
Mercurial(http://mercurial.selenic.com/)
Git(http://git-scm.com/)
GitHub(https://www.github.com/)
安装和设置(参考http://blog.sina.com.cn/s/blog_402c071e0102v7ow.html(以下内容全部参考该微博,感谢WalkAnt )和http://www.coolwork.co/forum.php?mod=viewthread&tid=9)
1:下载并安装python2.7。
下载地址:https://www.python.org/downloads/
安装完成后,添加PATH环境变量:C:\Python27(根据自己的安装地址相应修改)
2:安装MSYS
下载地址:http://www.mingw.org/wiki/MSYS/
下载地址:http://downloads.sourceforge.net/mingw/MSYS-1.0.11.exe
安装完成后,添加PATH环境变量:C:\msys\1.0\bin(根据自己的安装地址相应修改)
3:安装MinGW
下载地址:http://sourceforge.net/projects/mingw/files/
下载地址:http://sourceforge.net/projects/ ... wnload?source=files
安装完成后,添加PATH环境变量:c:\MinGW\bin; (根据自己的安装地址相应修改),安装MingGW时,要勾选几个基本包(gcc+,base)之类的就可以了。
4:安装GCC
安装GNU Tools for ARM Embedded Processors,文件名:gcc-arm-none-eabi-4_9-2014q4-20141203-win32.exe
下载地址:https://launchpad.net/gcc-arm-embedded/+download
安装完成后,添加PATH环境变量:C:\Program Files\GNU Tools ARM Embedded\4.8 2014q1\bin(根据自己的安装地址相应修改)
5:JDK
JAVA、ECLIPSE环境的安装,在早前的一篇文章中有介绍:http://blog.sina.com.cn/s/blog_402c071e0102v1r9.html
这里,我还是简单介绍一下:
下载JDK
如果需要获得JDK最新版本,可以到SUN公司的官方网站上进行下载,下载地址为:ttp://java.sun.com/javase/downloads/index.jsp
点击“Download JDK”(在这边只要点击下载JDK,因为安装了JDK,JRE就会被自动安装了),点击“Download”
根据自己所用的计算机的配置在“Platform”中选择不同的平台(Windows操作系统下32位的选择“Windows”;64位的选择“Windows x64”)
选择好平台后,可不需要填写“User Name”和“Password”,直接点击“Continue”
点击“jdk-6u21-windows-i586.exe”下载(之前在“Platform”选择的“Windows”,视具体情况而定)
下载好后,进行安装,建议安装地址无需变更!
2. 配置JDK
1)右击“我的电脑”,选择“属性”打开。
2)点击“高级系统设置”。
3)在“系统属性”窗口中,选择“高级”属性页中的“环境变量”按钮。
4)在“环境变量”窗口中,选择“系统变量”中变量名为“Path”的环境变量,双击该变量。
5)创建系统环境变量;
配置PATH变量:把JDK安装路径中bin目录的绝对路径,添加到Path变量的值中,并使用英文状态下的半角分号和已有的路径进行分隔。例如JDK的安装路径下的bin路径是C:\Program Files\Java\jdk1.6.0_04\bin,则把该路径添加到Path值的起始位置
配置(新建)JAVA_HOME变量:变量名:JAVA_HOME,变量值:C:\Program Files\Java\jdk1.6.0_10
配置(新建)classpath变量:变量名:classpath,变量值: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
6)逐一点击“确定”,退出设置。
6:安装 eclipse
下载eclipse,解压缩。(eclipse是绿色软件,不需要安装)
下载地址:http://www.eclipse.org/downloads/
选择Eclipse IDE for C/C++ Developers文件包下载。
7:配置eclipse,给eclipse安装GUN ARM插件。一定要安装这个插件不然无法调试。
首先下载GNU ARM Eclipse Plug-ins,文件名:ilg.gnuarmeclipse.repository-2.5.1-201412191510.zip
下载地址:http://sourceforge.net/projects/gnuarmeclipse/
配置过程如下:
首先打开eclipse软件,选择【help】菜单中的【install new software】,弹出“Add Repository”对话框,点击【Archive】按钮,弹出文件框,选择刚刚下载的文件“ilg.gnuarmeclipse.repository-2.5.1-201412191510.zip”,就OK了。
OK,到现在为止,就基本完成了。
8:安装git
下载地址:http://www.git-scm.com/downloads
添加PATH环境变量:c:\git\bin
9:安装github
下载地址:
安装完github后,打开Git shell,输入git clone命令下载 Crazyflie代码。
命令示例如下:git clone https://github.com/bitcraze/crazyflie-firmware.git
源代码下载完成后打开eclipse,然后导入相应的代码就可以了。
再次感谢WalkAnt。
五、CF2扩展板介绍
LED Ring expansion board
板子由12个彩色WS2812B的LED和一颗DCDC芯片STBB1组成。原理图很简单,DCDC负责调整LED上的电压,从电阻的配置来看电压为3.8V,12颗LED串联在一起,使用一个IO(STM32F405的PB5)写入LED的颜色即可完成。同时板上还有一对小的LED指示CF2 的“机头”的方向,内部一颗DS28E05的单总线EEPROM,内部写入了该扩展板的信息。CF的LED扩展板有几种显示方式,可以通过CF client修改LED显示的方式。
Qi Wireless charging expansion board
CF QI 扩展是一块可以通过无线给CF2进行充电的板,采用了TI的BQ51013b芯片。原理和结构都较为简单,不再详细介绍了。
六、CF软件介绍
CF的软件较为复杂,采用FreeRTOS操作系统,软件介绍部分按照其启动的顺序简单的介绍每个任务完成了哪些功能。该部分的只介绍CF1的软件和CF2的STM32F405的软件,CF2的nRF51822软件在以后介绍。内容分为以下几块:
1.程序在Flash中的位置。
2. CF1 bootloader介绍。
3. CF2 bootloader介绍。
4. cf1 firmware介绍。
6.1 程序的位置
CF1程序地址分配:
Bootloader程序区 起始地址 0x0800 0000
结束地址 0x0800 27FF
分配的大小 10K
Firmware程序区 起始地址 0x0800 2800
结束地址 0x0801 FFFF
分配的大小 118K
在现在的版本中程序的使用空间bootloader到 0x0800 1A24,约6.54K;firmware的使用量大约50K。CF1使用的STM32F103CBT6的芯片内部Flash128k,如果换成STM32F103C8T6也可以勉强使用,不过需要修改Bootloader的大小,将bootloader改成7K的大小,就可以了。需要修改bootloader的几个地方和Firmware才可以。
CF2程序地址分配:
Bootloader程序区 起始地址 0x0800 0000
结束地址 0x0800 3FFF
分配的大小 16K
Firmware程序区 起始地址 0x0800 4000
结束地址 0x0810 0000
分配的大小 1008K
6.2 CF1 bootloader介绍
CF1 bootloader启动后就进入main主程序,没有做其他的初始化,还是比较习惯这种方式。进入main后的初始化如下:
初始化变量,设置PLL,初始化LED和NRF24L01P,设置FLASH,设置备份寄存器。初始化主要需要说的是PLL,Bootloader的PLL使用内部的震荡,PLL后的频率为64MHz。
接下来进入主循环。主循环的第一件事是确定是否进入firmware程序,在没有收到radio的数据并且10k处的Flash不是空白(FLASH空白时不时0而是0xFF)时将进入firmware程序(执行一次软复位进入)。
接下来比较简单对接收到的radio数据进行拆包处理。
主要bootloader的通信数据包:
Port Data[0] Data[1] 命令
0x0F 0 CF回复一个数据包
0xFF 0xFF Data[1]&0xF0=0xF0 Firmware软复位或
Bootloader软复位
0xFF 0xFF 0x10 CF回复以下信息:
1.pagesize 1024 2. buffer_pages 10 3.Flash_page 128 4. flash_start 10k 5.CPUID 6 .VERSION
0x11 设置NRF24L01P的地址
0x14 填充buffer地址
0x15 读取buffer中的缓存数据
0x1C 读取FLASH
0x18 写入FLASH
6.2 CF2 SMT32F405 bootloader介绍
上电复位后先处理RAM中的数据然后执行systemInit。systemInit中完成了PLL等初始化,然后进入main程序。Main函数:
1)设置两个端口状态:PA4 PC7输入态。
2)读取PA4 和PC7
PA4 =0 PC7=1 启动Firmware此时还需判读0x0080 4000的firmware首地址单元数据是否为空,不为空才启动firmware。
PA4 =0 PC7 =0;nRF51822复位,此时将重启bootloader。
3)再次PLL 、uart和LED端口初始化。UART初始化使用PC6 和PC7并使用PA4做流量控制,uart的波特率1000BPS.
4)进入主循环
收到一个nRF51822的数据包后左侧红色LED闪烁一次,并处理数据包。处理三个LED(LEDR_L LEDG_L LEDB_R)的计数数据,三个LED根据计数数据进行不停的闪烁。 需要处理的数据包如下:
Header Data[0] Data[1] 命令
0xFF 0xFF 0x10 CF回复以下信息: 1.pagesize 1024 2. buffer_pages 10 3.Flash_page 1024 4. flash_start 16k 5 .VERSION
0x12 Get MAPPING
0x14 填充buffer地址
0x15 读取buffer中的缓存数据
0x1C 读取FLASH
0x18 写入FLASH
OTHER 回复一个成功数据包
---------------------------------------------------------------- firmware内容加分割线-----------------------------------------------------------------
6.4 CF1 Firmware介绍
1) systemTask任务
在进入该任务前首先启动PLL,使用 外部16MHz晶振,PLL后的总线频率72MHz,还启动了一个定时器(暂时还不知道定时的作用)。
R1A:systemInit():system任务初始化。初始化需要完成的有创建一个互斥型信号量canStartMutex并设定超时时间;初始化配置数据(应该是读取Flash中的配置数据);workerInit()创建workerQueue队列;初始化ADC,并且启动ADC任务;初始化LED端口,启动软件定时器;pmInit()设置电源管理模块端口,创建PWRMGNT任务。
R1B:uartInit():UART串口初始化(ENABLE_UART),设置端口TXD PB10、RXD PB11,设置串口通信波特率 模式,DMA中断和RX中断,创建UART-RX任务。创建信号量waitUntilSendDone和队列packetDelivery和uartDataDelivery。
R1C:commInit():通信初始化:分为以下几部分:
eskylinkInit(); esky初始化。在前面的说明中提到CF1可以使用crazyradio+pc+游戏手柄+cfclient软件控制,其实除了这种方式外还可以使用ESKY ET6I的遥控器控制,详细设置方式参考官网(https://wiki.bitcraze.io/misc:hacks:et6i?s[]=esky)。初始化中创建EskyLink任务。
radiolinkInit();radio初始化,和esky初始化二选一的编译。初始化中创建RadioLink任务。
crtpInit();创建了两个队列和两个任务CRTP-TX CRTP-RX任务。CRTP含义Crazy RealTime Protocol。
crtpSetLink(uartGetLink());、crtpSetLink(eskylinkGetLink());、crtpSetLink(radiolinkGetLink());设置crtp的操作函数 ,以上三个编译是三选一,功能是设置crtp的操作函数。
crtpserviceInit();注册端口控制块。
memInit();CF1中没用,CF2中使用,以后在介绍。
logInit();初始化日志相关内容,创建log任务。
consoleInit();初始化控制台数据内容。通过DEBUG_PRINT可以发送一些相关的调试信息。
paramInit();初始化参数相关,创建PARM任务。
R1D:发送程序版本、芯片的ID等信息。
R1E:commanderInit();
crtpInit();上面已经执行过一次。注册一个命令控制块。初始化时钟。
R1F:stabilizerInit();
motorsInit();电机控制端口初始化。使用了TIM3 和TIM4 PWM周期140KHz。
imu6Init();对外部9DOF传感器初始化,设置I2C模块,初始化MPU6050和HMC5883L。
sensfusion6Init();什么都没做。
controllerInit();设置PID参数。pidRollRate pidPitchRate pidYawRate pidRoll pidPitch pidYaw 初始化及最大值限制。
创建STABILIZER任务.
R1G: 测试模块
systemTest(); adcTest、ledseqTest、pmTest三个函数直接返回测试的isInit、workerTest 测试workerQueue队列是否创建成功。
commTest();
commanderTest();
stabilizerTest(); motorsTest();四个电机以50%的占空比驱动一下电机(开机电机检测)。imu6Test(); 测试MPU6050、HMC5883L和MS5611。每个传感器的采样值都有范围,不在该范围将报告错误,没有焊接HMC5883L或MS5611将报告该芯片没有焊接。
sensfusion6Test();直接返回测试的isInit
controllerTest();直接返回测试的isInit
R1H:测试结果
通过测试:设置canStartMutex信号量,设置绿色LED(快速闪烁五次),设置红色LED为2Hz闪烁。
无法通过测试:再次调用systemTest 如果仍然无法通过测试红色LED快速闪烁一次(一直执行该状态)。
R1I:workerLoop();从workerQueue队列中接收(读取)数据单元到work地址。将work中的数据发送到workerQueue队列尾。
2)ADCTask任务
启动了ADCDMA,ADC采样采用DMA方式。
ADC任务主循环:队列中接收ADC的采样值,对采样数据进行多次平均处理,对电压的采样值进行IIR滤波处理并将采样值转换成实际电压值。(电压值超范围处理)
3)pmTask任务
获取当前时钟,设置充电状态。
电源管理任务主循环:
获取当前时钟,设置电池低压和电池临界低压的定时计数值。
获取当前电池状态,电池状态改变时,对每种状态LED做相应的指示。(这里除了一个canfly的标志)
对当前每种状态做处理。这个地方做了低电压关闭和飞行连续时间超过5分钟关闭处理。5分钟关闭处理有些奇怪,可以在这个地方屏蔽。
4)UART-RX任务
主循环:
从uartDataDelivery 队列中接收数据.
处理接收标志rxState的每种状态。
5)EskyLink任务
等待配对数据包。读取配对数据包后处理配对数据包。
设置绿色LED快速闪烁5次,初始化配对数据。
主循环:
信号量dataRdy等待未超时:读取数据包,对数据包解码,如果channel‘为找到集训查找通信通道。
信号量dataRdy等待超时:查找通信通道。
6)RadioLink任务
主循环:
设置绿色LED为联机状态,设置信号量dataRdy的超时时间。呼获取当前的时钟。
接收缓存不是空时,读取接收到的数据并清除rxQueue队列。
如需要回复ACK数据将回复该数据。
清除中断标志。
主要RadioLink和EskyLink编译是为二选一的,
7)CRTP-TX任务
主循环:从tmpQueue队列中接收数据到p中成功,发送数据包函数。
8)CRTP-RX任务
主循环:从链路中接收数据包到p,根据数据包的端口发送到不同端口的Queue或者丢弃,并根据不同端口调用不同的回调函数。
9)log任务
创建queues[CRTP_PORT_LOG]队列
主循环:
获取logLock信号量。
处理TOC通道数据。
处理CONTROL通道数据。两个通道如何处理在以后会有详细的说明。
10)PARAM任务
创建queues[CRTP_PORT_PARAM]队列
主循环:
获取logLock信号量。
处理TOC通道数据。
处理READ通道数据。
处理WRITE通道数据。三个通道如何处理在以后会有详细的说明。
11)STABILIZER任务
获取当前的时钟。
主循环:
任务等待2ms执行一次。
读取陀螺仪、加速度和磁阻传感器数据。对读取到的数据做相应的处理(IIR滤波,trim补偿,单位转换)。
获取radio发送的RPY数据(期望欧拉角值)。
获取radio发送的RPY数据类型ANGLE/RATE
sensfusion6UpdateQ 将上面处理过的gry acc数据转换成为四元数,并对其单位化。(程序中最难理解的地方)
sensfusion6GetEulerRPY 将上面单位化的四元数转换成RPY 即为实际欧拉角值。
controllerCorrectAttitudePID 第一次PID,从radio得到的所期望的欧拉角和传感器测量转换的欧拉角进行PID。
stabilizerAltHoldUpdate 高度保持相关,以后介绍高度保持相关内容。
controllerCorrectRatePID 第二PID,gyr.x gyr.y gyr.z和rollRateDesired,pitchRateDesired yawRateDesired 进行PID
controllerGetActuatorOutput 获取执行器的RPY
commanderGetThrust 获取执行器的Thrust
distributePower 计算电机的驱动数据
12)ADC DMA中断
半传输标志时和传输完成时将读取到的ADC数据放到adcQueue队列中。
13)UART DMA中断
14)UART发送接收中断
发送中断标志置位:如果发送数据数量计数器小于发送的数据长度,将发送数据;否则将清除发送中断标设置信号量waitUntilSendDone并关闭发送中断。(简单一句就是没发送完继续发送,发送完停止发送)
接收中断标志置位:读取接收缓存寄存器数据,并放入接收队列中。
15)EXTI外部中断
NRF外部有个中断脚接到MCUEXTI的中断上。Nrf进入中断时清除标志,设置dataRdy标志。
|