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

📄 minid.lst

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0163 9508      RET
FILE: D:\bak\新建文件夹\函数库\ENC\ENC.c
(0001) /*****************************************************************
(0002)  *  文件名:      ENC.c
(0003)  *  版本号:      
(0004)  *  创作日期:    2005.7.7
(0005)  *  作者:        wangzq
(0006)  *  功能说明:    采集转速数值
(0007)  
(0008)  *  其它说明:    使用AVR单片机Atmaga48, 晶振:8Mhz
(0009)                   
(0010)  *****************************************************************/
(0011)  
(0012) 
(0013) /*****************************************************************
(0014) 
(0015)  *   修改日期:     
(0016)  *   修改人:	  
(0017)  *   修改原因:   
(0018)                   
(0019) *******************************************************************/
(0020) 
(0021) 
(0022) //包含文件
(0023) #include "ENC.h"
(0024) 
(0025) //TIMER1 initialize - prescale:1
(0026) // WGM: 0) Normal, TOP=0xFFFF
(0027) // desired value: 
(0028) // actual value: Out of range
(0029) void timer1_init(void)
(0030) {
(0031)  TCCR1B = 0x00; //stop
_timer1_init:
    0164 2422      CLR	R2
    0165 92200081  STS	0x81,R2
(0032)  TCNT1H = 0x00 /*INVALID SETTING*/; //setup
    0167 92200085  STS	0x85,R2
(0033)  TCNT1L = 0x00 /*INVALID SETTING*/;
    0169 92200084  STS	0x84,R2
(0034)  OCR1AH = 0x00 /*INVALID SETTING*/;
    016B 92200089  STS	0x89,R2
(0035)  OCR1AL = 0x00 /*INVALID SETTING*/;
    016D 92200088  STS	0x88,R2
(0036)  OCR1BH = 0x00 /*INVALID SETTING*/;
    016F 9220008B  STS	0x8B,R2
(0037)  OCR1BL = 0x00 /*INVALID SETTING*/;
    0171 9220008A  STS	0x8A,R2
(0038)  ICR1H  = 0x00 /*INVALID SETTING*/;
    0173 92200087  STS	0x87,R2
(0039)  ICR1L  = 0x00 /*INVALID SETTING*/;
    0175 92200086  STS	0x86,R2
(0040)  TCCR1A = 0x00;
    0177 92200080  STS	0x80,R2
(0041)  TCCR1B = 0xC1; //start Timer
    0179 EC81      LDI	R24,0xC1
    017A 93800081  STS	0x81,R24
    017C 9508      RET
_timer1_capt_isr:
    017D 922A      ST	R2,-Y
    017E 923A      ST	R3,-Y
    017F 924A      ST	R4,-Y
    0180 925A      ST	R5,-Y
    0181 928A      ST	R8,-Y
    0182 929A      ST	R9,-Y
    0183 938A      ST	R24,-Y
    0184 939A      ST	R25,-Y
    0185 93EA      ST	R30,-Y
    0186 B62F      IN	R2,0x3F
    0187 922A      ST	R2,-Y
    0188 D6D7      RCALL	push_gset2
(0042) }
(0043) 
(0044) #pragma interrupt_handler timer1_capt_isr:11
(0045) void timer1_capt_isr(void)
(0046) {
(0047) 	g_CntUpdate = ICR1L;
    0189 90200086  LDS	R2,0x86
    018B 2433      CLR	R3
    018C 9230013A  STS	g_CntUpdate+1,R3
    018E 92200139  STS	g_CntUpdate,R2
(0048) 	g_CntUpdate |=(int)ICR1H << 8;
    0190 90200087  LDS	R2,0x87
    0192 2433      CLR	R3
    0193 2C32      MOV	R3,R2
    0194 2422      CLR	R2
    0195 90400139  LDS	R4,g_CntUpdate
    0197 9050013A  LDS	R5,g_CntUpdate+1
    0199 2842      OR	R4,R2
    019A 2853      OR	R5,R3
    019B 9250013A  STS	g_CntUpdate+1,R5
    019D 92400139  STS	g_CntUpdate,R4
(0049) 	
(0050) 	if ((TIFR1&0x01) != 0)       //判断定时器1溢出
    019F 9BB0      SBIS	0x16,0
    01A0 C006      RJMP	0x01A7
(0051) 	{
(0052) 	g_TotalEnc++;
    01A1 9180013B  LDS	R24,g_TotalEnc
    01A3 5F8F      SUBI	R24,0xFF
    01A4 9380013B  STS	g_TotalEnc,R24
(0053) 	TIFR1 |= 0x01;              //取消定时器1溢出标志位
    01A6 9AB0      SBI	0x16,0
(0054) 	}
(0055) 	
(0056) 	if (g_CntOld < g_CntUpdate)
    01A7 90200139  LDS	R2,g_CntUpdate
    01A9 9030013A  LDS	R3,g_CntUpdate+1
    01AB 90400137  LDS	R4,g_CntOld
    01AD 90500138  LDS	R5,g_CntOld+1
    01AF 1442      CP	R4,R2
    01B0 0453      CPC	R5,R3
    01B1 F498      BCC	0x01C5
(0057) 	{
(0058) 	g_DeltaEnc = g_CntUpdate - g_CntOld;
    01B2 0112      MOVW	R2,R4
    01B3 90400139  LDS	R4,g_CntUpdate
    01B5 9050013A  LDS	R5,g_CntUpdate+1
    01B7 1842      SUB	R4,R2
    01B8 0853      SBC	R5,R3
    01B9 0112      MOVW	R2,R4
    01BA 2444      CLR	R4
    01BB 2455      CLR	R5
    01BC 92300134  STS	g_DeltaEnc+1,R3
    01BE 92200133  STS	g_DeltaEnc,R2
    01C0 92500136  STS	g_DeltaEnc+3,R5
    01C2 92400135  STS	g_DeltaEnc+2,R4
(0059) 		
(0060) 	}
    01C4 C020      RJMP	0x01E5
(0061) 	else 
(0062) 	{
(0063) 	g_DeltaEnc = (0x10000 - g_CntOld) + g_CntUpdate;
    01C5 90200137  LDS	R2,g_CntOld
    01C7 90300138  LDS	R3,g_CntOld+1
    01C9 2444      CLR	R4
    01CA 2455      CLR	R5
    01CB E040      LDI	R20,0
    01CC E050      LDI	R21,0
    01CD E061      LDI	R22,1
    01CE E070      LDI	R23,0
    01CF 1942      SUB	R20,R2
    01D0 0953      SBC	R21,R3
    01D1 0964      SBC	R22,R4
    01D2 0975      SBC	R23,R5
    01D3 90200139  LDS	R2,g_CntUpdate
    01D5 9030013A  LDS	R3,g_CntUpdate+1
    01D7 2444      CLR	R4
    01D8 2455      CLR	R5
    01D9 0D42      ADD	R20,R2
    01DA 1D53      ADC	R21,R3
    01DB 1D64      ADC	R22,R4
    01DC 1D75      ADC	R23,R5
    01DD 93500134  STS	g_DeltaEnc+1,R21
    01DF 93400133  STS	g_DeltaEnc,R20
    01E1 93700136  STS	g_DeltaEnc+3,R23
    01E3 93600135  STS	g_DeltaEnc+2,R22
(0064) 	}
(0065) 	
(0066) 	if (g_TotalEnc > 10) 
    01E5 E08A      LDI	R24,0xA
    01E6 9020013B  LDS	R2,g_TotalEnc
    01E8 1582      CP	R24,R2
    01E9 F500      BCC	0x020A
(0067) 	g_TotalEnc = 10;
    01EA 9380013B  STS	g_TotalEnc,R24
(0068) 	
(0069) 	for (; g_TotalEnc != 0; g_TotalEnc--)
    01EC C01D      RJMP	0x020A
(0070) 	{
(0071) 	g_DeltaEnc += 0x10000;
    01ED E040      LDI	R20,0
    01EE E050      LDI	R21,0
    01EF E061      LDI	R22,1
    01F0 E070      LDI	R23,0
    01F1 90400135  LDS	R4,g_DeltaEnc+2
    01F3 90500136  LDS	R5,g_DeltaEnc+3
    01F5 90200133  LDS	R2,g_DeltaEnc
    01F7 90300134  LDS	R3,g_DeltaEnc+1
    01F9 0E24      ADD	R2,R20
    01FA 1E35      ADC	R3,R21
    01FB 1E46      ADC	R4,R22
    01FC 1E57      ADC	R5,R23
    01FD 92300134  STS	g_DeltaEnc+1,R3
    01FF 92200133  STS	g_DeltaEnc,R2
    0201 92500136  STS	g_DeltaEnc+3,R5
    0203 92400135  STS	g_DeltaEnc+2,R4
    0205 9180013B  LDS	R24,g_TotalEnc
    0207 5081      SUBI	R24,1
    0208 9380013B  STS	g_TotalEnc,R24
    020A 9020013B  LDS	R2,g_TotalEnc
    020C 2022      TST	R2
    020D F6F9      BNE	0x01ED
(0072) 	}
(0073) 	/*
(0074) 	g_DeltaEnc *= 125;
(0075) 	g_DeltaEnc /=1000;
(0076) 	g_DeltaEnc *= 72;
(0077) 	g_DeltaEnc = 3 000 000 / g_DeltaEnc;
(0078) 	
(0079) 	//if (g_DeltaEnc > 6000)
(0080) 	//g_DeltaEnc = 6000;
(0081) 	//g_DeltaEnc *= 0xff;
(0082) 	//g_DeltaEnc /=6000;
(0083) 	*/
(0084) 	g_TotalEnc = 0;				//速度溢出标志清零
    020E 2422      CLR	R2
    020F 9220013B  STS	g_TotalEnc,R2
(0085) 	g_CntOld = g_CntUpdate;		//准备下次采样
    0211 90200139  LDS	R2,g_CntUpdate
    0213 9030013A  LDS	R3,g_CntUpdate+1
    0215 92300138  STS	g_CntOld+1,R3
    0217 92200137  STS	g_CntOld,R2
    0219 D63A      RCALL	pop_gset2
    021A 9029      LD	R2,Y+
    021B BE2F      OUT	0x3F,R2
    021C 91E9      LD	R30,Y+
    021D 9199      LD	R25,Y+
    021E 9189      LD	R24,Y+
    021F 9099      LD	R9,Y+
    0220 9089      LD	R8,Y+
    0221 9059      LD	R5,Y+
    0222 9049      LD	R4,Y+
    0223 9039      LD	R3,Y+
    0224 9029      LD	R2,Y+
    0225 9518      RETI
_timer1_ovf_isr:
    0226 938A      ST	R24,-Y
    0227 939A      ST	R25,-Y
    0228 B78F      IN	R24,0x3F
    0229 938A      ST	R24,-Y
(0086) }
(0087) 
(0088) 
(0089) 
(0090) #pragma interrupt_handler timer1_ovf_isr:14
(0091) void timer1_ovf_isr(void)
(0092) {
(0093) 	g_TotalEnc ++; 				//速度溢出标志
    022A 9180013B  LDS	R24,g_TotalEnc
    022C 5F8F      SUBI	R24,0xFF
    022D 9380013B  STS	g_TotalEnc,R24
    022F 9189      LD	R24,Y+
    0230 BF8F      OUT	0x3F,R24
    0231 9199      LD	R25,Y+
    0232 9189      LD	R24,Y+
    0233 9518      RETI
_det_err:
  sign                 --> R20
    0234 D62D      RCALL	push_gset1
FILE: D:\bak\新建文件夹\函数库\ERR\Err.c
(0001) /*****************************************************************
(0002)  *  文件名:      		Err.c
(0003)  *  版本号:      
(0004)  *  创作日期:    	2005.7.13
(0005)  *  作者:        		Zhoujie
(0006)  *  功能说明:    	故障检测与故障处理
(0007)  *  其它说明:    
(0008)  
(0009)  *****************************************************************/
(0010)  
(0011) 
(0012) /*****************************************************************
(0013) 
(0014)  *   修改日期:     
(0015)  *   修改人:
(0016)  *   修改原因:
(0017) 
(0018) *******************************************************************/
(0019) 
(0020) #include "Err.h"
(0021) 
(0022) // 检测以及处理故障函数
(0023) // 依次检测是否出现各种故障
(0024) // 按照检测到的先后顺序
(0025) // 控制LED 灯显示最先检测到的故障
(0026) // 随后检测到的故障将相应的错误位置起来
(0027) // 怎样清除故障显示 ?
(0028) void det_err(void)
(0029) {
(0030) 	byte sign;
(0031) 
(0032) 	if (g_Err_Det_Disable)
    0235 9020011F  LDS	R2,g_Err_Det_Disable
    0237 2022      TST	R2
    0238 F009      BEQ	0x023A
(0033) 		return;
    0239 C07B      RJMP	0x02B5
(0034) 	
(0035) 	sign = 1;
    023A E041      LDI	R20,1
(0036) 	
(0037) 	if (det_err_over_flow())
    023B D07B      RCALL	_det_err_over_flow
    023C 2300      TST	R16
    023D F041      BEQ	0x0246
(0038) 	{
(0039) 		RED_ON();
    023E B188      IN	R24,0x08
    023F 7088      ANDI	R24,0x8
    0240 B988      OUT	0x08,R24
(0040) 		GREEN_OFF();
    0241 9A42      SBI	0x08,2
(0041) 		sign = 0;
    0242 2744      CLR	R20
(0042) 		g_Err_Det_Disable = 1;
    0243 E081      LDI	R24,1
    0244 9380011F  STS	g_Err_Det_Disable,R24
(0043) 	}
(0044) 	if ( (det_err_inver_protect()) && sign )
    0246 D079      RCALL	_det_err_inver_protect
    0247 2300      TST	R16
    0248 F051      BEQ	0x0253
    0249 2344      TST	R20
    024A F041      BEQ	0x0253
(0045) 	{
(0046) 		led_flicker(1,2);
    024B E022      LDI	R18,2
    024C E001      LDI	R16,1
    024D D0CA      RCALL	_led_flicker
(0047) 		GREEN_OFF();
    024E 9A42      SBI	0x08,2
(0048) 		sign = 0;
    024F 2744      CLR	R20
(0049) 		g_Err_Det_Disable = 1;
    0250 E081      LDI	R24,1
    0251 9380011F  STS	g_Err_Det_Disable,R24
(0050) 	}
(0051) 	if ((det_err_low_vol()) && sign )
    0253 D079      RCALL	_det_err_low_vol
    0254 2300      TST	R16
    0255 F051      BEQ	0x0260
    0256 2344      TST	R20
    0257 F041      BEQ	0x0260
(0052) 	{
(0053) 		led_flicker(1,3);
    0258 E023      LDI	R18,3
    0259 E001      LDI	R16,1
    025A D0BD      RCALL	_led_flicker
(0054) 		GREEN_OFF();
    025B 9A42      SBI	0x08,2
(0055) 		sign = 0;
    025C 2744      CLR	R20
(0056) 		g_Err_Det_Disable = 1;
    025D E081      LDI	R24,1
    025E 9380011F  STS	g_Err_Det_Disable,R24
(0057) 	}
(0058) 	if ((	det_err_no_stop_needle()) && sign)
    0260 D077      RCALL	_det_err_no_stop_needle
    0261 2300      TST	R16
    0262 F051      BEQ	0x026D
    0263 2344      TST	R20
    0264 F041      BEQ	0x026D
(0059) 	{
(0060) 		led_flicker(1,4);
    0265 E024      LDI	R18,4
    0266 E001      LDI	R16,1
    0267 D0B0      RCALL	_led_flicker
(0061) 		GREEN_OFF();
    0268 9A42      SBI	0x08,2
(0062) 		sign = 0;
    0269 2744      CLR	R20
(0063) 		g_Err_Det_Disable = 1;
    026A E081      LDI	R24,1
    026B 9380011F  STS	g_Err_Det_Disable,R24
(0064) 	}
(0065) 	if ((det_err_over_vol()) && sign )
    026D D075      RCALL	_det_err_over_vol
    026E 2300      TST	R16
    026F F051      BEQ	0x027A
    0270 2344      TST	R20
    0271 F041      BEQ	0x027A
(0066) 	{
(0067) 		led_flicker(1,5);
    0272 E025      LDI	R18,5
    0273 E001      LDI	R16,1
    0274 D0A3      RCALL	_led_flicker
(0068) 		GREEN_OFF();
    0275 9A42      SBI	0x08,2
(0069) 		sign = 0;
    0276 2744      CLR	R20
(0070) 		g_Err_Det_Disable = 1;
    0277 E081      LDI	R24,1
    0278 9380011F  STS	g_Err_Det_Disable,R24
(0071) 	}
(0072) 	if ((det_err_solenoid_short()) && sign )
    027A D073      RCALL	_det_err_solenoid_short
    027B 2300      TST	R16
    027C F061      BEQ	0x0289
    027D 2344      TST	R20
    027E F051      BEQ	0x0289
(0073) 	{
(0074) 		RED_ON();
    027F B188      IN	R24,0x08
    0280 7088      ANDI	R24,0x8
    0281 B988      OUT	0x08,R24
(0075) 		led_flicker(0,1);
    0282 E021      LDI	R18,1
    0283 2700      CLR	R16
    0284 D093      RCALL	_led_flicker
(0076) 		sign = 0;
    0285 2744      CLR	R20
(0077) 		g_Err_Det_Disable = 1;
    0286 E081      LDI	R24,1
    0287 9380011F  STS	g_Err_Det_Disable,R24
(0078) 	}
(0079) 	if ((det_err_syn_encoder()) && sign )
    0289 D06D      RCALL	_det_err_syn_encoder
    028A 2300      TST	R16
    028B F061      BEQ	0x0298
    028C 2344      TST	R20
    028D F051      BEQ	0x0298
(0080) 	{
(0081) 		RED_ON();
    028E B188      IN	R24,0x08
    028F 7088      ANDI	R24,0x8
    0290 B988      OUT	0x08,R24
(0082) 		led_flicker(0,2);
    0291 E022      LDI	R18,2
    0292 2700      CLR	R16
    0293 D084      RCALL	_led_flicker
(0083) 		sign = 0;
    0294 2744      CLR	R20
(0084) 		g_Err_Det_Disable = 1;
    0295 E081      LDI	R24,1
    0296 9380011F  STS	g_Err_Det_Disable,R24
(0085) 	}
(0086) 	if ((det_err_motor_block()) && sign )
    0298 D069      RCALL	_det_err_motor_block
    0299 2300      TST	R16

⌨️ 快捷键说明

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