这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » wx风筝智能车DIY进程贴

共12条 1/2 1 2 跳转至

wx风筝智能车DIY进程贴

助工
2015-05-27 11:05:41     打赏



关键词: 进程    

助工
2015-05-27 11:42:45     打赏
2楼

一、前期知识储备

(1)卡尔曼滤波学习笔记

卡尔曼滤波一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。在许多领域都得到运用,对导航,控制,传感器数据处理发挥着重要作用。在此我奉献上我搜集到的通俗易懂的学习资料,并非本人原创,供大家学习参考。卡尔曼滤波器通俗讲解.pdf

(2)PID学习笔记

PID 控制是自动化控制领域应用非常广的控制方式,P 代表比例,I 代表积分,D 代表微分,从这些名词中可以看出,PID 控制是基于数学中一项重要的分支:微积分学为基础的数字化自动控制方式,它以传感器采集的数据作为输入源,按预定的 PID 参数根据特定的公式计算以后输出控制。让大家更通俗的去理解PID,我在此贴出来我玩四轴飞行器时搜集到的一篇PID通俗理解方式。【高数基础也能很好的理解PID】

举个形象的例子,一列即将到站的火车在快要到达站点的时候会切断输出动力,让其凭借惯性滑行到月台位置。假如设置火车以 100km/h 的速度在站前 1km 的地方切断动力开始滑行,那么这个 100 比 1 就是比例 P 的含义,P 越大,它在站前开始滑行的速度越快。滑行初始速度快的好处就是进站快,但过快的初始滑行速度会导致火车在惯性的作用下冲过月台,这样一来火车不得不进行倒车,但是因为 P 设置过大,倒车以后的滑行也会同样使火车倒过头了,这样一来,就形成了一种反复前行后退的震荡局面。而 P 设置小了,进站速度会变得非常缓慢,进站时间延长。所以设置一个合适的 P 值是 PID 调节的首要任务。 由于 P 是一个固定的数值,如果将火车的速度与月台的距离用一个坐标图理想化的表现出来的话,不考虑惯性及外力的作用,这两者的关系呈现出来 P 调节的结果会是一条直斜线,斜线越陡,代表进站时间越短。  不管怎样,如果只有 P 调节,火车要么设置一个比较低的 P 值以非常缓慢的速度到达目标月台,要么就是过冲了,很难设置在速度与准确度之间求得平衡。
所以接下来该是讲解 D 微分的作用的时候了。根据上面举的例子,假如 P 等于 100 的时候,火车刚好能滑行到月台,所耗费的时间是 10 分钟。但是对应一个自稳定性能要求很高的自动化系统来说,这 10 分钟的时间太长了,可不可以加快呢?可以,我们把 P 加大到 120,让火车司机驾驶火车在站前 1km 的地方以 120km/h 的速度开始减速滑行,然后站前 500 米的时候踩一下刹车让速度降为 80km/h,站前 300 米再踩一下刹车让速度降为 50km/h,站前 100 米又踩一下刹车,让速度降为 20km/h,站前 10 米让火车在较短的时间内滑行到月台准确的位置,这样一来,进站速度会大大加快,原来需要 10 分钟的时间可能只需要 5 分钟就行了。这就是 D 的作用,我们权且把 D 理解为刹车吧,如果仍旧以坐标图形象表达 D 对 P 调节的影响,那就是 D 使 P 调节出来的一条直线变成了一条曲线,在 PID 公式中,D 的左右就是改变 P 的曲线,D 的数值越大,对 P 的影响也越大。加入 D 后的曲线前期较陡,进站比较快,后期平缓,使得火车可以平稳准确的进站。
相信经此解释后,很多模友已经理解 PD 的作用了,那在飞行器的实际调节中,我们就可以有的放矢了。

根据 PD 的这个关系,我们可以得出一个调节步骤:先把 D 置零,加大 P值,使飞行器适当过冲开始震荡,然后增加 D 的数值,拉低 P 调节后期的作用,使过冲现象放缓,最终调到不过冲为止。P 越大,飞行器倾斜后恢复的速度越快,表现为越灵敏,但过大会产生震荡;D 越大,调节越平缓,表现为越平稳,但 D 过大会使调节时间延长,表现为反映迟钝(这里的 D 指的就是 D 的数值,在一般的 PID 表述中,D 越接近 0,P 作用越大,这点需要注意一下)。
最后讲解 I 的作用,I 是积分,是为了消除误差而加入的参数,假如上面的例子中,火车靠站以后,离最终的目标停止线还是差了 1 米,我们虽然也可以认为这是一次合格的停车,但这毕竟是误差,如果我们认可了这 1 米的误差,那在此基础上火车第二次靠站就会有 2米的误差了,如此以往,误差会越来越大,所以我们要把这个误差记录下来,当第二次进站的时候就可以发挥作用了,如果差了 1 米,火车驾驶员就可以在原来的 PD 调节基础上进行I 积分,延迟 1 米输出(或者提前),即 999 米开始减速,最终可以刚刚好到达停止线。
如果没有 I 的作用,在多轴飞行器平台上的表现就是飞行器越来越倾斜,最终失去平衡。I 的调节是建立在 PD 的基础上的,PD 的改变都会影响 I 的效果,所以最终的调节步骤就是先调 P 确立灵敏度,接着调节 D 调整平稳度,最后调节 I 确定精度。



高工
2015-05-27 13:29:33     打赏
3楼

资料不错,赞一个


菜鸟
2015-05-27 16:15:17     打赏
4楼
谢谢分享,赞一个

助工
2015-05-29 23:00:58     打赏
5楼

二、组装、测试

买的套件今天才到,然后我迫不及待的开始了组装测试。在此分享一下我今天组装测试的心得。

(1)首先开箱验货;

拆箱结果挺满意,各部分分开包装的,并且包装的相当严实。

由于本人有飞控的平衡充故没买平衡充。如果大家想用螺丝固定OLED建议跟客服说一下让他多送一个小螺丝(有没有这个螺丝不影响OLED的安装)。默认是四个小螺丝用于固定亚克力板。

(2)现在开始组装;

首先安装铜柱,然后防止电池。

注意:下图选用的铜柱有问题,应该选用两头都是螺母的铜柱,否则控制板没法安装。我一开始没注意这个问题然后安装了一半就出问题了。(刚刚看了一下卖家提供的文档,发现自己没有认真阅读,我该处犯的错误,卖家已经重点强调了,在此也提醒大家认真阅读卖家提供的资料)

下图铜柱安装正确,电池我反复放置了好多次,最终决定有标签的一面朝上。其余均很汗让T头插在控制板(控制板T头在电池供电母头正上方)。

焊接好的OLED如下图。

用剩下的四个带螺丝的铜柱固定控制板,先对准控,可能不太好对准。先把四个铜柱都轻轻拧上。最后再把每一个拧紧,即可很好的固定控制板了。然后插上OLED.

安装亚克力板,没什么太多需要注意的。撕掉包装纸,上紧螺丝即可。

不知道是我用力过大还是,SWD底座质量不好,我插3P线时发现把底座掰起来了 ,我只好按下去,但依然还原不了。

故我又滴了一些胶水进去加固一下,防止下次弄坏了。

在此提醒大家安装的时候注意一下,如果可行的话,在一开始安装时就滴点胶水固定一下防止意外掰动了。这样更牢固。

插上两个轮子和两个电机的控制线,然后组装就基本完事。可以进行测试。

(3)现在上电进行测试



视频地址:http://www.tudou.com/v/6JzL2VVOvDQ/&bid=05&rpid=367616043&resourceId=367616043_05_05_99/v.swf

通过测试可以得出,提供代码,在不增加负重情况下平衡性能较好。在增加较高较重物体时,平衡会受到极大的挑战。因此后期在完成基本要求的情况下,尽可能的完善算法。最总实现平稳的端起一杯水或者托起一个滚动的圆柱体。


助工
2015-06-01 20:18:43     打赏
6楼

三、JLINK程序下载

该平衡车官方推荐的两种下载方式是串口下载和ST-link下载。但由于我手上没有ST-link,只有J-Link下载器。因此我选用了JLINK下载。但是下载时碰到了一些小问题,摸索了下午才把程序下载进去。我在这里分享给大家吧。

首先说明一下我用的编译器是MDK5。

在下载之前要先配置一下:

点击魔术棒出现如下对话框

首先在Device界面下把芯片型号选为对应的stm32f103c8,我打开工程默认的是stm32f103zet6。该界面写其余不用修改。然后点击Debug出现如下界面

选中Use,然后在Use后面的方框中选中JLINK选项,然后再点击Settings出现如下对窗口

该界面的设置和ST-link的设置差不多,在Port下面的方框中选中SW即为SWD的意思。

然后点击Flash Download选项,出现如下界面

选项框选中如图的四个,然后点击Add,选出芯片所对应的Flash的空间大小的选项点击Add即可。点击确定,该项设置完成。

最后再次点击Utilities选项出现如下界面

按照该图,对其进行设置即可。最后点击OK即可。

然后就是编译,下载。(这些大家应该都知道怎么操作吧)

若有疑问,欢迎跟帖。

需要注意的是芯片没选对,或者是芯片的Flash的存储空间没选对。会提示下载失败。(具体什么原因我不太清楚)

但是在编译顶配版的程序时如果我选择正确的芯片型号然后编译时会报错。不知道是为什么。但选择STM32f103ze就不会报错了。

希望大家能在一起讨论。

接下来就是硬件连线问题

我用的是J-link转接板,接上后直接就能分出SWD的接线口然后对应插上即可。如果没有转接板也无大碍,IO和CLK分别是7脚和9脚。

上图JP9的位置即为SWD接口的引脚。

连上对应的连接线,打开电源开关就可以下载程序了。



助工
2015-06-10 13:58:29     打赏
7楼

前段时间因为复习考试,耽搁了一个多星期,近段时间将陆续补上

四、基础实验

1) 电机驱动试验

首先我们先要查看原理图,熟悉电机驱动部分的电路


由这两个图我们就可以判断出驱动电机的O1O2O3O4,然而PA0PA1PB6PB7接的是编码器,编码器将在下一小节介绍。

然后对应到电机的驱动芯片,我们可以发现控制电机的是PB1PB15PB14PB13PB12PB0,根据原理图的引脚注释,我们可以确定的是PB1PB15PB14控制的是A电机,PB13PB12PB0控制的是B电机。

接下来我们就需要通过程序来控制这些引脚,从而控制电机转速。

官方提供了综合例程,其中就包含了电机驱动的程序,因此我在这就梳理一下控制电机部分的函数。

宏定义:

timer.h文件下的75-80行,对于AIN1AIN2BIN1BIN2可以较直观的看出是原理图中对应的引脚,但是对于PWMAPWMB的宏定义属于PB1PB0管脚的第二功能。开启通用定时器TIM3产生PWM信号。该程序打开的是三和四通道,额外补充一下一二通道分别是管脚PA6PA7

通常情况下如果想提高速度或者降低速度,都是通过调整PWM输出的占空比,越大则速度越快。但通过MiniBalance.c文件下167-175行的Xianfu_Pwm(void)函数可知,该处限幅上限时3500,而PWM满幅3600,故通过调整PWM的占空比来改变速度的空间很小,因此想提高小车的各项速度就必须对算法进行优化。


助工
2015-06-18 19:37:50     打赏
8楼

     2.  编码器数据采集试验

在电机试验中已经从原理图中直接提取出了编码器的连接引脚,在此就不在赘述了。

首先是编码器的初始化,见C文件timer.c中的void Encoder_Init(void) void Encoder_Init2(void)两个编码器初始化函数,分别是左右两个,在此只对其中的一个做出分析。

特别指出一下

timer.cvoid Encoder_Init(void)初始化函数中,设置PB6为浮空输入时,GPIOB->CRL|=0X08000000,但我查了手册之后发现这样写并不是浮空输入,而是上拉/下拉输入,然后我就改成了GPIOB->CRL|=0X04000000,不过经过测试我发现并没有什么影响。

通过TIM2->SMCR |= 3<<0TIM4->SMCR |= 3<<0我们可以通过查手册发现,选用的是编码器模式3,及根据另一个信号的输入电平,计数器在TI1FP1TI2FP2的边沿向上/向下计数,也就是可以实现检测正反转。

一下将只针对void Encoder_Init(void)函数进行分析

TIM2->CCMR1 |= 1<<0TIM2->CCMR1 |= 1<<8可以得知分别被IC1FP1映射到TI1IC2FP2映射到TI2,再通过对TIM2->CCER的配置(可通过阅读手册明白),再联系刚刚提到的配置TIM2->SMCR,即可理清楚,该模式计数方式是发生在另一个引脚低电平时计数。(如果有理解不恰当个的地方,请大家指出)

初始化完事只有就是你读取编码器数据,初始化时放在主程序中,但读取编码器的函数void readEncoder(void)则是放在5MS中断中,每5ms读取一次编码器数值。

     通过对编码器的试验,我主要是弄清楚了编码器是如何实现计数功能,以及是如何通过编码器判断电机转的方向。若有不正确的地方欢迎大家指正


菜鸟
2015-06-19 13:21:53     打赏
9楼

高手啊,厉害。


助工
2015-07-07 22:03:52     打赏
10楼

3.无线通信之2.4G模块

通信这块,如果采用蓝牙模块,串口通信这块没有太大难度,看例程基本能看懂,难在手机APP比较难捉摸,由于本人不会安卓开发,故在该模块无能为力,因此着重分析一下2.4G模块通信。但是研究了几天在移植问题上出了问题,一个 例程我在stm32f103zet6的野火板子上能很好通信的程序,更改引脚之后在stm32f103rbt6的神舟I号板子上不好使,捉摸了好几天也没能好使。对应的引脚,以及相应的时钟都已打开了,我又移植到了stm32f103zet6最小系统板发现也能正常运行。但是除了引脚对应  没听说移植这个程序还需要更改别的地方啊。有没有人碰到过同样的问题呢?忘好心人给予答复,谢谢啦

问题已经解决了!!!!

更改引脚后由于没注意引脚的复用,然而JLINK程序下载的几个引脚内部默认不是通用GPIO,故当这些引脚作为GPIO用的时候,应该失能JATG。即

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//开启SWD,失能JTAG

以下是JLINK和SWD仿真所用用到的引脚,当这些引脚用于通用GPIO时应该关闭其复用功能

PB3-JTDO

PB4-JTRST

PA13-JTMS

PA14-JTCK

PA15-JTDI

关于24L01控制小车,随后会更新………

敬请期待



共12条 1/2 1 2 跳转至

回复

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