我的STM32主控红外遥控双轮平衡小车

我的STM32主控红外遥控双轮平衡小车

(2015-05-28 17:38:27)[编辑][删除]
   
  我的红外遥控双轮平衡小车程序初步完整,STM32F103ZET6主控,整个LCD显示,MPU6050数据读取,角度计算,卡尔曼滤波,PID算法,PWM输出,红外遥控,都已完成,还剩下最后PID的几个具体参数的调试了,这个需要等我的硬件部分完成之后开始,下面附上我初步的工程程序的链接,已经编译OK了的。http://pan.baidu.com/s/1dD2I4zZ
后面会继续更新。包括硬件部分。
最近在硬件调试时,电路哥哥模块都链接好之后,接上12V驱动电机的电源之后,把我的STM32的板子给烧了,具体原因还在找,估计得加上光耦隔离。需要做好足够的保护措施才是,确实我的STM32在连接那个L298N的驱动时候就遇到了显示的问题,开始没太在意,最后给L298N接上12V的时候,整个就烧了,虽然没有和STM32直接相连。最开始接上6V(给L298N芯片供电的,理论上应该是5V)时,TFT显示等等都是没有问题的,然后给编码器接上电池(3.7V的,3V到5V的都可以),接着给L298N接上12V的,然后TFT屏就白了,不能显示东西了,但这个时候烧录程序什么的都是可以进行的,而且,烧录我原来的程序,也就是没有驱动电机的,而只是单纯地显示MPU6050参数的程序是可以正常运行的,而且TFT是可以正常显示的,烧录进后面完整的通过定时中断方式输出PWM的程序时,屏幕就无法显示了,我后来认为是那个编码器的电源没有与单片机共地,然后我引了一条线与单片机共地,再接上12V电源,再给单片机供电时,发现板子上没有任何反应了,并且发现UART模块发热很严重,一插上板子,那上面的灯就不亮了,板子上的灯根本没有反应了,通过其他端口供电也米有反应,果然是电源端与地段短路了,通过万用表也测出来了,但无法找出是哪里发生短路了,估计是哪里被击穿了吧。后来我看了下这个板子的系统电路图,他们的电源端和地端之间都是接有电容的,我想很可能是某个电容被击穿了,导致短路。电机启动瞬间会产生尖峰脉冲会对控制器产生影响。

复制他人(如图为L298组成的电机控制,MCU是STM32F103RBT6,电源12V,经过LM2676转换5V供给板上5V的芯片,5V经过LM1117输出3.3V给STM32,电机运行的情况下将产生50V的反向电动势,这个电动势将在续流二极管SK24的作用下回馈到电源VIN消耗掉,也就是这样会擡高输入的12V电压,假使这个50V的反压会通过LM2676到达+5V电压,在L298的+5V端通过L298的IO作用到STM32的IO,
第一个问题,看到STM32的IO说明图里面有保护二极管,这个保护二极管是内部带的吗?这个二极管吧高压回馈到STM32的电源,会不会烧芯片,手册上的“VDD_FT 对5 伏兼容I/O 脚是特殊的”,VDD_FT是如何连接的,什么原理能使他兼容5V输入,。是不是兼容5V就去掉了内部的上拉保护二极管。它与VDD 不同手册所说的ESD保护2000V是否能保护我现在这种情况的发生。
第二个问题,我现在L298用的5V逻辑电压,STM32用的3.3V,这种情况下STM32做输出会产生什么不好的因素,如何避免。设置为OD吗?

经过试验,现在很快烧毁了两片103RBT6,实在是无法也不太敢在原来电路基础上做实验,望各位多多指教,)
http://bbs.eeworld.com.cn/thread-249976-1-1.html


http://www.amobbs.com/thread-5495321-1-1.html


http://bbs.21ic.com/icview-583546-1-1.html

解决任何问题必须下定决心,一定要一定要!!!不然拖拖拉拉!

我认为编码器与单片机是需要共地的,需要参考定位点,宽且编码器的电源并不是导致TM32烧掉的原因,罪魁祸首应当还是那个12V电源!

给平衡小车编码器供电时需要跟单片机共地么

肯定需要共地的。

不然你编码器返回的脉冲和你单片机参考电平不一致

这样单片机就不能得到有效的电平信息

所有的类似的需要两个系统之间通讯的,在使用一套电源的前提下都是需要共地



STM32的IO口是要先进行时钟定义然后初始化的。


在我对IO口初始化后,再在main函数中写入PWM_INT()之后,我的车子受PWM轮子可以转了。
终于进入最后的PID参数的调节。
此时的小车程序代码如下,当然我还没有接上红外遥控模块,但PWM可以正常输出控制电机了。http://pan.baidu.com/s/1pJuqIz5



平衡小车matlab建模:
建模、控制算法及PD调节的取值参考:

 http://www.mathworks.com/matlabcentral/fileexchange/19147-nxtway-gs-self-balancing-two-wheeled-robot-controller-design
 
硬件及软件参考如下网站资料;
 http://www.circuitcellar.com/avr2006/winners/de/at3329.htm
 http://tlb.org/scooter.html
 http://www.geology.smu.edu/~dpa-www/robo/nbot/

matlab(matlab需要2008版,旧的6.5版打不开)里打开NXT.mdl,输入NXT.m.txt内容回车,K_f的四个值就是所需的PD调节比例;详细参考NXT的文档;

主控制板说明:

 1:新布置的,因为修改了一些不合理的地方,和我使用的不一样,主控制板上RS232硬件部分还未调试过,所以使用时需要注意;
 
 2:可调电位器用来调试修改PD参数;
 
 3:另外几个接口可以用来改成遥控输入,比例遥控可以用AD采样口实现,但需要增加滤波;
 
 4:车轮速度我进行了低通滤波,否则可能会发抖;
 

马达控制板说明:

 1:同样重新修订,PCB最好自己优化并检查;
 2:马达控制板最好是使用IR2184,因为直接兼容5V电平,IR2111需要使用12V输入,我直接在单片机输出口接12V上拉电阻,也可以使用,但不推荐;
 
上位机只是简单的查看滤波效果和车速是否正确取得,VB编写的,大家可做完善;


zl
2010.06.16




辛苦了大概两个多月,之前一直都调不好。中间也遇到了很多的问题,但当问题解决后每次都是重大的突破。现在就介绍一下,制作过程中遇到的问题。
                1、关于加速度计的转换系数
                要制作自平衡车,角度和角速度的计算就很重要。关于加速度计和陀螺仪的使用就不多说了,他们一个用来测加速度计,一个用来测角速度。
                把从加速度计读出来的数据转换成角度,要乘以一个比例系数。在转换成角度角度的过程中,可以完全不用三角函数(因为车的倾角其实不会超过正负10度,后面会提到),直接把(最大值-最小值)/90(/2如果有正负的话)作为比例系数就可以了(这样可以和真实角度比较)。其实理论上这个比例系数是什么都可以,因为后面陀螺仪转换系数是根据加速度计的转换比例系数跳出来的,所以加速度计的比例系数无论是什么值都没有影响。
                
                2、关于陀螺仪转换系数
                陀螺仪的转换系数需要根据滤波的波形来调(我是在飞思卡尔公布的官方方案中看到的,经实践千真万确),陀螺仪的转换系数不用去算,只需要通过看波形去调就可以了,直到不超调也不滞后就可以了,具体的可以看附件官网方案中的93页(第二版)。
                
                3、关于滤波
                角度滤波有很多方案,我所知道的是互补滤波、官网的方案和卡尔曼滤波,我的感想是什么滤波都不重要,重要的是参数要调好。

                互补滤波:这是很简单也很实用的方法,其实和官网的方案有一点类似的地方,在网上有一个很著名的20页的PPT文件The Balance Filter,介绍的是互补滤波,相信大家看了之后都会明白的。在文件中,作者把高通滤波系数a和时间常数T(涛,不知道怎么打出来)及采样周期dt用一个公式建立了联系,而我的经验是,我们不要用这个公式去计算。高通滤波系数取0.98(不能比0.98再小了,会不平滑),采样周期根据你程序的需要是多少就多少(5ms的效果会比10ms好很多,越小越好),滤波可以通过调陀螺仪的转换系数达到很好的效果。也就是说,用互补滤波的关键调试参数是陀螺仪转换系数,把加速度计转换系数、高通滤波系数和采样周期定好之后,只需要调试陀螺仪转换系数就可以达到满意的效果了
                PS:互补滤波的效果一定不差,我看过网上用互补滤波和单纯的P控制达到很好的效果的。

                官网滤波方案:我总觉得官网的和互补滤波有些相似,经实验,效果也是很好的。具体的公式在参考方案里面也有。调试的关键就是陀螺仪转换系数。

                卡尔曼滤波:一直没用过,也不会用,主要是没弄懂。我不喜欢用一知半解的东西,因为出现问题的时候排查不出来或者不知道怎么解决问题。网上也有很多卡尔曼滤波的程序,因为一直看不懂,就连试也没试。如果会用的话,效果应该是好的,但我不会用。如果有谁用兴趣的话还请多多指教,互相交流一下。

                4、关于控制
                当然有再好的角度和角速度控制不好的话也是站不好的。控制就用一般的PID控制,PWM=P*角度+D*角速度,这里没用积分控制,效果已经很好了。
                在官网的方案中,还加上了死区电压,我的最大的体会就是,这个死区电压是可以不要的,而且不要更好(或者去一个小一点的值)。
                这样的话就要把P调的很大。具体是多大呢,至少是电机满值的十分之一(五分之一甚至三分之一都是没问题的),例如电机最大输出是1的话,P取0.1、0.2、0.3都是没问题的(官网的方案好像是取的0.3),如果点击最大输出是5000的话,那么P取500、1000、1500都是可以的,(当然前提是加速度计转换系数转换出来的角度值和真实值相当,否则另当别论)。所以车模的角度应该不会超过正负十度,因为当P=0.3的时候,车模有三度多的偏差时电机就满电压输出了。我之前就是一直用一个很小的P去调,原来所有的问题就在于把P调大就可以了。
                至于D的话,大概在P的七十分之一或八十分之一之间都是可以有很好的效果的。这个关系就和加速度转换系数没有关系了。比如官网中P=0.3则D=0.3*1/75=0.004,在我这里P=1000,则D=1000*1/75=13.3,效果都是很好的。PS:这个关系只是在车模静止平衡时的关系,行进中的关系我还没有实验过。

                5、说明
                (1)陀螺仪的过冲是一个严重问题,高通滤波的那个电容是不可取的,要把它去掉才好。
                (2)每一步都是关键,要真正理解原理才会知道怎么调。
                (3)资料不知道怎么上传,他总是说附件超过大小了,有需要的可以留言

                 下一步打算把速度控制加上,谁有好的又不是很贵的编码器可以推荐下,谢谢!


http://www.amobbs.com/forum.php?mod=viewthread&tid=5464211
总结得也是相当到位的,现在才渐渐看懂。

现在才渐渐意识到核心不是PID的调节了,是滤波还有转换系数等等。

 





下面一张截图是我目前小车调到最好时的滤波,可以明显感受到滤波前和滤波后的不一样,也深深地感受到滤波信号处理的厉害与重要。

这个波形的显示的扯个串口调试助手还是用山外的好,那个SSCOM32以后建议不用了,直接用这个,功能非常强大,支持自动搜索串口等等,包括发送字符也支持16进制的显示。完爆SSCOM32,也谢谢学长的推荐,我也附上合格山外串口调试助手的下载链接,里面有使用说明文档。http://pan.baidu.com/s/1i3AItQt
经过串口调试显示波形再调试参数等等,现在车子可以达到稳定十几秒最高纪录42秒了。(连续几十个小时彻夜的参数调试),下面附上目前调的最好的一组参数的程序,至少可以让小车保持基本(十几秒几十秒)的平衡,当然我最终目标是永久的平衡。下面是程序链接:http://pan.baidu.com/s/1i38a27V


附上我小车的图片吧(硬件上已经完成的)

本来是想自己把串口引出来,后来才发现那个手机数据线插口下载程序的就是串口,可以共用哈哈。




我觉得我之后要好好研究下滤波了,对于这个小车,还远没有结束,只是开始,我要它像那天晚上我见到的四轴飞行器一样平稳!我觉得滤波是关键中的关键!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章