
本人对四轴飞行器很感兴趣,所以打算花课余时间自己DIY一个四轴。我是2014年2月16日的样子开始动手的,寒假在家看了一些四轴相关的资料。由于是只四轴小菜鸟,所以只能先参考别人开源的程序,所以帖子中有什么疏漏、不足之处,还希望大家多多指教。我现在的飞控主要参考的是匿名科创的小四开源程序,只是我把它改成了大四的飞控程序,其他的还参考了KK、MWC、WKM的开源程序。之前只拿51、AVR、MSP430单片机做过东西,考虑到ARM单片机刚入门,就选择了入门级的STM32F103系列的单片机作为飞控的主控芯片,打算后期再升级到更高级的系列,比如STM32F4系列的芯片。. ~8 u" E( M& ~2 h4 k 下面上几张调试四轴和PCB板的图片,有图有真相~: ![]() 图1 MINI四轴飞控板 ![]() 图2 STM32F103RBT6最小系统板 ; O: T0 u1 X9 Z' I* w# I![]() 图3 MINI四轴实物 ![]() 图4 室内调试 ; N a0 I/ @2 E9 I, _![]() 图5 室外调试 # j) c& Q+ W# M5 x( G, H% A. F+ `9 l7 e 下面是个人使用了STM32F1系列单片机后的一些感受: STM32F1系列不同型号单片机之间的引脚的兼容性方便了程序的兼容,如果你用的是资源较少的单片机,当你想升级为资源更多的单片机时,很多时候可以只做很少的修改就把程序移植到后者上面,然后再根据你的需求进行扩展,非常方便。 STM32F103RBT6上的资源做一般的应用还是足够了,用起来还算方便,除了有些奇葩的硬件IIC。如果四轴只由MPU6050、接收机(四通道)、电调、NRF2401无线模块、电池电压测量几个部分组成,即采用了一条IIC总线、四路PWM输入、四路PWM输出、一条硬件SPI总线、一路AD,那么STM32F103RBT6的资源是够用的。目前,四轴只用了以上几个部分,已经能在遥控器下比较平稳地飞行。但是,当我加入气压计、磁力计、GPS、超声波测距、液晶等模块时STM32F103系列的单片机就有些吃不消了,也许硬件方面可以采用更多资源的型号,但是STM32F103的72M速度限制了它的处理能力,如果各模块的时间安排得不够高效,很可能不能让整个系统正常地跑起来,即使能勉强运行,速度也是很慢的。当我在基本部分上再加了四路电机测速之后,感觉到NRF2401无线模块向上位机传输数据的速度明显受到了影响,有时数据传输还会中断。 为了解决当前的问题,我打算后期采用STM32F4系列单片机进行制作,同时将采用实时系统来搭建飞控板的软件部分。后面我希望四轴能通过GPS实现定高、定点飞行和自主巡航的功能,当然为了好玩还可以加入比较炫的高难度动作,但是这些功能的实现必须依靠强大的处理器才能够做到。STM32F429/39系列采用最新的180MHz的ARM Cortex-M4处理器内核,可取代当前的基于微控制器和中低端独立数字信号处理器的双片解决方案,或者将两者整合成一个基于标准内核的数字信号控制器。微控制器与数字信号处理器整合还可提高能效,让用户使用支持STM32的强大研发生态系统。STM32F4产品内置意法半导体的自适应实时(ART)加速技术,进一步增强了ARM Cortex-M4内核的处理性能。内置双区闪存的微控制器可实现读写同步操作,有助于保护存储器内容。此外,该系列产品还增加外部高速SDRAM模块接口,从而为客户提供一个经济的外部SRAM存储器选择,这个最新的外存接口还有一个84MHz的32位宽的数据总线。这么强大的MCU应该完全能胜任这些需求,不管是硬件资源还是实时性。 7 o" b* t I0 z 下面是我用定时做输入捕获和PWM输出时遇到的问题:$ A x% ?5 |6 ]% j& i5 u$ X- j5 N (1)某个定时器的捕获中断和定时器中断同时打开,是否可以通过标志位合理的分配各通道的工作?3 I/ M( c. l+ q C (2)定时器1的CH3和CH4无捕获,还不断的进入中断,中断函数是正确的,不知初始化设置时哪里出了问题,程序如下:+ x9 H K4 O5 q' [0 q# ^4 v. n, j 采用的芯片是STM32F103RBT6。1 q8 X) o2 F) B$ X4 N" u( L0 V void Tim1_Pwm_In_Speed_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;+ l# v& |: f7 r6 @- w u& a% c TIM_ICInitTypeDef TIM_ICInitStructure;; o& _ u {7 o& z" d5 }: J, ?" e GPIO_InitTypeDef GPIO_InitStructure; * a+ l; C" l: B RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);) [6 O7 f0 V# [ # w+ h' o4 M4 U% P2 p* K/ Y GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;' ^$ Q6 u) r! [5 R GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; T7 i3 _7 V( C GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); X5 |. S5 b4 s7 ~$ f$ } TIM_DeInit(TIM1);# j- J! p0 n7 p" l, X7 K4 M TIM_TimeBaseStructure.TIM_Period = 0xffff; 5 A3 Z' C3 k: i5 c CLK = 72000000/TIM_Prescaler t0 H5 D9 a0 Z* a/ S* W4 F/ j0 \ TIM_TimeBaseStructure.TIM_Prescaler=179; TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; * x) i& x4 z. m1 k, ], i TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter=0x0;/ |4 E6 k4 q6 `! x4 a TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);: O4 T8 }: g/ G" b: }) D4 B& p TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; 3 M2 g& g% x8 Z) _- A8 o TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(TIM1, &TIM_ICInitStructure); & g! G* @. O, h: @ TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; , x) W$ n* f) c4 g* ^& O4 b TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; 6 Y! n2 D+ l. A: G/ i" H5 i TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; 7 h8 d! y+ n" _- w4 x& J/ M8 j3 z TIM_ICInitStructure.TIM_ICFilter = 0x0; ) T6 c' C/ ]) g: W TIM_PWMIConfig(TIM1, &TIM_ICInitStructure); 7 C d& @: D9 ^9 k TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;8 o, B4 B4 U, S y/ v* ?% r //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; + g4 v0 q8 a; }2 x2 v TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; : u1 c+ [, a' R TIM_PWMIConfig(TIM1, &TIM_ICInitStructure); $ r# N1 o$ o4 [. x) @5 K- Q; s /*TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; 9 r2 g. F3 n K+ n; C1 w TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÉÏÉýÑØ²¶»ñ TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;! s" V& I( C5 ^ TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(TIM1, &TIM_ICInitStructure); TIM_ClearFlag(TIM1, TIM_FLAG_Update);6 U0 H3 U# e; F4 e5 M/ U 2 \8 Z+ u9 Z" I, } /* Enable the CC1 Interrupt Request */ TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);' s0 w& r4 `$ a8 u TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE); TIM_ITConfig(TIM1, TIM_IT_CC3, ENABLE);: ~. U8 Q* w! p TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE); /* TIM enable counter */9 A2 n9 }8 h5 Z$ b% `: a; S TIM_Cmd(TIM1, ENABLE);+ ?4 \# C! G$ [ }3 ]+ Q2 E: S# ~: Y4 B, N3 m PS:由于我最近才无意中看到了与非网上派发100块STM32F429探索套件的活动,希望能赶上这趟末班车。由于时间比较紧,所以写得比较匆忙,比较乱。后面不管有没有申请到探索套件 ,我都会积极与大家一起交流、学习。这差不多是我第一次在论坛上发帖,不足之处,请大家多多指出。 * B% E' L& G1 b* d& F ------------------------------- TNE END~ ~-------------------------------- ![]() ![]() |
RE:【STM32F429心得\疑问】使用STM32F103系列单片机后的一些感受
回复:【STM32F429心得\疑问】使用STM32F103系列单片机后的一些感受
RE:【STM32F429心得\疑问】使用STM32F103系列单片机后的一些感受
RE:【STM32F429心得\疑问】使用STM32F103系列单片机后的一些感受