电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 深海的QuadCopter DIY进程帖-------更新NRF

共22条 1/3 1 2 3 跳转至

深海的QuadCopter DIY进程帖-------更新NRF

助工
2014-04-15 00:14:40    评分

1875354523 -深海- 编号:080

一、准备部分

1、申请,下单----------------------------------------------------------------------------------点我跳转

2、焊接安装,其实也没几个地方要焊的结果把电机给焊错了。。。附图-------点击查看

3、试飞视频-


二、基础部分

1. STM32芯片开发环境的建
2.LED指示灯实验
3.UART串口通讯实验
4.PWM电机驱动实验

  4.1     用KEIL进行PWM仿真

  4.2  小插曲---串口出问题了,搞了好多天-------------------------------点击跳转

 5.NRF无线通讯实验

6.传感器驱动实验




助工
2014-04-15 00:19:31    评分
2楼

申请的原地址,标记一下吧~~http://forum.eepw.com.cn/thread/248966/1/#2

寄过来寄了好几天。。。


院士
2014-04-15 09:36:21    评分
3楼
对,这个跳转就是这么玩儿

助工
2014-04-15 23:56:21    评分
4楼

焊接安装篇

等了n天,包裹终于到手了

各种元件模块。。


由于怕焊错,还特地逛了一天的论坛,注意到 “让四轴飞QuadCopter DIY进程帖中提到,电机下面的垫子会掉,就直接拿502给粘死了

结果一不小心就把4个电机的顺序给搞错了坑爹啊,亏我在公司还那么小心的焊了那么久,还好电机是用热熔胶粘的,不然就彻底杯具了。电机焊错了会有几个现象,我的是可以飞起来,但是一直旋转,还好有烈火大神的指点,不然我还发现不了电机焊错了

这里也展示一下吧,算是个反面教材了,后面的各位要小心点了,可以用电机线的颜色进行区分


由于宿舍没有烙铁,第二天去公司才换过来(宿舍是不是也因该配一套设备了呢)。

回来发现有个电机的MOS管挂了,电机一直转 关了开关也不行,非要拔电池才行。第二天去公司才能换。。。。宿舍没装备好麻烦啊!

看原理图 MOS管型号是AO3402,手上没有这个管就把Q6的MOS管换过去,然后在Q6拿了装了个2302,OK问题解决!


整个焊接过程挺简单的,有航友说那个usb口难焊,其实把烙铁温度调高点一下就焊上了


试飞的视频也拍了,就是飞的太烂,估计大家也能想象到新手开飞机会是怎么样的,看什么时候再截一小段上传上来混点积分吧

更多的图片可以到我空间看



编辑帖子真心费时间。。。。。


助工
2014-04-15 23:58:16    评分
5楼
网上查了很久才会弄的

专家
2014-04-16 21:07:29    评分
6楼

期待楼主更新帖子了~~

四轴飞行器也要慢慢来啊~~


助工
2014-04-19 10:00:17    评分
7楼
接下来是基础实验部分

助工
2014-04-19 10:10:16    评分
8楼


基础实验

去ST的官网下载STM32最新V3.61的函数库,写流水灯和串口居然写了两天。。其实主要还是对KEIL编译器不怎么熟悉
1、那几个要用的软件以前装有,这里就不介绍了,相信能看到本帖的,这些都不是什么问题都不是问题,实在不懂的话就回帖吧,好-----进入下一步
2、到ST官网去下载STM最新的函数库,当然用旧的也行。然后用刚下载好的函数库建立工程,这个就费点事了,怎么建立我也说不清楚,按照这个文档一步步来吧,想偷懒的话可以直接用我的模板
3、敲程序前还要下载一份资料:“STM32固件库使用手册的中文翻译版”,百度就有很好找的
4、下面是闪灯的实验,按照手册上的介绍先调用一下初始化函数,然后就和51差不多了,值得注意的是延时要大一点,延时大概要500000吧,这就是51跟STM的最大差别了吧~~~呵呵~~~~
5、串口实验懒得写了,直接从以前的工程里面copy了一份,结果死活不能用,搞了一个晚上还是没头绪,难道是新的函数库跟以前不一样了?于是把函数库换回3.5版本的,还是不行,然后就是对比代码,一行行的看,看得眼都花了也没发现有什么问题。难道是工程建立出错了,接着对比KEIL的设置。。。。。。。终于发现问题了原来是这里。。。。。。

microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。 
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()。 

说简单点就是用printf函数将数据从串口输出的时候,就把这个勾上吧!!



工程模板

STM32V3.4固件库使用方法


 


专家
2014-04-19 10:27:40    评分
9楼

楼主 stm32f的固件库从3.5版本到3.6版本还是很大的不同,提供了一些新的解决思路。

在移植的过程需要注意。



助工
2014-04-20 11:21:23    评分
10楼

基础实验


PWM电机驱动实验

飞控板上的电机是接到TIM2上的四个PWM通道上的,STM32一个定时器就可以输出4路频率和占空比都不同的PWM,因为4个电机是一起的,还是把频率都设置成一样的吧


顺便把频率都试了一下,发现在占空比相同时,在不同的频率下电机的转速都不太一样,频率越高转速越低,当然我没有拿专业的仪器测过,只是把1K,10K,100K频率都试了一下,发现1KHz时螺旋桨产生的升力明显比其他的大,网上看到网友说PWM控制电机的频率不能太低,然后在试了一下2K,5K的情况,于是决定把驱动的频率定在了2KHz。这里只是个人的看法,不对之处还要请大神指出啊。。。。。。。


下面提供KEIL的逻辑分析仪仿真教程,不想下到板子的话直接仿真就好,还可以看到波形频率

特别提醒,如果是直接下到飞控板上的话,一定要先用手抓紧板子,别被螺旋桨打到手了,板子用下载线供电就足够供电机了,不要以为把开关关了就没事了


void TIM2_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);		
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	TIM_InternalClockConfig(TIM2);//设置TIMx内部时钟
	
	TIM_TimeBaseStructure.TIM_Prescaler = 35;//预分频值
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
	TIM_TimeBaseStructure.TIM_Period = 1000;//在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 1;//重复计数值
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化
//					T 		=  1/(72M/TIM_Prescaler+1)= 1/(72M/36)= 0.5uS
//					频率	= TIM_Period * T	= 1000*0.5uS = 500ms -> 2kHz
//					占空比	= TIM_Pulse / TIM_Period   = 200/1000 =0.2= 20%
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//失能
	TIM_OCInitStructure.TIM_Pulse = 200;//脉冲宽度,由这个设置占空比
//	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//高电平有效
//	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//高电平有效
//	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//低电平
//	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//低电平
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);//初始化

	TIM_OCInitStructure.TIM_Pulse = 400;//脉冲宽度,由这个设置占空比
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);//初始化
	TIM_OCInitStructure.TIM_Pulse = 600;//脉冲宽度,由这个设置占空比
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);//初始化
	TIM_OCInitStructure.TIM_Pulse = 800;//脉冲宽度,由这个设置占空比
	TIM_OC4Init(TIM2,&TIM_OCInitStructure);//初始化

	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或失能TIM外设预装载寄存器在CCR1
	TIM_ARRPreloadConfig(TIM2, ENABLE);//使能或者失能TIMx在ARR上的预装载寄存器	
	TIM_Cmd(TIM2, ENABLE);//使能或者失能TIMx外设	
	TIM_CtrlPWMOutputs(TIM2, ENABLE);//使能或失能TIM外设的主输出
}					  
void set_PWM(uint16_t PWM1,uint16_t PWM2,uint16_t PWM3,uint16_t PWM4)	
{
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCInitStructure.TIM_Pulse = PWM1;//脉冲宽度,由这个设置占空比
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);//初始化	
	TIM_OCInitStructure.TIM_Pulse = PWM2;//脉冲宽度,由这个设置占空比
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);//初始化
	TIM_OCInitStructure.TIM_Pulse = PWM3;//脉冲宽度,由这个设置占空比
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);//初始化
	TIM_OCInitStructure.TIM_Pulse = PWM4;//脉冲宽度,由这个设置占空比
	TIM_OC4Init(TIM2,&TIM_OCInitStructure);//初始化		
}

 





共22条 1/3 1 2 3 跳转至

回复

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