亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pid_main.asm

?? This program controls a BLDC motor in closed loop using PIC18Fxx31 devices. Hardware used is PICDE
?? ASM
?? 第 1 頁 / 共 2 頁
字號:
	movff	deriv0,BARGB0		;YES, AARGB0:AARGB2 has result of Prop + Integ	
	movff	deriv1,BARGB1		;load derivative term
	movff	deriv2,BARGB2				
	
	movff	pid_stat1,temp_reg	;pid_stat1 ---> temp_reg				
	movlw	b'11000000'			;prepare for sign check of bits 7 & 6
	andwf	temp_reg,f,1
	
	movf	temp_reg,w,1			;check error sign & a_error sign bits
	sublw	0x00
	btfsc	STATUS,Z
	bra		add_neg_d			;bits 7 & 6 (00) are NEGATIVE, add them
	bra		other_combo_d		;bits 7 & 6 not equal to 00
add_neg_d			
	call	_24_BitAdd			;add negative sign values	
	bra		scale_down			;scale result
	
other_combo_d	
	movf	temp_reg,w,1
	sublw	0xC0
	btfsc	STATUS,Z
	bra		add_pos_d			;bits 7 & 6 (11) are POSITIVE, add them
	bra		find_mag_sub_d		;bits 7 & 6 (xx) are different signs , subtract them
add_pos_d
	call	_24_BitAdd			;add positive sign values
	bra		scale_down			;scale result
find_mag_sub_d
	call	mag_and_sub			;subtract unlike sign numbers	
	btfss	pid_stat1,mag,1		;which is greater in magnitude ?
	bra		deriv_mag			;BARGB is greater in magnitude
	bra		scale_down			;derivative term < part pid term, leave pid_sign as is
	
deriv_mag						;derivative term > part pid term
	bcf		pid_stat1,pid_sign,1	;PID result is negative
	btfsc	pid_stat1,d_err_sign,1			
	bsf		pid_stat1,pid_sign,1	;PID result is positive
		
scale_down
	clrf	BARGB0,1				;(Prop + Integ + Deriv) / 16 = FINAL PID RESULT to plant
	movlw	0x10	
	movwf	BARGB1,1
	call	FXD2416U
	movff	AARGB2,pid_out2		;final result ---> pid_out2
	movff	AARGB1,pid_out1		;final result ---> pid_out1
	movff	AARGB0,pid_out0		;final result ---> pid_out0
	
#ifdef		pid_100				;Final result needs to be scaled down to  0 - 100%
	movlw	0x01				;% ratio for propotional only
	movwf	BARGB0,1
	movlw	0x90
	movwf	BARGB1,1
	
	btfss	pid_stat2,integ_go,1	;if integral is included then change % conversion 
	bra		conv_percent		;no do proportional only	
	bcf		pid_stat2,integ_go,1	;clear integral go bit for next operation
	movlw	0x03				;% ratio for propotional & integral only
	movwf	BARGB0,1
	movlw	0x20
	movwf	BARGB1,1
	
	btfss	pid_stat2,deriv_go,1	;if derivative is included then change % conversion
	bra		conv_percent		;no do proportional & integral only	
	bcf		pid_stat2,deriv_go,1	;clear derivative go bit for next operation
	movlw	0x06				;% ratio for propotional & integral & derivative 
	movwf	BARGB0,1
	movlw	0x40
	movwf	BARGB1,1
	
conv_percent	
	call	FXD2416U			;pid_out0:pid_out2 / % ratio = 0 - 100% value	
	movf	AARGB2,W,1			;AARGB2 --> percent_out			
	movwf	percent_out,1		;error has been scaled down and is now available in a 0 -100% range
#endif	

	movff	error0,p_error0				;maintain previous error for derivative term		
	movff	error1,p_error1				;maintain previous error for derivative term
	bcf		pid_stat1,p_err_sign,1		;make p_error negative
	btfsc	pid_stat1,err_sign,1			;make p_error the same sign as error	
	bsf		pid_stat1,p_err_sign,1		;make p_error positive	
		
	bsf		PIE1,TMR1IE					;re-enable Timer 1 interrupt
	return								;return to mainline code

	
;--------- Find Accumulative Error for Integral, Zero? Limits? --------------------
get_a_error				
	movff	a_error0,BARGB0			;load error & a_error 
	movff	a_error1,BARGB1
	movff	a_error2,BARGB2
	movff	error0,AARGB1
	movff	error1,AARGB2
	
	call	spec_sign				;call routine for add/sub sign numbers	
	btfss	pid_stat1,mag,1			;which is greater in magnitude ?
	bra		a_err_zero				;bargb, keep sign as is or both are same sign
	
	bcf		pid_stat1,a_err_sign,1	;aargb, make sign same as error, a_error is negative
	btfsc	pid_stat1,err_sign,1			
	bsf		pid_stat1,a_err_sign,1	;a_error is positive	
	
a_err_zero
	bcf		pid_stat1,a_err_z,1		;clear a_error zero flag	
	movlw	0
	cpfseq	AARGB0,1					;is byte 0 = 00		
	bra		chk_a_err_limit			;NO, done checking
	
	cpfseq	AARGB1					;is byte 1 = 00				
	bra		chk_a_err_limit			;NO, done checking
	
	cpfseq	AARGB2,1					;is byte 2 = 00		
	bra		chk_a_err_limit			;NO, done checking
	bsf		pid_stat1,a_err_z,1		;YES, set zero flag
	movff	AARGB0,a_error0			;store the a_error	
	movff	AARGB1,a_error1	
	movff	AARGB2,a_error2	
	return							;a_error = 00, return 
	
chk_a_err_limit
	movff	AARGB0,a_error0			;store the a_error	
	movff	AARGB1,a_error1	
	movff	AARGB2,a_error2	
	
	movlw	0						;a_error reached limits?
	cpfseq	a_error0,1				;Is a_error0 > 0 ??, if yes limit has been exceeded
	bra		restore_limit			;YES, restore limit value
	
	cpfseq	a_error1,1				;Is a_error1 = 0 ??, if yes, limit not exceeded
	bra		chk_a_error1			;NO
	return							;YES
chk_a_error1	
	movlw	a_err_1_lim			
	cpfsgt	a_error1,1				;Is a_error1 > a_err_1_lim??
	return							;NO
	bra		restore_limit			;YES, restore limit value
chk_a_error2	
	movlw	a_err_2_lim			
	cpfsgt	a_error2,1				;Is a_error2 > a_err_2_lim ??
	return							;NO, return to mainline code	
	
restore_limit
	clrf	a_error0,1					;YES, a_error limit has been exceeded
	movlw	0x0F				
	movwf	a_error1,1		
	movlw	0xA0
	movwf	a_error2,1	
	return							;return to mainline code
	
	
;-------------- Find Delta Error for Derivative, Zero? --------------------
get_delta_error
	clrf	AARGB0,1					;load error and p_error
	movff	error0,AARGB1		
	movff	error1,AARGB2
	clrf	BARGB0,1
	movff	p_error0,BARGB1
	movff	p_error1,BARGB2
	
	movf	pid_stat1,w,1				;pid_stat1 ---> temp_reg
	movwf	temp_reg,1				;prepare for sign check of bits 4 & 2
	movlw	b'00010100'
	andwf	temp_reg,f,1
		
	movf	temp_reg,w,1				;check error sign & a_error sign bits	
	sublw	0x00
	btfsc	STATUS,Z		
	bra		p_err_neg				;bits 4 & 2 (00) are NEGATIVE, 
	bra		other_combo2			;bits 4 & 2 not equal to 00
p_err_neg
	call	mag_and_sub			
	bcf		pid_stat1,d_err_sign,1	;d_error is negative
	btfsc	pid_stat1,p_err_sign,1	;make d_error sign same as p_error sign
	bsf		pid_stat1,d_err_sign,1	;d_error is positive
	bra		d_error_zero_chk		;check if d_error = 0

other_combo2	
	movf	temp_reg,w,1
	sublw	0x14
	btfsc	STATUS,Z
	bra		p_err_pos				;bits 4 & 2 (11) are POSITIVE
	bra 	p_err_add				;bits 4 & 2 (xx) are different signs
	
p_err_pos
	call	mag_and_sub
	bcf		pid_stat1,d_err_sign,1	;d_error is negative
	btfsc	pid_stat1,p_err_sign,1	;make d_error sign same as p_error sign
	bsf		pid_stat1,d_err_sign,1	;d_error is positive
	bra		d_error_zero_chk		;check if d_error = 0
p_err_add
	call	_24_BitAdd				;errors are different sign	
	bcf		pid_stat1,d_err_sign,1	;d_error is negative
	btfsc	pid_stat1,err_sign,1		;make d_error sign same as error sign
	bsf		pid_stat1,d_err_sign,1	;d_error is positive

d_error_zero_chk
	movff	AARGB1,d_error0	
	movff	AARGB2,d_error1	
	bcf		pid_stat2,d_err_z,1
	
	movlw	0
	cpfseq	d_error0,1			;is d_error0 = 00		
	return						;NO, done checking
	
	cpfseq	d_error1,1			;YES, is d_error1 = 00		
	return						;NO, done checking
	bsf		pid_stat2,d_err_z,1	;set delta error zero bit	
	return						;YES, return to ISR
		
	
;---------------------- Special Sign Routine ---------------------------------
spec_sign
	movff	pid_stat1,temp_reg	;pid_stat1 ---> temp_reg				
	movlw	b'00001100'			;prepare for sign check of bits 3 & 2
	andwf	temp_reg,f,1
	
	movf	temp_reg,w,1			;check error sign & a_error sign bits
	sublw	0x00
	btfsc	STATUS,Z
	bra		add_neg				;bits 3 & 2 (00) are NEGATIVE, add them
	bra		other_combo			;bits 3 & 2 not equal to 00
add_neg			
	call	_24_BitAdd			;add negative sign values	
	return
	
other_combo	
	movf	temp_reg,w,1
	sublw	0x0C
	btfsc	STATUS,Z
	bra		add_pos				;bits 3 & 2 (11) are POSITIVE, add them
	bra		find_mag_sub		;bits 3 & 2 (xx) are different signs , subtract them
add_pos
	call	_24_BitAdd			;add positive sign values
	return
find_mag_sub
	call	mag_and_sub			;subtract unlike sign numbers	
	return
	
	
;------------------- Find Magnitude and Subtract -------------------------	
mag_and_sub			
	movf	BARGB0,w,1
	subwf	AARGB0,w,1			;AARGB0 - BARGB0 --> W
	btfsc	STATUS,Z			;= zero ?
	bra		check_1				;YES
	btfsc	STATUS,C			;borrow ?
	bra		aargb_big			;AARGB0 > BARGB0, no borrow			
	bra		bargb_big			;BARGB0 > AARGB0, borrow
check_1	
	movf	BARGB1,w,1
	subwf	AARGB1,w,1			;AARGB1 - BARGB1 --> W
	btfsc	STATUS,Z			;= zero ?
	bra		check_2				;YES
	btfsc	STATUS,C			;borrow ?
	bra		aargb_big			;AARGB1 > BARGB1, no borrow			
	bra		bargb_big			;BARGB1 > AARGB1, borrow
			
check_2
	movf	BARGB2,w,1			;AARGB2 - BARGB2 --> W
	subwf	AARGB2,w,1
	btfsc	STATUS,C			;borrow ?
	bra		aargb_big			;AARGB2 > BARGB2, no borrow		
	bra		bargb_big			;BARGB2 > AARGB2, borrow
	
aargb_big
	call	_24_bit_sub		
	bsf		pid_stat1,mag,1		;AARGB is greater in magnitude
	return
	
bargb_big
	movf	BARGB1,W,1			;swap AARGB1 with BARGB1
	movff	AARGB1,temp_reg
	movwf	AARGB1,1
	movff	temp_reg,BARGB1	
	movf	BARGB2,W,1			;swap AARGB2 with BARGB2
	movff	AARGB2,temp_reg
	movwf	AARGB2,1
	movff	temp_reg,BARGB2
	call	_24_bit_sub			;BARGB > AARGB	
	bcf		pid_stat1,mag,1		;BARGB is greater in magnitude					
	return	

;------------------- High Interrupt Routine -------------------------	
;highInt
;	btfss	PIR1,TMR1IF					;has T1 overflowed?
;	retfie								;NO, exit ISR

PID_INT
	GLOBAL	PID_INT		

	bcf		PIR1,TMR1IF					;YES, clear T1 interrupt flag

	movlw	timer1_hi					;reload T1 registers with 1ms count
	movwf	TMR1H
	movlw	timer1_lo
	movwf	TMR1L

	bsf		pid_stat2,timer_expire,1

	call	PID_INT_CALC		
	retfie	FAST							;YES
	
PID_INT_CALC

	bcf		pid_stat2,timer_expire,1
	
	btfsc	pid_stat1,err_z,1				;Is error = 00 ?
	return


	
	movwf	T_WREG,1
	movff	STATUS,T_STATUS
	movff	BSR,T_BSR					;if needed
	
	movff	AARGB0,T_AARGB0			;NO, context save Math varialbes
	movff	AARGB1,T_AARGB1
	movff	AARGB2,T_AARGB2
	movff	AARGB3,T_AARGB3
	movff	BARGB0,T_BARGB0
	movff	BARGB1,T_BARGB1
	movff	BARGB2,T_BARGB2
	movff	BARGB3,T_BARGB3
	movff	REMB0,T_REMBO
	movff	REMB1,T_REMB1
	movff	TEMP,T_TEMP
	movff	TEMPB0,T_TEMPB0
	movff	TEMPB1,T_TEMPB1
	movff	TEMPB2,T_TEMPB2
	movff	TEMPB3,T_TEMPB3
	movff	ZARGB0,T_ZARGB0
	movff	ZARGB1,T_ZARGB1
	movff	ZARGB2,T_ZARGB2
	movff	CARGB2,T_CARGB2
	movff	LOOPCOUNT,T_LOOPCOUNT
	movff	temp_reg,t_temp_reg
	
	btfsc	pid_stat1,a_err_z,1			;Is a_error = 0
	bra		derivative_ready?			;YES, check if derivative is ready
	bsf		pid_stat2,integ_go,1			;NO, set intergral go bit for PID calculation
	call	start_integral				;find integral
	
derivative_ready?
	decfsz	deriv_count,f,1 				;is it time for derivative term ?
	bra		skip_deriv					;NO, finish ISR
	call	start_deriv					;YES, find derivative

			;---Get ready for Next Derivative Term	
	movlw	deriv_cnt
	movwf	deriv_count,1					;derivative action = TMR1H:TMR1L * deriv_count

skip_deriv	
;	movlw	timer1_hi					;reload T1 registers with 1ms count
;	movwf	TMR1H
;	movlw	timer1_lo
;	movwf	TMR1L
	
	movf	T_WREG,w,1
	movff	T_STATUS,STATUS
	movff	T_BSR,BSR					;if needed
	
	movff	T_AARGB0,AARGB0				;restore Math variables
	movff	T_AARGB1,AARGB1
	movff	T_AARGB2,AARGB2
	movff	T_AARGB3,AARGB3
	movff	T_BARGB0,BARGB0
	movff	T_BARGB1,BARGB1
	movff	T_BARGB2,BARGB2
	movff	T_BARGB3,BARGB3
	movff	T_REMBO,REMB0
	movff	T_REMB1,REMB1
	movff	T_TEMP,TEMP
	movff	T_TEMPB0,TEMPB0
	movff	T_TEMPB1,TEMPB1
	movff	T_TEMPB2,TEMPB2
	movff	T_TEMPB3,TEMPB3
	movff	T_ZARGB0,ZARGB0
	movff	T_ZARGB1,ZARGB1
	movff	T_ZARGB2,ZARGB2
	movff	T_CARGB2,CARGB2
	movff	T_LOOPCOUNT,LOOPCOUNT
	movff	t_temp_reg,temp_reg
	
;	RETFIE			        			;return from interrupt	
	return
	
	END               					;directive 'end of program'
	
	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产网红主播福利一区二区| 国产在线日韩欧美| 成人看片黄a免费看在线| 制服丝袜成人动漫| 亚洲成av人片一区二区梦乃 | 亚洲狼人国产精品| 国产不卡视频在线观看| 日韩欧美精品三级| 婷婷久久综合九色综合绿巨人| 99视频热这里只有精品免费| 国产女人18水真多18精品一级做| 国产精品亚洲人在线观看| 精品乱人伦小说| 国内不卡的二区三区中文字幕| 日韩亚洲欧美在线| 狠狠色丁香婷婷综合久久片| 久久这里都是精品| 国产盗摄视频一区二区三区| 中文av一区特黄| 91免费视频网址| 樱花影视一区二区| 欧美剧在线免费观看网站 | 日本久久精品电影| 亚洲国产人成综合网站| 在线成人av网站| 蜜臀av一区二区在线免费观看| 精品美女一区二区三区| 国产乱子伦视频一区二区三区| 精品免费国产一区二区三区四区| 国产一区二区三区免费在线观看| 日韩综合小视频| 日韩欧美在线综合网| 国产精品综合一区二区三区| 综合亚洲深深色噜噜狠狠网站| 日本二三区不卡| 日本不卡视频一二三区| 久久久久久久综合狠狠综合| www.av亚洲| 日韩成人伦理电影在线观看| 久久日一线二线三线suv| av在线一区二区三区| 天堂蜜桃91精品| 欧美国产亚洲另类动漫| 欧美日韩亚洲不卡| 国产mv日韩mv欧美| 亚洲国产aⅴ天堂久久| 久久嫩草精品久久久久| 91国产精品成人| 精品一区二区日韩| 亚洲国产精品嫩草影院| 欧美色综合天天久久综合精品| 欧美一级久久久久久久大片| 国产高清在线精品| 一区二区成人在线| 精品播放一区二区| 欧美性色黄大片| 国产成人亚洲综合a∨婷婷图片 | 欧美日韩一区 二区 三区 久久精品| 日本欧美一区二区三区乱码| 2023国产精品视频| 欧美亚洲免费在线一区| 国产成人免费高清| 免费在线观看一区| 亚洲午夜一区二区| 亚洲国产精品激情在线观看| 欧美一级二级在线观看| 色婷婷精品大在线视频| 国产成人免费视频精品含羞草妖精| 婷婷一区二区三区| 亚洲人成精品久久久久| 久久新电视剧免费观看| 欧美年轻男男videosbes| 欧美精品一二三区| 91日韩一区二区三区| 麻豆精品在线看| 亚洲一区二区四区蜜桃| 亚洲国产精品精华液2区45| 日韩欧美的一区二区| 在线成人免费观看| 欧美视频一区二区三区四区| 91免费国产在线| 成人激情动漫在线观看| 国产经典欧美精品| 国产麻豆成人传媒免费观看| 日韩av电影免费观看高清完整版在线观看| 亚洲日本中文字幕区| 国产精品九色蝌蚪自拍| 国产欧美日韩在线视频| 精品对白一区国产伦| 欧美mv和日韩mv国产网站| 色婷婷国产精品久久包臀| 国产不卡视频一区| 成人高清免费观看| 成人午夜精品在线| 成人高清伦理免费影院在线观看| 丁香啪啪综合成人亚洲小说 | 欧美一区二区三区思思人| 欧美日韩黄视频| 欧美麻豆精品久久久久久| 欧美日韩精品欧美日韩精品一 | |精品福利一区二区三区| 中文字幕一区二区三区精华液| 亚洲国产精品精华液2区45| 日韩一区中文字幕| 欧美韩国日本一区| 日本一二三四高清不卡| 久久精品网站免费观看| 亚洲国产精品精华液ab| 亚洲色图在线视频| 亚洲高清一区二区三区| 秋霞电影网一区二区| 精品在线观看免费| 高清国产一区二区| 色婷婷综合久久久| 91精品在线一区二区| 精品欧美乱码久久久久久| 欧美国产乱子伦| 亚洲精品免费播放| 日本亚洲一区二区| 青青草97国产精品免费观看 | 国产欧美视频一区二区| 国产精品久久久久久户外露出| 亚洲欧美偷拍三级| 日韩中文字幕麻豆| 狠狠色丁香婷婷综合| 在线观看国产91| 日韩视频免费观看高清完整版在线观看 | 亚洲国产另类av| 久久99精品久久久久久国产越南 | 成人黄色网址在线观看| 91在线你懂得| 69堂精品视频| 国产精品欧美精品| 天堂久久久久va久久久久| 国内成人精品2018免费看| 日本久久电影网| 亚洲精品一区二区三区香蕉| 亚洲天堂免费看| 精品在线观看视频| 国产一区二区三区免费| 99视频精品免费视频| 日韩一级高清毛片| 日韩一区中文字幕| 美女国产一区二区三区| 91欧美激情一区二区三区成人| 日韩一区二区在线看| 亚洲一区中文在线| 91蝌蚪国产九色| 国产精品私人自拍| 国产精品亚洲а∨天堂免在线| 欧美一级片免费看| 天天色综合天天| 欧美体内she精高潮| 亚洲人成伊人成综合网小说| 成人深夜视频在线观看| 久久久久久久久久久久久久久99| 美女看a上一区| 日韩欧美国产精品| 美女一区二区久久| 91精品久久久久久蜜臀| 丝袜美腿亚洲一区| 欧美老肥妇做.爰bbww| 成人网男人的天堂| 国产精品看片你懂得| 丁香婷婷综合激情五月色| 欧美国产成人精品| 懂色av中文一区二区三区 | 国产日韩综合av| 国产在线视视频有精品| 久久一区二区三区四区| 国产一区二区电影| 亚洲国产精品国自产拍av| 粉嫩蜜臀av国产精品网站| 中文字幕精品三区| 97精品电影院| 亚洲一区自拍偷拍| 欧美一区二区久久| 黑人巨大精品欧美黑白配亚洲| 精品成人私密视频| 成人免费看视频| 一级特黄大欧美久久久| 欧美日韩免费电影| 免费高清不卡av| 久久先锋影音av鲁色资源网| 国产成人av电影在线观看| 中文字幕日韩一区二区| 欧美在线观看一二区| 天天影视色香欲综合网老头| 精品国产伦一区二区三区观看方式 | 精品国产免费久久| 成人午夜电影网站| 亚洲国产人成综合网站| 日韩欧美国产1| 福利一区二区在线观看| 亚洲精品亚洲人成人网| 欧美一区二区精美| 国产精品性做久久久久久| 怡红院av一区二区三区| 日韩一区国产二区欧美三区| 国产成人在线视频免费播放|