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

📄 motor.s

📁 avr单片机ATMega16对三相异步电机的智能控制源码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module motor.c
	.area data(ram, con, rel)
L5:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
L6:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.area text(rom, con, rel)
	.dbfile E:\_ING\文档\_STQ\easy-STQ-20080712\motor.c
	.dbfunc e Motor _Motor fV
	.dbsym s KeyTemp L6 c
	.dbsym s KeyLast L5 c
	.even
_Motor::
	xcall push_gset5
	sbiw R28,4
	.dbline -1
	.dbline 26
; 
; ///////////////////////////////////////////////////////////////
; /**************************************************************
; 
; 	公司名称:	 扬州恒博科技
; 	模块名	:	 点动型STQ执行机构主控程序 
; 	创建人	:	 章俭文                                         
; 	日期	:	 2008/08/19	                                         
; 	功能描述:   完成对本地旋钮和远程开关量的控制功能                                
; 	其它说明:   编译环境为ICCAVR V6.31A                                            
; 	版本	:	 V1.0
; 
; **************************************************************/
; ///////////////////////////////////////////////////////////////
; 
; #define MOTOR_GLOBAL
; #include "motor.h" 
;   
; static void MotorLocal(void);		  //本地控制
; static void MotorRemote3(void);	  	  //远程三线制
; static void MotorRemote4(void);	  	  //远程四线制	
;   
; 
; 
; void Motor(void)					  //电机任务
; {
	.dbline 30
;  	 								  //一个任务周期的信号消抖动
;  static uchar KeyLast = 0, KeyTemp = 0;			  
;  
;  KeyTemp = (GetLocalClose()|GetLocalOpen()<<1|GetLocal()<<2|GetRemote()<<3|\
	sbic 0x13,6
	rjmp L7
	ldi R24,1
	ldi R25,0
	std y+3,R25
	std y+2,R24
	xjmp L8
L7:
	clr R0
	clr R1
	std y+3,R1
	std y+2,R0
L8:
	sbic 0x13,7
	rjmp L9
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	xjmp L10
L9:
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
L10:
	sbic 0x19,6
	rjmp L11
	ldi R24,1
	ldi R25,0
	movw R14,R24
	xjmp L12
L11:
	clr R14
	clr R15
L12:
	sbic 0x19,5
	rjmp L13
	ldi R24,1
	ldi R25,0
	movw R12,R24
	xjmp L14
L13:
	clr R12
	clr R13
L14:
	sbic 0x10,3
	rjmp L15
	ldi R24,1
	ldi R25,0
	movw R10,R24
	xjmp L16
L15:
	clr R10
	clr R11
L16:
	sbic 0x10,4
	rjmp L17
	ldi R22,1
	ldi R23,0
	xjmp L18
L17:
	clr R22
	clr R23
L18:
	sbic 0x10,5
	rjmp L19
	ldi R20,1
	ldi R21,0
	xjmp L20
L19:
	clr R20
	clr R21
L20:
	ldd R2,y+0
	ldd R3,y+1
	lsl R2
	rol R3
	ldd R4,y+2
	ldd R5,y+3
	or R4,R2
	or R5,R3
	movw R2,R14
	lsl R2
	rol R3
	lsl R2
	rol R3
	or R4,R2
	or R5,R3
	movw R2,R12
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	or R4,R2
	or R5,R3
	movw R2,R10
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	or R4,R2
	or R5,R3
	ldi R18,5
	ldi R19,0
	movw R16,R22
	xcall lsl16
	or R4,R16
	or R5,R17
	ldi R18,6
	ldi R19,0
	movw R16,R20
	xcall lsl16
	or R4,R16
	or R5,R17
	sts L6,R4
	xjmp L22
L21:
	.dbline 36
;                          GetRemoteStop()<<4|GetRemoteClose()<<5|GetRemoteOpen()<<6);
; 						 
; 						 			  //当有信号时消抖动											
;  while(GetLocalClose()||GetLocalOpen()||GetLocal()||GetRemote()||\
;                          GetRemoteStop()||GetRemoteClose()||GetRemoteOpen())
;  { 
	.dbline 37
;   if(KeyTemp == KeyLast) break;		  //如两次电机任务扫描键值相等,跳出并执行后面代码										  
	lds R2,L5
	lds R3,L6
	cp R3,R2
	brne L24
	.dbline 37
	xjmp L23
L24:
	.dbline 39
	.dbline 40
	lds R2,L6
	sts L5,R2
	.dbline 41
	xjmp L4
L22:
	.dbline 34
	sbis 0x13,6
	rjmp L21
	sbis 0x13,7
	rjmp L21
	sbis 0x19,6
	rjmp L21
	sbis 0x19,5
	rjmp L21
	sbis 0x10,3
	rjmp L21
	sbis 0x10,4
	rjmp L21
	sbis 0x10,5
	rjmp L21
L23:
	.dbline 45
;   else 
;   {
;    KeyLast = KeyTemp;				  //保存上次扫描键值
;    return; 	 		 	 		
;   }
;  } 
;  
;  if(KeyTemp == 0)StopMotor();     	  //所有信号丢失时关电机保护	
	lds R2,L6
	tst R2
	brne L26
	.dbline 45
	xcall _StopMotor
L26:
	.dbline 47
;     
;  ProtectMotor();  						  //电机过热、限位保护
	xcall _ProtectMotor
	.dbline 49
;   
;  if( GetLocal()&&(!GetRemote()))	  //本地控制
	sbic 0x19,6
	rjmp L28
	sbis 0x19,5
	rjmp L28
	.dbline 50
;  {
	.dbline 51
;   SetLocalLed();
	cbi 0x18,5
	.dbline 52
;   ClrRemoteLed();
	sbi 0x18,6
	.dbline 54
;  
;   if(ControlFlag != IN_LOCAL)		  //控制状态转换
	lds R24,_ControlFlag
	cpi R24,1
	breq L30
	.dbline 55
;   {
	.dbline 56
;    StopMotor();   
	xcall _StopMotor
	.dbline 57
;    ControlFlag = IN_LOCAL;
	ldi R24,1
	sts _ControlFlag,R24
	.dbline 58
;   }
L30:
	.dbline 60
;      
;   MotorLocal();
	xcall _MotorLocal
	.dbline 61
;  }
L28:
	.dbline 64
;  
;   			   	 		  			  //远程三线制
;  if( (!GetLocal()) && GetRemote() && GetRemoteMode() )		
	sbis 0x19,6
	rjmp L32
	sbic 0x19,5
	rjmp L32
	sbis 0x19,0
	rjmp L32
	.dbline 65
;  {
	.dbline 66
;   ClrLocalLed();
	sbi 0x18,5
	.dbline 67
;   SetRemoteLed();
	cbi 0x18,6
	.dbline 69
;   
;   if(ControlFlag != IN_REMOTE3)		 //控制状态转换
	lds R24,_ControlFlag
	cpi R24,2
	breq L34
	.dbline 70
;   {
	.dbline 71
;    StopMotor();   
	xcall _StopMotor
	.dbline 72
;    ControlFlag = IN_REMOTE3;
	ldi R24,2
	sts _ControlFlag,R24
	.dbline 73
;   }
L34:
	.dbline 75
;   
;   MotorRemote3();
	xcall _MotorRemote3
	.dbline 76
;  }
L32:
	.dbline 79
;  
;   				 					 //远程四线制
;  if( (!GetLocal()) && GetRemote() && (!GetRemoteMode()) )		
	sbis 0x19,6
	rjmp L36
	sbic 0x19,5
	rjmp L36
	sbic 0x19,0
	rjmp L36
	.dbline 80
;  {
	.dbline 81
;   ClrLocalLed();
	sbi 0x18,5
	.dbline 82
;   SetRemoteLed();
	cbi 0x18,6
	.dbline 84
;   
;   if(ControlFlag != IN_REMOTE4)		//控制状态转换
	lds R24,_ControlFlag
	cpi R24,3
	breq L38
	.dbline 85
;   {
	.dbline 86
;    StopMotor();   
	xcall _StopMotor
	.dbline 87
;    ControlFlag = IN_REMOTE4;
	ldi R24,3
	sts _ControlFlag,R24
	.dbline 88
;   }
L38:
	.dbline 90
	xcall _MotorRemote4
	.dbline 91
L36:
	.dbline -2
L4:
	adiw R28,4
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc s MotorLocal _MotorLocal fV
	.even
_MotorLocal:
	.dbline -1
	.dbline 97
;   
;   MotorRemote4();
;  } 
;       
; }//end of 电机任务
; 
; 
; static void MotorLocal(void)             //本地控制
; { 
	.dbline 98
;  if(GetLocalOpen()&&!GetLocalClose())	 //本地开
	sbic 0x13,7
	rjmp L41
	sbis 0x13,6
	rjmp L41
	.dbline 99
;  {
	.dbline 100
;   if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
	xcall _GetLimitOpen
	tst R16
	brne L43
	sbic 0x19,2
	rjmp L43
	lds R24,_MotorFlag
	cpi R24,1
	breq L43
	.dbline 101
;   {
	.dbline 102
;    OpenMotor();   						//开电机
	xcall _OpenMotor
	.dbline 103
;   }
L43:
	.dbline 106
;  
;   
;  }
L41:
	.dbline 108
; 
;  if(GetLocalClose()&&!GetLocalOpen())	 //本地关
	sbic 0x13,6
	rjmp L45
	sbis 0x13,7
	rjmp L45
	.dbline 109
;  {  
	.dbline 110
;   if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
	xcall _GetLimitClose
	tst R16
	brne L47
	sbic 0x19,2
	rjmp L47
	lds R24,_MotorFlag
	cpi R24,2
	breq L47
	.dbline 111
;   {
	.dbline 112
;    CloseMotor();
	xcall _CloseMotor
	.dbline 113
;   }
L47:
	.dbline 114
L45:
	.dbline -2
L40:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc s MotorRemote3 _MotorRemote3 fV
	.even
_MotorRemote3:
	.dbline -1
	.dbline 120
;  }
;  
; }//edd of 本地控制
; 
; 
; static void MotorRemote3(void)           //远程三线制
; { 
	.dbline 121
;  if(GetRemoteOpen()&&!GetRemoteClose())	 //远程三线开
	sbic 0x10,5
	rjmp L50
	sbis 0x10,4
	rjmp L50
	.dbline 122
;  {  
	.dbline 123
;   if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
	xcall _GetLimitOpen
	tst R16
	brne L52
	sbic 0x19,2
	rjmp L52
	lds R24,_MotorFlag
	cpi R24,1
	breq L52
	.dbline 124
;   {
	.dbline 125
;    OpenMotor();   
	xcall _OpenMotor
	.dbline 126
;   }
L52:
	.dbline 127
;  }
L50:
	.dbline 129
; 
;  if(GetRemoteClose()&&!GetRemoteOpen())	 //远程三线关
	sbic 0x10,4
	rjmp L54
	sbis 0x10,5
	rjmp L54
	.dbline 130
;  {
	.dbline 131
;   if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
	xcall _GetLimitClose
	tst R16
	brne L56
	sbic 0x19,2
	rjmp L56
	lds R24,_MotorFlag
	cpi R24,2
	breq L56
	.dbline 132
;   {
	.dbline 133
;    CloseMotor();
	xcall _CloseMotor
	.dbline 134
;   }
L56:
	.dbline 136
L54:
	.dbline -2
L49:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc s MotorRemote4 _MotorRemote4 fV
	.even
_MotorRemote4:
	.dbline -1
	.dbline 143
;   
;  }
; }
; 
; 
; 
; 
; static void MotorRemote4(void) 				//远程四线制
; { 
	.dbline 144
;  if(GetRemoteStop())	        			//远程四线停
	sbic 0x10,3
	rjmp L59
	.dbline 145
;  {
	.dbline 146
;   StopMotor();
	xcall _StopMotor
	.dbline 147
;  }
L59:
	.dbline 149
;   			  								//远程四线开
;  if(GetRemoteOpen()&&!GetRemoteClose()&&!GetRemoteStop())	 
	sbic 0x10,5
	rjmp L61
	sbis 0x10,4
	rjmp L61
	sbis 0x10,3
	rjmp L61
	.dbline 150
;  {  
	.dbline 151
;   if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
	xcall _GetLimitOpen
	tst R16
	brne L63
	sbic 0x19,2
	rjmp L63
	lds R24,_MotorFlag
	cpi R24,1
	breq L63
	.dbline 152
;   {
	.dbline 153
;    OpenMotor();   
	xcall _OpenMotor
	.dbline 154
;   }
L63:
	.dbline 155
;  }
L61:
	.dbline 157
;    				  						   //远程四线关
;  if(GetRemoteClose()&&!GetRemoteOpen()&&!GetRemoteStop())	 
	sbic 0x10,4
	rjmp L65
	sbis 0x10,5
	rjmp L65
	sbis 0x10,3
	rjmp L65
	.dbline 158
;  {  
	.dbline 159
;   if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
	xcall _GetLimitClose
	tst R16
	brne L67
	sbic 0x19,2
	rjmp L67
	lds R24,_MotorFlag
	cpi R24,2
	breq L67

⌨️ 快捷键说明

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