最新日志

发表于:2008-5-7 12:22:42
标签:无标签

0

MC9S12DG128模糊控制崩溃之旅

点击下载

MC9S12DG128模糊控制崩溃之旅

夜随风舞

Tuesday, May 06, 2008

  BLOG上允诺要写有关模糊控制的内容很长时间了,一直未兑现。今天工作稍闲,想起了承诺,所以就开始敲起了键盘。不过,首先得声明,本人并非学自动控制相关专业的,只不过是由于“项目”需要做起了模糊控制,所以有不足或是错误之处,敬请谅解!呵呵……热烈欢迎相关的讨论。

  另外,之所以将题名选为“MC9S12DG128模糊控制崩溃之旅”,是因为我前前后后调试了几近一个月才有点头绪,所以是够崩溃的。好了,言归正传。

  首先,简单介绍一下模糊控制。

l        模糊控制以模糊集合理论为基础,而模糊集合靠隶属度函数来描述。至于什么是“模糊集合理论”,什么是“隶属度函数”。请网友查找相关的网页或书籍。在此不作深入的说明。

l        模糊推理方式

1.        IF A THEN B

2.        IF A THEN B ELSE C

3.        IF A AND B THEN C

第三种表达有得最多,而且在这里我用的也是这个。通常在实际应用中

A表示误差,用B表示误差变化率,而C则是控制量。

l        模糊控制步骤

精确量输入

模糊化

规则推理

反模糊

精确量输出

现在稍稍介绍一下我的系统,我的系统是基于Freescale公司MC9S12DG128的一个随动系统,要求能跟随目标的变化而作相应的角度,速度的变化。D系列的产品具有模糊推理的功能,有模糊指令集,而且有模糊机例程。而我正是在该模糊机例程的基础上做的模糊控制。下面是该模糊机的例程代码。

 

 

 

#include "syf.h"

uchar FUZ_INS[18];

uchar FUZ_OUTS[9];

const uchar INPUT_MFS[18][4]={

                             //trend

                             0,4,0,20,

                             2,10,10,10,

                             6,14,10,10,

                             12,22,10,8,

                             15,25,8,8,

                             18,28,8,10,

                             26,34,10,10,

                             30,38,10,10,

                             36,40,20,0,

                            

                             //av_line                            

                             0,5,0,8,

                             0,10,8,8,

                             5,15,8,8,

                             10,20,8,8,

                             15,25,8,8,

                             20,30,8,8,

                             25,35,8,8,

                             30,40,8,8,

                             35,40,8,0                            

                             };

 

const uchar OUTPUT_MFS[9]={

                             0,1,2,3,4,5,6,7,8

                           };

                           

const uchar RULE_START[406]={

                            //no.1

                            (9*0)+0,(9*1)+0,0xfe,(9*0)+0+18,0xfe, //no.1

                            (9*0)+0,(9*1)+1,0xfe,(9*0)+0+18,0xfe, //no.2

                            (9*0)+0,(9*1)+2,0xfe,(9*0)+0+18,0xfe, //no.3

                            (9*0)+0,(9*1)+3,0xfe,(9*0)+1+18,0xfe, //no.4

                            (9*0)+0,(9*1)+4,0xfe,(9*0)+1+18,0xfe, //no.5

                            (9*0)+0,(9*1)+5,0xfe,(9*0)+2+18,0xfe, //no.6

                            (9*0)+0,(9*1)+6,0xfe,(9*0)+2+18,0xfe, //no.7

                            (9*0)+0,(9*1)+7,0xfe,(9*0)+3+18,0xfe, //no.8

                            (9*0)+0,(9*1)+8,0xfe,(9*0)+4+18,0xfe, //no.9

                            ……

                            0xff };

 

uchar fuzzy(uchar fuzzy_in_1,uchar fuzzy_in_2){

    char fuzzy_out;

    fuzzy_out = 0;

    __asm{

                        LDX    #INPUT_MFS    ;Point at MF definitions

                        LDY    #FUZ_INS      ;Point at fuzzy input table

                        LDAA   fuzzy_in_1 ;Get first input value

       

                        LDAB   #9            ;9 labels per input

            GRAD_LOOP:  MEM                  ;Evaluate one MF

                        DBNE   B,GRAD_LOOP   ;For 9 labels of 1 input

               

                        LDAA   fuzzy_in_2 ;Get the second input value

                        LDAB   #9            ;5 labels per input

            GRAD_LOOP1: MEM                  ;Evaluate one MF

                        DBNE   B,GRAD_LOOP1  ;For 5 labels of 1 input

               

                        LDAB   #9            ;Loop count

            RULE_EVAL:  CLR    1,Y+          ;Clear a fuzzy out & inc ptr

                        DBNE   b,RULE_EVAL   ;Loop to clr all fuzzy outs

               

                        LDX    #RULE_START   ;Point at first rule element

                        LDY    #FUZ_INS      ;Point at fuzzy ins And outs

                        LDAA   #$FF          ;Init A (and clears V-bit)

                        REV

               

            DEFUZ:      LDY    #FUZ_OUTS     ;Point at fuzzy outputs

                        LDX    #OUTPUT_MFS   ;Point at singleton positions

                        LDAB   #9            ;9 fuzzy outs per COG output

               

                        WAV                  ;Calculate sums for wtd av

                        EDIV                 ;Final divide for wtd av

               

                        TFR    Y,D           ;Move result to A:B

                        STAB   fuzzy_out       ;Store system output           

            }

   return (fuzzy_out);

}

  上面的粗体部分是模糊机的例程,前面的数组是精确输入,精确输出和规则库。

  一开始,我花了很多时间来消化这个例程,不好懂,主要是当时对模糊控制的过程不是很理解吧。然后就看了很多资料,后来也就好像是顿悟了一样,理解了什么是模糊控制。但是,光光理解了不行阿,还要形成代码,才行阿。就又接着看资料,找S12在这一块的论述,找例程等。最后,才形成了上面的代码。下面简要的说一下代码的格式为什么是那样的。在const uchar INPUT_MFS[18][4]中一行的数据的意思是“起始点坐标,终点坐标,前沿斜率,后沿斜率”。而在规则库中,                            (9*0)+2,(9*1)+0,0xfe,(9*0)+0+18,0xfe, //no.1”,“oxfe是分割标志,第一个前面是模糊输入表的8位偏移量,其后是输出表的8位偏移量。其实具体我的理解也不是很深。而且我在规则库这里还碰到一个问题,就是,在上面大家可以看到“(9*0)+0+18”,“(9*0)”好理解,因为输出的隶属度函数是一维数组,而“+0”表示的该一维数组中的第一位数,而其后的“+18”就不知道为何物了!而且我试过,如果输入的语言值只有7个话,那么后就应该改为“+14”,而且这里是“+18”也好,还是“+14”也好,它们对应的输出都只是单值函数,不是三角函数或是梯形的。但是如果要提高系统的控制精度的话,单值函数是胜任不了的,所以我尝试换成三角函数,但是,模糊不出来正确的结果。不知道有没有高手做过类似的,有没有碰到类似的问题。

最后,上面提出来的问题也没解决,只能是用单值函数暂时顶一下。然后我就手动输入精确值,看输出是否符合规则上的,是不是我想要的。很好,出来的精确值我很满意,然后,我就满怀信心的将我的系统放到实际的环境中,让它先采集目标的特定参数,然后再利用模糊来控制系统,结果始终就是出不来正确的结果。一开始,我以为是我的模糊有问题,就再次手动输入了一次精确值,输出正确。然后再实际测试目标的特定参数,也在其论域内,而且我可以确认的是我的隶属度函数的选取还是比较合理的。但为什么两单独测试都很正常,而结合在一起就不行了。很崩溃,当时真有不想用模糊控制的冲动,但我又觉得很不甘心。就仔细检查我的代码,后来发现是两个常量的值搞反掉了。但当时也不能肯定就是这个原因,抱着试一试的态度,把它们的值修改过来,重新整合系统,嘿,成了,能根据目标的变化而随动了。而且效果还不错。呵呵……

其实,调试一个月的模糊之后,感觉这个跟调试者的经验,对系统的理解度有很大的关系。而且隶属度函数啊,规则库啊,不都是调试者根据一定的理论基础结合实际经验获得吗?虽然我的模糊现在能起到一定的作用了,但是还不是很完善。尤其是上面的问题。

 

〔参考文献:单片嵌入式应用在线开发方法 邵贝贝 清华大学出版社〕

注:未经允许,请勿转载,虽然写得不怎样,呵呵……

欢迎讨论,QQ:373538543E_MAIL:shuyingfei@126.com

点击此处查看原文 >>

系统分类: 工业控制   |    用户分类:    |    来源: 原创

评论(0) | 阅读(63)
发表于:2008-4-16 10:49:55
标签:无标签

0

如何在CODEWARRIOR4.6下使用清华TBDML续

点击下载如何在CodeWarrior4.6下使用清华TBDML

2008314日,小可不才,在博客上发表了《如何在CodeWarrior4.6下使用清华TBDML》。其中论述了基于CODEWARRIOR4.6编译环境,如何设置软件(HIWAVE.EXE)和硬件跳线,从而使用清华的TBDML来进行调试。

 

文章发出一段时候后,获得了一些访问量,令我非常兴奋。但更令我雀跃的是有一位网友提出我的那种方式太过于复杂,而且我个人也感觉论述不是很清楚。

所以,今天再次写下这个

 

一:硬件跳线和编译环境入3.14的文章中所述。

二:实际上最简单的设置就是在一开始建立工程的时候,在选择connections时在选择P&E(以防需要使用P&E的工具)的同时选择TBDML。如下图所示

这样,你就可以不用通过烦琐的设置来使用TBDML了,但是在DEBUG的时候,还是需要在你的HIWAVE.EXE中选择正确的工具连接。具体如何选择请参考如何在CodeWarrior4.6下使用清华TBDML》。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(86)
发表于:2008-3-26 17:17:26
标签:无标签

0

重新洗牌

今天在无聊之时,偶看到报纸上一篇有关张国立的《金婚》的评论。文章不是很长,但是其中有一句话令我回味良久。文中说“在婚姻中,感情很重要,耐心更重要,不要遇到一点小事就想重新洗牌,你以为下次就一定能起好?不如耐心打,说不定还能满堂彩。”

虽说,我只是二十刚出头,婚姻对我来说,还早的很,至少现在!不过,我之所以回味良久是因为那句话,它不仅只是对婚姻而言的。对于我们生活中很多事都一样。而且,更实在地说,我就是一个“遇到点小事,就期望能重新洗牌的,总希望下一次能起一手好牌”的人。那句话似乎是专说给我听的,呵呵,一语中的!

但现实就是现实,不知道经历了几多的“盼洗牌而不能”之后。开始变得对很多事情不抱希望了,还学会了拿借口为自己的这种行为开脱。当然,值得庆幸的是我应该算是个事业心很强的人,我想洗牌的方面肯定不是这方面了,呵呵,在事业方面还是比较看得准,有打算的哦,呵呵。

我想洗牌的是我的“感情牌”。呵呵,用我爸前几年的话就是“乳臭未干,谈什么恋爱”。但,人非草木,孰能无情。前几次“阵雨”之后,总想能重新洗牌,期盼着符合我的标准(我有点大男子主义,也很狂傲,时而,呵呵)的那位能出现,但总不得,呵呵。所以就更想洗牌。虽然,我知道这是不对的,但是我却深深地沉迷在重新洗牌的狂想之中。

然而,世事弄人,很不容易在即将毕业之际碰到一位“似乎很投味,却又令我很无奈”的。几番努力之后,我真的很疲惫,感到很委屈,我不至一次问过自己,她有什么好,值得我如此。“重新洗牌”的想法又在我的脑海中浮现,想一切能重新开始,或者说跟谁能一刀切了,从此彼此是彼此。但人情不是说断就能断的,更何况藕断还丝连呢,而且这也只是心里暂时的想法,并没有去切。

虽然,走的路不多,也过了不少桥;虽说,吃的饭不多,也磕了不少的盐。现实中的我是一个好赌的人,以前动不动就要跟谁谁谁打赌,呵呵,逢赌必输,他们总说是我的姓不好,姓“舒”。呵呵,看过不少,听过不少,也赌过不少,至今我还很喜欢跟人搓上几局,虽输却乐,乐在我输得明明白白,乐在我并没有把这种输看得很重,因为毕竟我没有把它关联到我的工作学习上来。

重新洗牌?不!不洗了,就是这手牌,我怎么打,那是我的章法,别说什么旁观者清,难道你知道我是怎么规划的,所以,看你的牌,别出声。耐心点,别想重新洗牌,不管是“麻将”还是“扑克”!

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(0) | 阅读(119)
发表于:2008-3-18 22:06:12
标签:无标签

1

晒晒我的板子

前一段时间做了两个板子,MC9S12DG128的最小系统,可以代替清华的直接用于飞思卡尔智能车比赛用的最小系统;以及TBDML,可以用于S12/08的程序下载,调试。

MC9S12DG128点击看大图

点击看大图

由于最近比较忙,所以只焊了一个芯片。呵呵

 

TBDML

点击看大图

点击看大图

点击此处查看原文 >>

系统分类: PCB   |    用户分类:    |    来源: 原创

评论(2) | 阅读(240)
发表于:2008-3-14 14:48:53
标签:无标签

1

如何在CodeWarrior4.6下使用清华TBDML

点击下载如何在CodeWarrior4.6下使用清华TBDML

 

一、           跳线设置

打开清华(2005版本)的TBDML调试器,你会在BDM_OUT头的附近看到三个跳线,它们的设置如下。

J4

J5

J6

闭合

闭合

断开

二、           程序编译环境

如本文标题所示,CodeWarrior4.6

三、           驱动程序安装

以前在网上下到,清华大学有关该TBDML的使用方法都是基于低版本的CodeWarriorCodeWarrior4.1低版本的不能识别TBDML,所以设置、使用很不方便。近日,小可不才,在CodeWarrior4.6下尝试使用了一下,发现很方便,甚至比P&EBDM头下程序要来得快捷。特与大家共享,请勿未经本人同意随便转载,谢谢合作。特此感谢合肥工业大学仪器学院的张阳老师为我提供TBDML及指导。

四、           具体操作

l           设置好跳线后,将TBDMLPC机连接,怎么接,就不用说了吧,呵呵。

l           如果你以前没有用过该调试工具的话,那么PC机会提示发现新硬件,如图1所示。

  

 

l           选择自动安装,并点击下一步。你会看到

 

l           稍微等待一会,高版本的CodeWarrior能识别,并能自动安装驱动,以前低版本的你根本想都别想,这就是为什么清华写的使用手册那么晦涩的原因,呵呵,并无诋毁之意,个人体会。

l           安转完成后,你会看到下图。

  

l           好了,驱动程序安装完成了,下面正式进入设置环节。

 

 

l