⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 模糊控制程序
💻 TXT
字号:
#包括“ msp430x14x.h ” 

#界定pwm_period 3999 / / 8 MHz / 4000 = 2khz 
#界定pwm_max 1199 / /最高税的因素,使用
#界定pwm_min 149 / /敏税的因素,使用

#界定min_speed万/ /分钟。测量速度

诠释阵列[ 700 ] ; / /调试缓冲区
诠释parray = 0 ; 

未签名的诠释setspeed = 1667 ; / / 1667平等50rpsec 
                                                 / / setspeed = f_timer / ( revpersec * 24 ) 
                                                 / /与f_timer = 2 MHz 

未签名的诠释lasttaccr ; / /转速测量vars 
未签名的诠释currentspeed = min_speed ; 
未签名的长期speedmemsum = 8 * (未签名的长) min_speed ; 
未签名的诠释pspeedmem = 0 ; 
未签名的诠释speedmem [ 8 ] = 
   min_speed , min_speed , min_speed , min_speed , 
   min_speed , min_speed , min_speed , min_speed 
) ; 

长期错误; / /控制算法vars 
长期derror ; 
长期lasterror ; 
长期pwmvalue ; 

诠释x1 [ 5 ] ; / /模糊控制变数
诠释x2 [ 5 ] ; 
诠释y [ 5 ] ; 
诠释输出; 

#界定纳米0 / /负中等
#界定的NS 1 / /负小
#界定泽2 / /零平等
#界定的PS 3 / /积极的小
#界定下午4 / /积极中等

常量未签名的煤焦inferencetable [ 5 ] [ 5 ] = 
   (时,下午一时,下午,聚苯乙烯,泽) , 
   (时,下午一时,聚苯乙烯,泽,生理盐水) , 
   (时,聚苯乙烯,泽,生理盐水,纳米) , 
   (聚苯乙烯,泽,生理盐水,纳米,纳米) , 
   (泽,生理盐水,纳米,纳米,纳米) 
) ; 

常量签署煤焦outputfunc [ 5 ] = 
   - 0x10 , - 0x08 , 0 , 0x08 , 0x10 
) ; 

/ /函数原型
无效initsystem (无效) ; 
无效的模糊化(诠释的价值,诠释*数据) ; 
无效fuzzyinference (诠释*错误,诠释* derror ,诠释* y )的; 
诠释模糊(诠释* y )的; 
__interrupt无效wdt_isr (无效) ; 
__interrupt无效timera0_isr (无效) ; 
__interrupt无效timera1_isr (无效) ; 

无效的主体(无效) 
  挥发性未签名的诠释; 

   initsystem ( ) ; 

  而( 1 ) 
     __bis_sr_register ( lpm0_bits ) ; / /输入山泥倾泻,等待开始
                                                 / /下一个控制周期

     / /如果错误> 0 ,然后汽车是快速
     / /如果误差< 0 ,然后电机是缓慢

     lasterror =误差; 

     __disable_interrupt ( ) ; / /保护以下声明
    错误= (长期) setspeed -c urrentspeed; / /钙绝对误差

    如果( parray < sizeof阵列/ sizeof阵列[ 0 ] ) / /储存一些价值观,用于调试
      阵列[ parray + ] = currentspeed ; 

     __enable_interrupt ( ) ; 

    错误< < = 3 ; / /乘以8 

     derror =错误-l asterror; / /钙微分误差
     derror < < = 5 ; / /乘以32 

     / /确保错误是模糊边界
    如果(错误> 0xc00 ) / /电机太快? 
       tbccr2 = pwm_min ; / /设定的PWM最低
      继续; / /跳过超过控制算法

    如果(错误< - 0xc00 ) / /电机的速度太慢? 
       tbccr2 = pwm_max ; / /设定的PWM最高
      继续; / /跳过超过控制算法

    模糊化(错误, x1 )和; / /变换绝对误差
    模糊( derror , x2 ) ; / /变换微分误差
     fuzzyinference ( x1 , x2 , Y )的; / /适用的模糊规则表
    输出=模糊( y )的; / /取得标结果

     pwmvalue = tbccr2 +输出; 
    如果( pwmvalue < pwm_min ) pwmvalue = pwm_min ; / /限制产值
    如果( pwmvalue > pwm_max ) pwmvalue = pwm_max ; 
     tbccr2 = pwmvalue ; / /指派新的PWM占空比
//------------------------------------------------ ------------------------------ 
/ /功能转换的离散输入值'价值'到5元
/ /模糊矢量数据的[ ] 。 
//------------------------------------------------ ------------------------------ 
无效的模糊化(诠释的价值,诠释*数据) 
  诠释; 

   (一= 0 ;我<五月,我+ + ) 
    数据[一] = 0 ; 

  如果(价值< - 0x800 ) 
    数据[纳米] = 0x400 ; 
  否则,如果(价值< - 0x400 ) 
    数据[纳米] = 0x400 -(值+ 0 x800) ; 
    数据[生理盐水] =价值+ 0x800 ; 
  否则,如果(价值< 0 ) 
    数据[生理盐水] = 0x400 -(值+ 0 x400) ; 
    数据[泽] =价值+ 0x400 ; 
  否则,如果(价值< 0x400 ) 
    数据[泽] = 0x400 -价值; 
    数据[常任] =价值; 
  否则,如果(价值< 0x800 ) 
    数据[常任] = 0x400 -(值- 0x 400); 
    数据[时] =价值-0 x400; 
  其他的
    数据[时] = 0x400 ; 
//------------------------------------------------ ------------------------------ 
/ /功能适用的模糊控制干扰规则表inferencetable [ ] [ ] 
/ /向两个输入数组x1 [ ]和X2 [ ] ,以产生输出向量y [ ] 。 
//------------------------------------------------ ------------------------------ 
无效fuzzyinference (诠释* x1 , x2 *诠释,诠释* y )的
  诠释分钟[ 5 ] ; 
  诠释最高; 
  诠释maxpos ; 
  诠释,我j ; 

   (一= 0 ;我<五月,我+ + ) / /清晰的输出向量y [ ] 
     y [一] = 0 ; 

   (一= 0 ;我<五月,我+ + ) / /回路通过x1 [ ] 
    为(十= 0 ; j < 5 ; J + +的) / /回路通过x2 [ ] 
      如果( x1 [一] < x2 [ j ] ) / /确定较小的值, 
        闵[ j ] = x1 [一] ; / /商店成为民[ ] 
      其他的
        闵[ j ] = x2 [ j ] ; 

    最高=民[ 0 ] ; / /寻找,最高可在闵[ ] 
     maxpos = 0 ; 
    为(十= 1 ; j < 5 ; J + +的) 
      如果(最大值<民[ j ] ) 
        最高=民[ j ] ; / /存储最高
         maxpos = j ; / /存储的立场最高

    如果(最大值> y [ inferencetable [一] [ maxpos ] ) / /适用于推理表
       y [ inferencetable [一] [ maxpos ] + =最高; 

    如果(是[ inferencetable [一] [ maxpos ] > 0x400 ) / /限制输出向量元素
       y [ inferencetable [一] [ maxpos ] = 0x400 ; 
//------------------------------------------------ ------------------------------ 
/ /功能转换的模糊矢量y [ ]离散值使用
/ /中心重心法。 
//------------------------------------------------ ------------------------------ 
诠释模糊(诠释* y )的
  诠释; 
  诠释returnval = 0 ; 
  诠释苏梅= 0 ; 

   (一= 0 ;我<五月,我+ + ) 
    苏梅+ = y [一] ; 
     returnval + = y [一] * outputfunc [一] ; 

  返回( (长期) returnval < < 2 ) /苏梅; / /规模的结果,由4 
//------------------------------------------------ ------------------------------ 
/ / MSP430的具体初始化时钟系统及定时器模块
//------------------------------------------------ ------------------------------ 
无效initsystem (无效) 
  挥发性未签名的诠释; 

   wdtctl = wdtpw + wdthold ; / /举行wdt 

   / /设置时钟系统
   bcsctl1 | = xts ; / / aclk = lfxt1 =高频透过XTAL 

  这样做( 
     ifg1 & = ? ofifg ; / /明确oscfault国旗
     (一= 0xff ;我> 0 ,我-) ; / /时间为国旗的设置
   ) ,而( ifg1 & ofifg ) ; / / oscfault国旗仍然成立呢? 

   bcsctl2 | = selm_3 ; / / mclk = lfxt1 (安全) 

   / /安装港口
   p2sel = 0x04 ; / /转让p2.2 ,以timer_a.cci0b 
   p4sel = 0x04 ; / /转让p4.2 ,以timer_b.out2 
   p4dir = 0x04 ; / / p4.2输出

   / /安装timer_a速度测量
   taccr1 = min_speed ; / /设定最低速度,这是读出
   tacctl0 = cm_1 + ccis_1 +公务员事务局局长+帽+ ccie ; / /捕获上升沿的cci0b ,中断
   tacctl1 = ccie ; / /比较模式,中断对equ1 
   tactl = tassel_1 + id_2 + mc_2 ; / /使用aclk / 4 = 2 MHz ,开始在连续模式

   / /安装timer_b的PWM一代
   tbccr0 = pwm_period ; / /脉宽调制期
   tbcctl2 = outmod_7 + clld0 ; / /设置out2对equ0 ,重置就equ1 , 
                                                 / /同步锁存负荷与equ0 
   tbctl = tbssel_1 + mc_1 ; / /使用aclk ,开始在多达模式

   / /安装wdt定期中断
   wdtctl = wdtpw + wdttmsel + wdtssel ; / / intervall定时器, 8mhz/32768 = 244hz 
   ie1 | = wdtie ; 

   __enable_interrupt ( ) ; 
//------------------------------------------------ ------------------------------ 
/ /看门狗定时器的ISR是用来定期唤醒了从低功率模式
/ / lpm0执行模糊控制回路。 
//------------------------------------------------ ------------------------------ 
wdt_isr ( wdt_isr ) 
__interrupt无效wdt_isr (无效) 
   __bic_sr_register_on_exit ( lpm0_bits ) ; / /唤醒,从防止山泥倾泻
//------------------------------------------------ ------------------------------ 
/ / timer_a ccr0的ISR是所谓的对每个taccr0捕获事件获得
/ /时间戳记的输入信号的过渡。 1 8 -塔移动平均线
/ /过滤器用于以尽量减少测量误差。 
//------------------------------------------------ ------------------------------ 
timera0_isr ( timera0_isr ) 
__interrupt无效timera0_isr (无效) 
   speedmemsum -= speedmem [ pspeedmem ] ; / /删除最古老的价值
   speedmem [ pspeedmem ] = (未签名的诠释) ( taccr0 -l asttaccr) ; / /取代现行
   speedmemsum + = speedmem [ pspeedmem + ] ; / /更新运行总结
   currentspeed = speedmemsum > > 3 ; / /钙的速度由8部
   pspeedmem & = 0x07 ; / /调整通告指针

   lasttaccr = taccr0 ; 
   taccr1 = lasttaccr + min_speed ; / /设定超时最小速度
) / /被读出
//------------------------------------------------ ------------------------------ 
/ / timer_a ccr1的ISR是所谓的对taccr1比较的事件,这是产生
/ /时,没有输入信号的变化是检测' min_speed ' 24小时后,蜱
/ /最后taccr0事件。这提供了一个超时功能,以更新的速度
/ /变量的情况下电机得到制止。 
//------------------------------------------------ ------------------------------ 
timera1_isr ( timera1_isr ) 
__interrupt无效timera1_isr (无效) 
  开关( taiv ) 
    案件0x02 : / / taccr1 ccifg 
       speedmemsum -= speedmem [ pspeedmem ] ; / /删除最古老的价值
       speedmem [ pspeedmem ] = (未签名的诠释) ( taccr1 -l asttaccr) ; / /取代现行
       speedmemsum + = speedmem [ pspeedmem + ] ; / /更新运行总结
       currentspeed = speedmemsum > > 3 ; / /钙的速度由8部
       pspeedmem & = 0x07 ; / /调整通告指针

       lasttaccr = taccr1 ; 
       taccr1 = lasttaccr + min_speed ; / /设定超时最小速度
      打破; / /被读出

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -