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

📄 minid.lst

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 LST
📖 第 1 页 / 共 5 页
字号:
    029A F061      BEQ	0x02A7
    029B 2344      TST	R20
    029C F051      BEQ	0x02A7
(0087) 	{
(0088) 		RED_ON();
    029D B188      IN	R24,0x08
    029E 7088      ANDI	R24,0x8
    029F B988      OUT	0x08,R24
(0089) 		led_flicker(0,3);
    02A0 E023      LDI	R18,3
    02A1 2700      CLR	R16
    02A2 D075      RCALL	_led_flicker
(0090) 		sign = 0;
    02A3 2744      CLR	R20
(0091) 		g_Err_Det_Disable = 1;
    02A4 E081      LDI	R24,1
    02A5 9380011F  STS	g_Err_Det_Disable,R24
(0092) 	}
(0093) 	if (det_err_motor_hall() && sign)
    02A7 D065      RCALL	_det_err_motor_hall
    02A8 2300      TST	R16
    02A9 F059      BEQ	0x02B5
    02AA 2344      TST	R20
    02AB F049      BEQ	0x02B5
(0094) 	{
(0095) 		RED_ON();
    02AC B188      IN	R24,0x08
    02AD 7088      ANDI	R24,0x8
    02AE B988      OUT	0x08,R24
(0096) 		led_flicker(0,4);
    02AF E024      LDI	R18,4
    02B0 2700      CLR	R16
    02B1 D066      RCALL	_led_flicker
(0097) 		g_Err_Det_Disable = 1;
    02B2 E081      LDI	R24,1
    02B3 9380011F  STS	g_Err_Det_Disable,R24
(0098) 	}
    02B5 D5AF      RCALL	pop_gset1
    02B6 9508      RET
(0099) 	
(0100) }
(0101) 
(0102) 
(0103) // 硬件过流检测
(0104) // 需要A/D 模块控制当母线电流大于20A,FO_MCU由低电平转到高电平
(0105) byte det_err_over_flow(void)
(0106) {
(0107) 	if ( FO_MCU() != 0 )
_det_err_over_flow:
    02B7 9B40      SBIS	0x08,0
    02B8 C006      RJMP	0x02BF
(0108) 	{
(0109) 		g_ErrCode01  |= 0x01;
    02B9 91800132  LDS	R24,g_ErrCode01
    02BB 6081      ORI	R24,1
    02BC 93800132  STS	g_ErrCode01,R24
(0110) 		return 1;
    02BE E001      LDI	R16,1
    02BF 9508      RET
(0111) 	}
(0112) }
(0113) 
(0114) // 反转保护检测
(0115) // 当电机反转180度机械角,REV_MCU由高电平转到低电平;
(0116) byte det_err_inver_protect(void)
(0117) {
(0118) 	if  ( ( REV_MCU() == 0 ) && (g_MotorRun) )
_det_err_inver_protect:
    02C0 2422      CLR	R2
    02C1 F051      BEQ	0x02CC
    02C2 90200130  LDS	R2,g_MotorRun
    02C4 2022      TST	R2
    02C5 F031      BEQ	0x02CC
(0119) 	{
(0120) 		g_ErrCode01  |= 0x02;
    02C6 91800132  LDS	R24,g_ErrCode01
    02C8 6082      ORI	R24,2
    02C9 93800132  STS	g_ErrCode01,R24
(0121) 		return 1;
    02CB E001      LDI	R16,1
    02CC 9508      RET
(0122) 	}
(0123) }
(0124) 
(0125) // 欠压检测
(0126) // 在定时器中断服务函数中检测
(0127) byte det_err_low_vol(void)
(0128) {
(0129) 	if (g_LowVol)
_det_err_low_vol:
    02CD 9020012D  LDS	R2,g_LowVol
    02CF 2022      TST	R2
    02D0 F031      BEQ	0x02D7
(0130) 	{
(0131) 		g_ErrCode01  |= 0x04;
    02D1 91800132  LDS	R24,g_ErrCode01
    02D3 6084      ORI	R24,4
    02D4 93800132  STS	g_ErrCode01,R24
(0132) 		return 1;
    02D6 E001      LDI	R16,1
    02D7 9508      RET
(0133) 	}
(0134) }
(0135) 
(0136) // 无停针信号检测
(0137) // 需要提供连续45次FG_MCU中断而下停针信号未监测到1次,
(0138) // 或者连续45次FG_MCU中断而上停针信号未监测到1次
(0139) // 的开关量g_NostopNeedle
(0140) byte det_err_no_stop_needle(void)
(0141) {
(0142) 	if (g_NostopNeedle)
_det_err_no_stop_needle:
    02D8 9020012E  LDS	R2,g_NostopNeedle
    02DA 2022      TST	R2
    02DB F031      BEQ	0x02E2
(0143) 	{
(0144) 		g_ErrCode01  |= 0x08;
    02DC 91800132  LDS	R24,g_ErrCode01
    02DE 6088      ORI	R24,0x8
    02DF 93800132  STS	g_ErrCode01,R24
(0145) 		return 1;
    02E1 E001      LDI	R16,1
    02E2 9508      RET
(0146) 	}
(0147) }
(0148) 
(0149) // 过压检测
(0150) // 在定时器中断服务函数中检测
(0151) byte det_err_over_vol(void)
(0152) {
(0153) 	if (g_OverVol)
_det_err_over_vol:
    02E3 9020012C  LDS	R2,g_OverVol
    02E5 2022      TST	R2
    02E6 F031      BEQ	0x02ED
(0154) 	{
(0155) 		g_ErrCode01  |= 0x10;
    02E7 91800132  LDS	R24,g_ErrCode01
    02E9 6180      ORI	R24,0x10
    02EA 93800132  STS	g_ErrCode01,R24
(0156) 		return 1;
    02EC E001      LDI	R16,1
    02ED 9508      RET
(0157) 	}
(0158) 
(0159) }
(0160) 
(0161) // 电磁阀驱动回路过流短路故障检测
(0162) // 需提供电磁阀驱动回路电流大于200mA
(0163) // T_Fault 由高电平转到低电平
(0164) byte det_err_solenoid_short(void)
(0165) {
(0166) 	if (T_Fault() == 0)
_det_err_solenoid_short:
    02EE 2422      CLR	R2
    02EF F031      BEQ	0x02F6
(0167) 	{
(0168) 		g_ErrCode01  |= 0x20;
    02F0 91800132  LDS	R24,g_ErrCode01
    02F2 6280      ORI	R24,0x20
    02F3 93800132  STS	g_ErrCode01,R24
(0169) 		return 1;
    02F5 E001      LDI	R16,1
    02F6 9508      RET
(0170) 	}
(0171) 
(0172) }
(0173) 
(0174) // 同步编码器故障检测
(0175) // 需在连续12次FG_MCU中断而同步编码信号未监测到1次
(0176) // 置起变量 g_SynEncoderErr
(0177) byte det_err_syn_encoder(void)
(0178) {
(0179) 	if (g_SynEncoderErr )
_det_err_syn_encoder:
    02F7 9020012A  LDS	R2,g_SynEncoderErr
    02F9 2022      TST	R2
    02FA F031      BEQ	0x0301
(0180) 	{
(0181) 		g_ErrCode01  |= 0x40;
    02FB 91800132  LDS	R24,g_ErrCode01
    02FD 6480      ORI	R24,0x40
    02FE 93800132  STS	g_ErrCode01,R24
(0182) 		return 1;
    0300 E001      LDI	R16,1
    0301 9508      RET
(0183) 	}
(0184) 
(0185) }
(0186) 
(0187) // 电机堵转检测
(0188) // 在定时器中断服务函数中检测
(0189) byte det_err_motor_block(void)
(0190) {
(0191) 	if (g_MotorBlock)
_det_err_motor_block:
    0302 90200129  LDS	R2,g_MotorBlock
    0304 2022      TST	R2
    0305 F031      BEQ	0x030C
(0192) 	{
(0193) 		g_ErrCode01  |= 0x80;
    0306 91800132  LDS	R24,g_ErrCode01
    0308 6880      ORI	R24,0x80
    0309 93800132  STS	g_ErrCode01,R24
(0194) 		return 1;
    030B E001      LDI	R16,1
    030C 9508      RET
(0195) 	}
(0196) 
(0197) }
(0198) 
(0199) // 电机HALL信号故障检测
(0200) // 需在连续10次上停针中断而FG_MCU中断信号未监测到1次
(0201) // 置起 标志g_HallErr
(0202) byte det_err_motor_hall(void)
(0203) {
(0204) 	if (g_HallErr)
_det_err_motor_hall:
    030D 90200127  LDS	R2,g_HallErr
    030F 2022      TST	R2
    0310 F031      BEQ	0x0317
(0205) 	{
(0206) 		g_ErrCode02  |= 0x01;
    0311 91800131  LDS	R24,g_ErrCode02
    0313 6081      ORI	R24,1
    0314 93800131  STS	g_ErrCode02,R24
(0207) 		return 1;
    0316 E001      LDI	R16,1
    0317 9508      RET
(0208) 	}
(0209) 
(0210) }
(0211) 
(0212) #if 0
(0213) // 硬件过流处理
(0214) // 红灯LED长亮,绿灯熄灭
(0215) void deal_err_over_flow(void)
(0216) {
(0217) 	RED_ON();
(0218) 	GREEN_OFF();
(0219) }
(0220) 
(0221) // 反转保护检测
(0222) // 红灯LED闪烁2下,绿灯熄灭
(0223) void deal_err_inver_protect(void)
(0224) {
(0225) 	led_flicker(1,2);
(0226) 	GREEN_OFF();
(0227) }
(0228) 
(0229) // 欠压检测
(0230) // 红灯LED闪烁3下,绿灯熄灭
(0231) void deal_err_low_vol(void)
(0232) {
(0233) 	led_flicker(1,3);
(0234) 	GREEN_OFF();
(0235) }
(0236) 
(0237) // 无停针信号检测
(0238) // 红灯LED闪烁4下,绿灯熄灭
(0239) void deal_err_no_stop_needle(void)
(0240) {
(0241) 	led_flicker(1,4);
(0242) 	GREEN_OFF();
(0243) }
(0244) 
(0245) // 过压检测
(0246) // 红灯LED闪烁5下,绿灯熄灭
(0247) void deal_err_over_vol(void)
(0248) {
(0249) 	led_flicker(1,5);
(0250) 	GREEN_OFF();
(0251) }
(0252) 
(0253) // 电磁阀驱动回路过流短路故障检测
(0254) // 红灯LED长亮,绿灯闪烁1下
(0255) void deal_err_solenoid_short(void)
(0256) {
(0257) 	RED_ON();
(0258) 	led_flicker(0,1);
(0259) }
(0260) 
(0261) // 同步编码器故障检测
(0262) // 红灯LED长亮,绿灯闪烁2下
(0263) void deal_err_syn_encoder(void)
(0264) {
(0265) 	RED_ON();
(0266) 	led_flicker(0,2);
(0267) }
(0268) 
(0269) // 电机堵转检测
(0270) // 红灯LED长亮,绿灯闪烁3下
(0271) void deal_err_motor_block(void)
(0272) {
(0273) 	RED_ON();
(0274) 	led_flicker(0,3);
(0275) }
(0276) 
(0277) // 电机HALL信号故障检测
(0278) // 红灯LED长亮,绿灯闪烁4下
(0279) void deal_err_motor_hall(void)
(0280) {
(0281) 	RED_ON();
(0282) 	led_flicker(0,4);
(0283) }
(0284) #endif
(0285) 
(0286) /****************************************************
(0287) 
(0288) 
(0289) 控制LED 灯闪烁函数
(0290) 参数type : 1 表示控制红灯  0 表示控制绿灯
(0291) 参数times : 闪烁的次数
(0292) 
(0293) *****************************************************/
(0294) void led_flicker(byte type,byte times)
(0295) {
(0296) 	g_LedTimesT1 = 0;
_led_flicker:
  times                --> R18
  type                 --> R16
    0318 2422      CLR	R2
    0319 92200123  STS	g_LedTimesT1,R2
(0297) 	g_LedTimesT2 = 0;
    031B 92200122  STS	g_LedTimesT2,R2
(0298) 	g_LedTimesT3 = 0;
    031D 2433      CLR	R3
    031E 92300114  STS	g_LedTimesT3+1,R3
    0320 92200113  STS	g_LedTimesT3,R2
(0299) 	
(0300) 	g_LedType = type;
    0322 93000126  STS	g_LedType,R16
(0301) 	g_LedTimes = times;
    0324 93200124  STS	g_LedTimes,R18
(0302) 	g_LedTimesCnt = times;
    0326 93200125  STS	g_LedTimesCnt,R18
(0303) 	g_StartLedFlick = 1;
    0328 E081      LDI	R24,1
    0329 93800121  STS	g_StartLedFlick,R24
    032B 9508      RET
_electromagne_ctrl:
  ctrl                 --> R18
  target               --> R16
    032C D535      RCALL	push_gset1
(0304) }
(0305) 
(0306) 
(0307) 
(0308) 
(0309) // 电磁铁控制函数
(0310) // 参数 target  : 电磁铁序号1~3
(0311) // 参数 ctrl  : 1 	启动    0  停止
(0312) void electromagne_ctrl(byte target ,byte ctrl)
(0313) {
(0314) 	switch (target)
    032D 2F40      MOV	R20,R16
    032E 2755      CLR	R21
    032F 3041      CPI	R20,1
    0330 E0E0      LDI	R30,0
    0331 075E      CPC	R21,R30
    0332 F049      BEQ	0x033C
    0333 3042      CPI	R20,2
    0334 E0E0      LDI	R30,0
    0335 075E      CPC	R21,R30
    0336 F069      BEQ	0x0344
    0337 3043      CPI	R20,3
    0338 E0E0      LDI	R30,0
    0339 075E      CPC	R21,R30
    033A F089      BEQ	0x034C
    033B C017      RJMP	0x0353
(0315) 	{
(0316) 		case 1:
(0317) 			if (ctrl)
    033C 2322      TST	R18
    033D F021      BEQ	0x0342
(0318) 			{
(0319) 				 E_MAG1_ON();
    033E B185      IN	R24,0x05
    033F 7088      ANDI	R24,0x8
    0340 B985      OUT	0x05,R24
(0320) 			}
    0341 C011      RJMP	0x0353
(0321) 			else
(0322) 			{
(0323) 				E_MAG1_OFF();
    0342 9A2B      SBI	0x05,3
(0324) 			}
(0325) 			break;
    0343 C00F      RJMP	0x0353
(0326) 			
(0327) 		case 2:
(0328) 			if (ctrl)
    0344 2322      TST	R18
    0345 F021      BEQ	0x034A
(0329) 			{
(0330) 				 E_MAG2_ON();
    0346 B18B      IN	R24,0x0B
    0347 7280      ANDI	R24,0x20
    0348 B98B      OUT	0x0B,R24
(0331) 			}
    0349 C009      RJMP	0x0353
(0332) 			else
(0333) 			{
(0334) 				E_MAG2_OFF();
    034A 9A5D      SBI	0x0B,5
(0335) 			}
(0336) 			break;
    034B C007      RJMP	0x0353
(0337) 			
(0338) 		case 3:
(0339) 			if (ctrl)
    034C 2322      TST	R18
    034D F021      BEQ	0x0352
(0340) 			{
(0341) 				 E_MAG3_ON();
    034E B185      IN	R24,0x05
    034F 7084      ANDI	R24,4
    0350 B985      OUT	0x05,R24
(0342) 			}
    0351 C001      RJMP	0x0353
(0343) 			else
(0344) 			{
(0345) 				E_MAG3_OFF();
    0352 9A2A      SBI	0x05,2
(0346) 			}
(0347) 			break;
(0348) 			
(0349) 		default:
(0350) 			break;
    0353 D511      RCALL	pop_gset1

⌨️ 快捷键说明

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