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

📄 err.s

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module Err.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ERR\Err.c
	.dbfunc e det_err _det_err fV
;           sign -> R20
	.even
_det_err::
	rcall push_gset1
	.dbline -1
	.dbline 29
; /*****************************************************************
;  *  文件名:      		Err.c
;  *  版本号:      
;  *  创作日期:    	2005.7.13
;  *  作者:        		Zhoujie
;  *  功能说明:    	故障检测与故障处理
;  *  其它说明:    
;  
;  *****************************************************************/
;  
; 
; /*****************************************************************
; 
;  *   修改日期:     
;  *   修改人:
;  *   修改原因:
; 
; *******************************************************************/
; 
; #include "Err.h"
; 
; // 检测以及处理故障函数
; // 依次检测是否出现各种故障
; // 按照检测到的先后顺序
; // 控制LED 灯显示最先检测到的故障
; // 随后检测到的故障将相应的错误位置起来
; // 怎样清除故障显示 ?
; void det_err(void)
; {
	.dbline 32
; 	byte sign;
; 
; 	if (g_Err_Det_Disable)
	lds R2,_g_Err_Det_Disable
	tst R2
	breq L2
	.dbline 33
; 		return;
	rjmp L1
L2:
	.dbline 35
; 	
; 	sign = 1;
	ldi R20,1
	.dbline 37
; 	
; 	if (det_err_over_flow())
	rcall _det_err_over_flow
	tst R16
	breq L4
	.dbline 38
; 	{
	.dbline 39
; 		RED_ON();
	cbi 0x8,2
	.dbline 40
; 		GREEN_OFF();
	sbi 0x8,3
	.dbline 41
; 		sign = 0;
	clr R20
	.dbline 42
; 		g_Err_Det_Disable = 1;
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 43
; 	}
L4:
	.dbline 44
; 	if ( (det_err_inver_protect()) && sign )
	rcall _det_err_inver_protect
	tst R16
	breq L6
	tst R20
	breq L6
	.dbline 45
; 	{
	.dbline 46
; 		led_flicker(1,2);
	ldi R18,2
	ldi R16,1
	rcall _led_flicker
	.dbline 47
; 		GREEN_OFF();
	sbi 0x8,3
	.dbline 48
; 		sign = 0;
	clr R20
	.dbline 49
; 		g_Err_Det_Disable = 1;
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 50
; 	}
L6:
	.dbline 51
; 	if ((det_err_low_vol()) && sign )
	rcall _det_err_low_vol
	tst R16
	breq L8
	tst R20
	breq L8
	.dbline 52
; 	{
	.dbline 53
; 		led_flicker(1,3);
	ldi R18,3
	ldi R16,1
	rcall _led_flicker
	.dbline 54
; 		GREEN_OFF();
	sbi 0x8,3
	.dbline 55
; 		sign = 0;
	clr R20
	.dbline 56
; 		g_Err_Det_Disable = 1;
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 57
; 	}
L8:
	.dbline 58
; 	if ((	det_err_no_stop_needle()) && sign)
	rcall _det_err_no_stop_needle
	tst R16
	breq L10
	tst R20
	breq L10
	.dbline 59
; 	{
	.dbline 60
; 		led_flicker(1,4);
	ldi R18,4
	ldi R16,1
	rcall _led_flicker
	.dbline 61
; 		GREEN_OFF();
	sbi 0x8,3
	.dbline 62
; 		sign = 0;
	clr R20
	.dbline 63
; 		g_Err_Det_Disable = 1;
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 64
; 	}
L10:
	.dbline 65
; 	if ((det_err_over_vol()) && sign )
	rcall _det_err_over_vol
	tst R16
	breq L12
	tst R20
	breq L12
	.dbline 66
; 	{
	.dbline 67
; 		led_flicker(1,5);
	ldi R18,5
	ldi R16,1
	rcall _led_flicker
	.dbline 68
; 		GREEN_OFF();
	sbi 0x8,3
	.dbline 69
; 		sign = 0;
	clr R20
	.dbline 70
; 		g_Err_Det_Disable = 1;
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 71
; 	}
L12:
	.dbline 72
; 	if ((det_err_solenoid_short()) && sign )
	rcall _det_err_solenoid_short
	tst R16
	breq L14
	tst R20
	breq L14
	.dbline 73
; 	{
	.dbline 74
; 		RED_ON();
	cbi 0x8,2
	.dbline 75
; 		led_flicker(0,1);
	ldi R18,1
	clr R16
	rcall _led_flicker
	.dbline 76
; 		sign = 0;
	clr R20
	.dbline 77
; 		g_Err_Det_Disable = 1;
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 78
; 	}
L14:
	.dbline 79
; 	if ((det_err_syn_encoder()) && sign )
	rcall _det_err_syn_encoder
	tst R16
	breq L16
	tst R20
	breq L16
	.dbline 80
; 	{
	.dbline 81
; 		RED_ON();
	cbi 0x8,2
	.dbline 82
; 		led_flicker(0,2);
	ldi R18,2
	clr R16
	rcall _led_flicker
	.dbline 83
; 		sign = 0;
	clr R20
	.dbline 84
; 		g_Err_Det_Disable = 1;
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 85
; 	}
L16:
	.dbline 86
; 	if ((det_err_motor_block()) && sign )
	rcall _det_err_motor_block
	tst R16
	breq L18
	tst R20
	breq L18
	.dbline 87
; 	{
	.dbline 88
; 		RED_ON();
	cbi 0x8,2
	.dbline 89
; 		led_flicker(0,3);
	ldi R18,3
	clr R16
	rcall _led_flicker
	.dbline 90
; 		sign = 0;
	clr R20
	.dbline 91
; 		g_Err_Det_Disable = 1;
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 92
; 	}
L18:
	.dbline 93
	rcall _det_err_motor_hall
	tst R16
	breq L20
	tst R20
	breq L20
	.dbline 94
	.dbline 95
	cbi 0x8,2
	.dbline 96
	ldi R18,4
	clr R16
	rcall _led_flicker
	.dbline 97
	ldi R24,1
	sts _g_Err_Det_Disable,R24
	.dbline 98
L20:
	.dbline -2
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r sign 20 c
	.dbend
	.dbfunc e det_err_over_flow _det_err_over_flow fc
	.even
_det_err_over_flow::
	.dbline -1
	.dbline 106
; 	if (det_err_motor_hall() && sign)
; 	{
; 		RED_ON();
; 		led_flicker(0,4);
; 		g_Err_Det_Disable = 1;
; 	}
; 	
; }
; 
; 
; // 硬件过流检测
; // 需要A/D 模块控制当母线电流大于20A,FO_MCU由低电平转到高电平
; byte det_err_over_flow(void)
; {
	.dbline 107
; 	if ( FO_MCU() != 0 )
	sbis 0x6,1
	rjmp L23
	.dbline 108
; 	{
	.dbline 109
; 		g_ErrCode01  |= 0x01;
	lds R24,_g_ErrCode01
	ori R24,1
	sts _g_ErrCode01,R24
	.dbline 110
; 		return 1;
	ldi R16,1
	rjmp L22
L23:
	.dbline 113
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L22:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e det_err_inver_protect _det_err_inver_protect fc
	.even
_det_err_inver_protect::
	.dbline -1
	.dbline 119
; }
; 
; // 反转保护检测
; // 当电机反转180度机械角,REV_MCU由高电平转到低电平;
; byte det_err_inver_protect(void)
; {
	.dbline 120
; 	if  ( ( REV_MCU() == 0 ) && (g_MotorRun) )
	sbic 0x9,4
	rjmp L26
	lds R2,_g_MotorRun
	tst R2
	breq L26
	.dbline 121
; 	{
	.dbline 122
; 		g_ErrCode01  |= 0x02;
	lds R24,_g_ErrCode01
	ori R24,2
	sts _g_ErrCode01,R24
	.dbline 123
; 		return 1;
	ldi R16,1
	rjmp L25
L26:
	.dbline 126
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L25:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e det_err_low_vol _det_err_low_vol fc
	.even
_det_err_low_vol::
	.dbline -1
	.dbline 132
; }
; 
; // 欠压检测
; // 在定时器中断服务函数中检测
; byte det_err_low_vol(void)
; {
	.dbline 133
; 	if (g_LowVol)
	lds R2,_g_LowVol
	tst R2
	breq L29
	.dbline 134
; 	{
	.dbline 135
; 		g_ErrCode01  |= 0x04;
	lds R24,_g_ErrCode01
	ori R24,4
	sts _g_ErrCode01,R24
	.dbline 136
; 		return 1;
	ldi R16,1
	rjmp L28
L29:
	.dbline 139
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L28:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e det_err_no_stop_needle _det_err_no_stop_needle fc
	.even
_det_err_no_stop_needle::
	.dbline -1
	.dbline 147
; }
; 
; // 无停针信号检测
; // 需要提供连续45次FG_MCU中断而下停针信号未监测到1次,
; // 或者连续45次FG_MCU中断而上停针信号未监测到1次
; // 的开关量g_NostopNeedle
; byte det_err_no_stop_needle(void)
; {
	.dbline 148
; 	if (g_NostopNeedle)
	lds R2,_g_NostopNeedle
	tst R2
	breq L32
	.dbline 149
; 	{
	.dbline 150
; 		g_ErrCode01  |= 0x08;
	lds R24,_g_ErrCode01
	ori R24,8
	sts _g_ErrCode01,R24
	.dbline 151
; 		return 1;
	ldi R16,1
	rjmp L31
L32:
	.dbline 154
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L31:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e det_err_over_vol _det_err_over_vol fc
	.even
_det_err_over_vol::
	.dbline -1
	.dbline 160
; }
; 
; // 过压检测
; // 在定时器中断服务函数中检测
; byte det_err_over_vol(void)
; {
	.dbline 161
; 	if (g_OverVol)
	lds R2,_g_OverVol
	tst R2
	breq L35
	.dbline 162
; 	{
	.dbline 163
; 		g_ErrCode01  |= 0x10;
	lds R24,_g_ErrCode01
	ori R24,16
	sts _g_ErrCode01,R24
	.dbline 164
; 		return 1;
	ldi R16,1
	rjmp L34
L35:
	.dbline 167
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L34:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e det_err_solenoid_short _det_err_solenoid_short fc
	.even
_det_err_solenoid_short::
	.dbline -1
	.dbline 175
; 
; }
; 
; // 电磁阀驱动回路过流短路故障检测
; // 需提供电磁阀驱动回路电流大于200mA
; // T_Fault 由高电平转到低电平
; byte det_err_solenoid_short(void)
; {
	.dbline 176
; 	if (T_Fault() == 0)
	sbic 0x9,1
	rjmp L38
	.dbline 177
; 	{
	.dbline 178
; 		g_ErrCode01  |= 0x20;
	lds R24,_g_ErrCode01
	ori R24,32
	sts _g_ErrCode01,R24
	.dbline 179
; 		return 1;
	ldi R16,1
	rjmp L37
L38:
	.dbline 182
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L37:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e det_err_syn_encoder _det_err_syn_encoder fc
	.even
_det_err_syn_encoder::
	.dbline -1
	.dbline 190
; 
; }
; 
; // 同步编码器故障检测
; // 需在连续12次FG_MCU中断而同步编码信号未监测到1次
; // 置起变量 g_SynEncoderErr
; byte det_err_syn_encoder(void)
; {
	.dbline 191
; 	if (g_SynEncoderErr )
	lds R2,_g_SynEncoderErr
	tst R2
	breq L41
	.dbline 192
; 	{
	.dbline 193
; 		g_ErrCode01  |= 0x40;
	lds R24,_g_ErrCode01
	ori R24,64
	sts _g_ErrCode01,R24
	.dbline 194
; 		return 1;
	ldi R16,1
	rjmp L40
L41:
	.dbline 197
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L40:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e det_err_motor_block _det_err_motor_block fc
	.even
_det_err_motor_block::
	.dbline -1
	.dbline 204
; 
; }
; 
; // 电机堵转检测
; // 在定时器中断服务函数中检测
; byte det_err_motor_block(void)
; {
	.dbline 205
; 	if (g_MotorBlock)
	lds R2,_g_MotorBlock
	tst R2
	breq L44
	.dbline 206
; 	{
	.dbline 207
; 		g_ErrCode01  |= 0x80;
	lds R24,_g_ErrCode01
	ori R24,128
	sts _g_ErrCode01,R24
	.dbline 208
; 		return 1;
	ldi R16,1
	rjmp L43
L44:
	.dbline 211
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L43:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e det_err_motor_hall _det_err_motor_hall fc
	.even
_det_err_motor_hall::
	.dbline -1
	.dbline 219
; 
; }
; 
; // 电机HALL信号故障检测
; // 需在连续10次上停针中断而FG_MCU中断信号未监测到1次
; // 置起 标志g_HallErr
; byte det_err_motor_hall(void)
; {
	.dbline 220
; 	if (g_HallErr)
	lds R2,_g_HallErr
	tst R2
	breq L47
	.dbline 221
; 	{
	.dbline 222
; 		g_ErrCode02  |= 0x01;
	lds R24,_g_ErrCode02
	ori R24,1
	sts _g_ErrCode02,R24
	.dbline 223
; 		return 1;
	ldi R16,1
	rjmp L46
L47:
	.dbline 226
; 	}
; 	else
; 		return 0;
	clr R16
	.dbline -2
L46:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e led_flicker _led_flicker fV
;          times -> R18
;           type -> R16
	.even
_led_flicker::
	.dbline -1
	.dbline 313
; 
; }
; 
; #if 0
; // 硬件过流处理
; // 红灯LED长亮,绿灯熄灭
; void deal_err_over_flow(void)
; {
; 	RED_ON();
; 	GREEN_OFF();
; }
; 
; // 反转保护检测
; // 红灯LED闪烁2下,绿灯熄灭
; void deal_err_inver_protect(void)
; {
; 	led_flicker(1,2);
; 	GREEN_OFF();

⌨️ 快捷键说明

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