📄 新建 文本文档.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 + -