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

共76条 7/8 |‹ 3 4 5 6 7 8 跳转至
助工
2014-08-17 03:34:08     打赏
61楼
    昨晚上分析了一下匿名四轴与crazyflie四轴的nrf2401的程序,对于没玩过51单片机,更没玩过stm32,只听过I2C,SPI的名称而不知所云何物的人来说,还是有点收获,记录到这里好有个交代,也分享给同样是电子小白的人。

    废话不多说,关于nrf2401的基础知识及配置,可以参考下面的文档(附下载地址:http://pan.baidu.com/s/1hqwyoja )

    里面介绍了SPI的接口函数与nfr2401的配置方法,附带了nfr2401的命令宏和配置寄存器的宏,对nfr2401的理解很有帮助。


下面解读程序:

一、分析匿名四轴的程序。
1、SPI配置与程序接口
这两项在spi.c文件中,该文件只有两个函数,spi1_init()函数负责SPI1端口的配置,Spi_RW(u8 dat)函数提供了程序接口
首先是初始化函数

    配置SPI1的各个端口,其中PA5~PA7是stm32的SPI1的三个主要功能接口SCK、MISO、MOSI,配置了这些接口再启动SPI1后,stm32就会自动通过这三个接口收发数据,不需要用户指定哪个接口做时钟接口,哪个接口做MOSI接口。在PCB上可以看出是这样连接三个端口的。


    同理SPI2的这三个接口是PB13~PB15,下面是crazyflie的PCB连接图,可知该nfr2401接到了stm32的SPI2接口。


    其他的端口CS,CE,IRQ端口依电路图配置。

然后就是Spi_RW函数


被调用的函数位于stm32的spi库函数中。


2、Nfr2401配置与程序接口
    Nrf2401是通过spi端口与mcu通讯,有了上面的spi接口函数,就可以编写nrf的接口函数了。

    上面的两个函数,一个是向一个nfr2401寄存器地址写入1字节的数据,另一个从寄存器中读取一个字节的数据。


    上面的函数,一个是向一个寄存器地址写入pBuf地址处的uchars个字节的数据,这些数据写入寄存器reg;另一个则从寄存器reg读取uchar个字节的数据,保存在pBuf中。


    上面的程序先配置频道P0接收数据地址,发送地址,地址长度
宏定义见头文件里的定义。

    然后向nrf2401写待发送数据,并激发数据发送。


Nrf24l01_Init()函数则是配置NRF参数的,暂不分析。

上面是分析的匿名四轴的程序,下一贴分析crazyflie四轴的程序。


助工
2014-08-17 03:52:21     打赏
62楼

二、分析crazyflie四轴方案的程序。
该方案使用了三个文件,nRF24L01reg.h配置使用到的参数或寄存器地址的宏定义。Nrf24l01.h文件是对Nrf24l01.c文件中函数名的引用。程序实现全部在Nrf24l01.c文件中。
1、SPI程序接口

与匿名四轴基本相同,仅多了一个spiReceiveByte()函数。
2、nrf读写寄存器函数

上面的两个函数是中间函数,主要用到下面的几个函数


读一个寄存器和写一个寄存器,与匿名的程序基本上是一样的。
3、Flush函数

nrf的命令,用于清空接收和发送缓冲区。

4、***



5、中断处理函数


中断服务程序,第二个函数是设置使用哪个回调函数的,eskylink,radiolink等都有各自的回调函数。

6、参数配置函数


7、SPI的端口,中断及参数的配置



匿名的程序把初始化工作放在了SPI1的初始化里,其实是一样的。注意的一点是crazyflie的程序多了中断的处理,这里着重分析一下中断部分。


由PCB版图可知无线的中断接到端口PA9上。


上面是中断初始化,相关的宏定义如下:


GPIO口与EXTI外中断的映像图:


nrf24l01外部中断接到了PA9上,所以*.EXTI_Line = EXTI_Line9。
中断端口配置好后,就要对该中断初始化了,主要配置优先级和中断服务程序等。在nrfInit函数中,第一个调用的函数就是中断初始化函数了,该函数位于exti.c文件中。

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; 这一句要注意,中断线0~4是有独立的IRQ通道,中断线5~9共用一个IRQ通道,10~15共用一个IRQ通道。如下图:




如果采用了用中断线0,则*IRQChannel = EXTI0_IRQn。
中断服务函数:

检查中断是否为无线电的中断,是则调用nrfIsr()函数,操作完毕后,调用EXTI_ClearITPendingBit() 清除中断标置位再退出中断服务函数。
8、中断处理程序

函数释放二进制信号量dataRdy,二进制信号量相关宏或函数:
vSemaphoreCreateBinary  // Macro that creates a Binary semaphore
xSemaphoreTake  // Macro to obtain a semaphore
xSemaphoreGive  // Macro to release a semaphore
xSemaphoreGiveFromISR // Macro to release a semaphore (used from ISR)
这是在中断中的处理,所以用了*GiveFromISR来释放。


总算分析完了,明天移植一下看看。


助工
2014-08-23 01:18:49     打赏
63楼
   今天从系统层面分析了一下匿名四轴的结构,发现匿名四轴设计的还是比较精简的。Main函数如下:

    启动一系列的系统初始化,将需要的配置都启动。查看代码:


    完成初始化之后如何运行下去呢,就要靠定时器产生的中断了,在初始化的第三项,启动了一个时长0.5ms的定时器:


    定时器每0.5ms就会产生一次中断,中断号为TIM3_IRQn:


    有了中断就可以看中断响应函数了:


    该中断响应函数中,有查看Nrf事件的,有取得传感器信息,获取姿态数据的,有控制马达的,有发送数据到遥控器上的,有发送电池电压数据到遥控器上的,等等。
    综合上述可见,该方案将系统的运行建立在中断之上。


助工
2014-09-28 01:24:38     打赏
64楼
设备间通信功能已实现,放在目录连接中了,mark一下

助工
2014-10-12 11:44:25     打赏
65楼

前几天上网找资料,才看到CrazePony的项目,也是一个开源四轴项目,在他们的wiki上对四轴的一些知识总结的不错,看过之后收获颇多,发到这里分享给需要的朋友。为增加论坛人气,连接在最下面需要回复才能查看,还可以下载他们的工程的源码,他们的方案采用了mpu6050的DMP,不需要做数据融合处理了。




——回复可见内容——


菜鸟
2014-11-10 14:54:33     打赏
66楼
还有吟唱的

菜鸟
2014-11-23 13:03:24     打赏
67楼

楼主是神不是平明,STM32代码楼主说的好详细,神人


高工
2014-11-27 12:44:44     打赏
68楼
NB

菜鸟
2014-12-30 12:10:36     打赏
69楼
谢谢,分析的很好

菜鸟
2015-01-11 19:55:14     打赏
70楼
全篇读完收获好多,代码注释很详细,读起来很爽,还有楼主自学能力强,佩服

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

回复

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