+发表新主题
tianshicuo 发布于2007-4-28 09:32 1 次浏览 0 位用户参与讨论
跳转到指定楼层
把这个做成一个函数,用时只调用即可。这里讲解也不是很详细,如果需要更好的资料可以联系我。

这个程序非常基本,以这个程序为框架也可以做出比较复杂的模糊控制程序,少后再带来模糊控制理论方面的东西。

=====================
;;=========================定义数据============================
;输入精确值 0---40
;输出精确值 30--10

;预留1个字节的精确输入空间
INPUT:  DS.B 1   
;由于有三个MF,所以预留3个字节的模糊输入(隶属度)空间   
FUZZY_INPUT:  DS.B 3;
;模糊输出预留3个字节  
FUZZY_OUTPUT: DS.B 3
;实际输出预留1个字节  
OUTPUT:  DS.B 1

;以下是成员函数定义
; 冷为0-15度,温为10-25度,热为20-40度
MF: FCB 0,15,255,51
FCB 10,25,51,51
FCB 20,40,26,51

;精确输出为,冷时暖气开30分钟,温时开20分钟,热时开10分钟
ACC_OUT:FCB 30,20,10
;以下是规则定义
;IF 冷 THEN 30 0=从FUZZY INPUT冷的偏移量,$FE=先决条件终止符,3=输出偏移量,$FF=本条规则终止
;IF 温 THEN 20
;IF 热 THEN 10
RULES: FCB 0,$FE,3,$FF
FCB 1,$FE,4,$FF
FCB 2,$FE,5,$FF  
;=========================数据结束=============================

;=========================代码===============================
MOVB #24,INPUT ;设置输入为24度

;以下完成精确输入的模糊化
FUZZIFY:    LDX #MF ;X寄存器初始化为成员(梯形)函数的地址
            LDY #FUZZY_INPUT ;Y寄存器初始化为存储模糊输入的地址
            LDAA INPUT ;A寄存器装入输入的值
            LDAB #3 ;B寄存器装入成员函数的数目
GRAD_LOOP:  MEM               ;使用MEM指令模糊化精确输入
            DBNE B,GRAD_LOOP ;循环3次
            
             ;以下模糊输出清零
            LDAB #3 ;B寄存器装入模糊输出单元数
            LDY #FUZZY_OUTPUT ;Y寄存器装入模糊输出地址
RULE_EVAL:  CLR 1,Y+            ;把模糊输出清零
            DBNE B,RULE_EVAL ;循环3次

             ;以下完成规则评估,产生模糊输出
            LDX #RULES ;X加载规则地址
            LDY #FUZZY_INPUT ;Y加载模糊输入
            LDAB #3 ;一共3个模糊输入
Evalue:     
LDAA #$FF                    ;A装入$FF,指令要求
            REV ;评估指令
            DBNE B,Evalue ;循环3次

;以下反模糊化
DEFUZ:      LDX #ACC_OUT ;X为精确输出保存的地址,用于计算最终输出
            LDY #FUZZY_OUTPUT ;Y为模糊输出地址
            LDAB #3 ;一共3个模糊输出
            WAV ;反模糊
            EDIV ;除法
            TFR Y,D ;Y->D
            STAB OUTPUT             ;结果放入OUTPUT单元
;========================代码结束
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ| Archiver|手机版|小黑屋| 碧波制图网 Stonespider

Copyright © 2021-2023 Kangli Wu   All Rights Reserved.

Powered by Discuz! X3.5( 苏ICP备18011607号-1 )

快速
回复
返回
列表
返回
顶部