这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【i646593001】QuadCopter DIY进程帖

共76条 6/8 |‹ 3 4 5 6 7 8 跳转至
助工
2014-07-09 22:30:45     打赏
51楼
你看的很仔细,这个地方确实是我弄错了。编程者的目的其实是求各个数据与平均数之差的平方的和,不妨将IMU_NBR_OF_BIAS_SAMPLES赋值128,我再分析一下,由于恢复帖发不了图片,我发到下一贴了。

助工
2014-07-09 22:37:26     打赏
52楼

再此致谢。


菜鸟
2014-07-15 14:57:55     打赏
53楼
楼主厉害 ,fighting,相信过不久我能看通透!另,谢谢楼主还有各位大牛的无私传授,不甚感激。

工程师
2014-07-22 06:52:29     打赏
54楼
COOL!加入精华贴,楼主花了不少的时间,值得表章,希望能坚持到底,加油!

菜鸟
2014-08-12 17:09:40     打赏
55楼

你是怎么下载FreeRTOSv8.0.1.exe的。我用自由门也不行

。。。。。。。。。。。。。。。


助工
2014-08-12 20:51:01     打赏
56楼

http://jaist.dl.sourceforge.net/project/freertos/FreeRTOS/V8.0.1/FreeRTOSv8.0.1.exe

你试试。


助工
2014-08-12 20:54:20     打赏
57楼
想不到加精了,给自己放了个暑假,歇了段时间。为了对得起观众,接着往下做做吧

助工
2014-08-15 00:12:16     打赏
58楼

分析crazyflie四轴方案的通信模块

crazyflie的通信模块比较复杂,下面分成几贴分别讨论。


Crazyflie的通信分成几个层次,下面从通信模块的代码comm.c讨论。

 

comm文件只有两个函数,一个是commInit函数,一个是commTest函数,分别负责通信的初始化和测试工作。初始化后(commInit)即实现了两个设备的通信连接,测试函数则用于测试该模块。既然commInit函数实现飞行器与遥控器的通信,我们只需要分析这个函数即可。

Code见下图

下面对每个函数分别讨论。


一、radiolinkInit()

关于esky协议,

http://www.deviationtx.com/forum/protocol-development/1059-esky-protocol?q=/forum/protocol-development/1059-esky-protocol 和 

http://sourceforge.net/p/arduinorclib/wiki/Esky%20Radio/ 两个网站有描述,不详细分析了,程序中仅仅将eskylink作为实验测试代码。

分析radiolinkInit()函数,该函数位于radiolink.c文件中。

 

分析函数:

1、nrfInit()

    实现端口配置,中断配置,spi配置等

2、nrfSetInterruptCallback()

    配置中断回调函数为radiolink的中断回调函数

3、创建信号量dataRdy和队列rxQueuetxQueue

    QueueTask属于操作系统的概念,程序是在freeRTOS系统的环境下运行的,第5步的任务中使用。

4、初始化NRF24L01P


配置无线电参数,频道,数据速率,地址,模式...

5、创建radiolinkTask任务。

任务内容:

 

任务很清晰,不停的接收信息到rxQueue,并从txQueue取得数据包发送出去。至于从消息队列到程序员接口的操作,如下图所示:

 

发送数据包的时候,只需要sendPacket函数将数据包pk发送到txQueue,之后radiolinkTask就会自动发送出去;接收数据包的时候,则是radiolinkTask 自动从radio中接收到的数据放入rxQueuereceivePacket函数从rxQueue中接收数据到pk中。sendPacketreceivePacketsetEnable三个函数共同组成了radio的操作,如下图:

 

这个函数结构体通过函数

 

返回函数指针。




助工
2014-08-15 00:25:39     打赏
59楼
二、crtpInit()

该函数位于crtp.c文件中,该文件与crtp.h文件,共同定义了crtp ( Crazy Realtime Transfer Protocol )

 

 

该函数创建了两个队列tmpQueuerxQueue,并创建了两个任务crtpTxTaskcrtpRxTask。来看看两个任务都做了什么。

 

crtpTxTask任务在从tmpQueue中接收到数据包到p的地址后,调用sendPacket函数发送出去(该函数就是comm.c里面的sendPacket函数)

 

    该crtpRxTask任务从链路中接收数据包到p,根据数据包的端口发送到不同端口的Queue或者丢弃,并根据不同端口调用不同的回调函数。

comm.c一样,crtp.c提供了程序员接口函数:

 

 

    crtpSendPacket函数将数据包发送到tmpQueue中,然后通过crtpTxTask任务发送出去。crtpRxTask将接收到的数据包按端口分发到不同的queue中,crtpReceivePacket函数按端口接收队列中的数据到数据包p中。


 

三、crtpSetLink(radiolinkGetLink())

该函数位于crtp.c中

 

设置crtp的操作函数,该函数的参数radiolinkGetLink()在第一部分分析radiolinkInit()最后提到过,而设置的变量 link 恰恰是crtpRxTask和crtpTxTask里面的link了。


四、crtpserviceInit()

    该服务控制接收端在收到数据包后是否将该数据包发送回去,感兴趣的读者自己去分析。


五、logInit()

    该函数位于log.c文件中,动态log系统信息。Crtp数据包有一个日志端口CRTP_PORT_LOG,在四轴中不是必需的,这里也不分析了。


六、consoleInit()

该函数位于console.c文件中,文件中函数不多,可以全拿来分析

 

初始化函数重置了消息包的长度,设置crtp的端口为CRTP_PORT_CONSOLE,创建一个消息发送函数consoleSendMessage()

 

consolePutchar函数将字符加入消息数据包,在字符为’ ’或消息包达到最大长度时发送出去。

consolePuts函数...

consoleFlush函数强制发送数据包。

本程序提供了发送字符串的程序接口。


七、paramInit()

该函数位于param.c文件中,看了个大概,没全看明白,有明白的来看看。

 

总算凑合着看完了crazyflie四轴的通信模块,洋鬼子做出来的东西还是不错的。




助工
2014-08-15 00:51:00     打赏
60楼

把上面两贴中用到的代码文件附在这里了,想详细看代码的拿去。

crazyflie-communication.zip



共76条 6/8 |‹ 3 4 5 6 7 8 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]