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

📄 induction_cooker_v41.asm

📁 中颖SH69P44开发的电磁炉原程序和线路图
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	LDA	PWM_STATUS	,00H	;判断软启动是否结束
	BA0	SOFT_END		;软启动已经结束
	
	LDA	PWM_STATUS	,00H	;判断软启动20MS定时已满否?
	BA3	$+2			;定时已到
	JMP	SOFT_END		;定时没有到
	
	ANDIM	PWM_STATUS	,0111B	;清除20MS定时已满标志
	
	LDA	PD0L		,00H	;PWM+1
	STA	TEMP		,00H
	ADIM	TEMP		,02H
	LDI	TEMP0		,00H
	ADCM	PD0M		,00H
	LDI	TEMP0		,00H
	ADCM	PD0H		,00H
	LDA	TEMP		,00H
	STA	PD0L		,00H
	
	LDA	PD0H		,00H	;比较高位是否达到
	STA	COMP1		,00H
	LDI	COMP2		,01H
	CALL	COMPARE			;比较数据
	LDA	COMPARE_STATUS	,00H
	BA1	SOFT_END
	
	LDA	PD0L		,00H
	STA	ACCOMP1		,01H	;比较当前的PWM和火力点的最小PWM比较,如果一样,那么软启动结束
	LDA	PD0M		,00H
	STA	ACCOMP2		,01H
	LDI	TBR		,0CH
	LDA	HEAT_POINT	,00H	;判断当前的火力点
	CALL	07C0H			;存放220V下的PWM参数值
	STA	ACCOMP4		,01H
	LDA	TBR		,00H
	STA	ACCOMP3		,01H
	CALL	ACCOMPARE		;比较
	LDA	COMPARE_STATUS	,00H	;读取比较结果
	BA2	$+2
	JMP	SOFT_END
	ORIM	PWM_STATUS	,0001B	;设置软启动结束
	JMP	SOFT_END

SOFT_END:
	RTNI
	
;;*****************************************************
;保温子函数:每一档保温点都有一个上限和一个下限.锅底温度
;高于这个上限的时候,关闭IGBT,锅底温度低于这个下限的时候
;开启IGBT.实际温度和保温的温度相差越大,加热的火力就越大
;;*****************************************************
HEAT_KEEP:
	LDA	WRONG		,00H	;如果出现故障,那么保温不能设置PWM参数
	BNZ	KEEPHEAT3
	
	LDA	EVEN_STATUS	,00H	;如果锅底平均值没有求取完毕,那么不用处理这一段
	BA0	$+2
	JMP	KEEPHEAT3

	
	LDI	TBR		,0AH
	LDA	SHOW_POINT	,00H	;判断当前的保温温度点
	CALL	07A0H
	STA	TEMP0		,00H
	LDA	TBR		,00H
	STA	TEMP		,00H	
	CALL	ARRIVE
	
	LDA	MAIN_STATUS	,00H	;检测保温是否达到设定值
	BA3	KEEPHEAT4
	
	LDI	TBR		,0AH
	LDA	SHOW_POINT	,00H
	CALL	07A0H
	STA	DELTA_H		,00H
	LDA	TBR		,00H
	STA	DELTA_M		,00H
	
	LDA	TPER0A		,01H
	SUBM	DELTA_M		,00H
	LDA	TPER0B		,01H
	SBCM	DELTA_H		,00H
	
	SBI	DELTA_H		,04H
	BNC	$+2
	LDI	DELTA_H		,0011B
	
	SBI	SHOW_POINT	,06H
	BC	$+3			;大于
	ADIM	DELTA_H		,03H
	JMP	$+2
	ADIM	DELTA_H		,06H
	STA	HEAT_POINT	,00H
	ORIM	PWM_STATUS	,0010B	;设置需要开启IGBT标志
	JMP	KEEPHEAT3
KEEPHEAT4:
	ANDIM	PWM_STATUS	,1100B	;清除需要开启IGBT标志
KEEPHEAT3:
	RTNI
	
;;*****************************************************
;ARRIVE THE POINT
;;*****************************************************
ARRIVE:
	LDA	TPER0A		,01H	;比较当前的温度和设定的保温温度上限的大小
	STA	ACCOMP1		,01H
	LDA	TPER0B		,01H
	STA	ACCOMP2		,01H
	
	ADI	TEMP		,00H
	STA	ACCOMP3		,01H
	LDA	TEMP0		,00H
	STA	COMP2		,00H
	LDI	COMP1		,00H
	ADCM	COMP2		,00H
	STA	ACCOMP4		,01H
	CALL	ACCOMPARE		;比较
	LDA	COMPARE_STATUS	,00H	;读取比较结果
	BA2	KEEPHEAT1		;当前温度值高于设定温度值上限
	
	LDA	TPER0A		,01H	;比较当前的温度和设定的保温温度下限的大小
	STA	ACCOMP1		,01H
	LDA	TPER0B		,01H
	STA	ACCOMP2		,01H

	SBI	TEMP		,02H
	STA	ACCOMP3		,01H
	LDA	TEMP0		,00H
	STA	COMP2		,00H
	LDI	COMP1		,00H
	SBCM	COMP2		,00H

	STA	ACCOMP4		,01H
	CALL	ACCOMPARE		;比较
	LDA	COMPARE_STATUS	,00H	;读取比较结果
	BA1	KEEPHEAT2		;比设定值的下限小
	RTNI
KEEPHEAT1:

	ORIM	MAIN_STATUS	,1000B	;设定温度达到设定值标志
	RTNI
KEEPHEAT2:
	ANDIM	MAIN_STATUS	,0111B	;清除保温达到设定值
	RTNI
;;*****************************************************
;电压平均值子函数:把256次的AD采样值相加
;;*****************************************************
V_EVEN:
	LDA	ADCDL	,00H		;把每一次采集到的数据相加,一直+256次
	ADDM	ACVOL_0	,01H
	LDA	ADCDH	,00H
	ADCM	ACVOL_1	,01H
	LDI	TEMP0	,00H
	ADCM	ACVOL_2	,01H
	LDI	TEMP0	,00H
	ADCM	ACVOL_3	,01H
	
	RTNI
;;*****************************************************
;锅底温度平均值子函数:把256次的AD采样值相加
;;*****************************************************
T_EVEN:
	LDA	ADCDL	,00H		;把AD采样值和前面的值之和相加
	ADDM	EVEN_T0	,01H
	LDA	ADCDH	,00H
	ADCM	EVEN_T1	,01H
	LDI	TEMP0	,00H
	ADCM	EVEN_T2	,01H
	LDI	TEMP0	,00H
	ADCM	EVEN_T3	,01H
	
	RTNI

;;*****************************************************
;IGBT温度平均值子函数:
;;*****************************************************
I_EVEN:
	LDA	ADCDL	,00H		;把AD采样值和前面的值之和相加
	ADDM	EVEN_I0	,01H
	LDA	ADCDH	,00H
	ADCM	EVEN_I1	,01H
	LDI	TEMP0	,00H
	ADCM	EVEN_I2	,01H
	LDI	TEMP0	,00H
	ADCM	EVEN_I3	,01H
	
	RTNI
;;*****************************************************
;电流平均值子函数:把256次的AD采样值相加
;;*****************************************************
C_EVEN:
	LDA	ADCDL	,00H		;求取256次平均值
	ADDM	CURRE_0	,01H
	LDA	ADCDH	,00H
	ADCM	CURRE_1	,01H
	LDI	TEMP0	,00H
	ADCM	CURRE_2	,01H
	LDI	TEMP0	,00H
	ADCM	CURRE_3	,01H
	
	RTNI
	
;;*****************************************************
;锅底温度采样子函数:程序每循环一次,AD采样完成一次
;;*****************************************************
PAN_T_ADC:
	
	CALL	T_EVEN			;求得256次采样的平均值
	
	LDI	ADCS		,1001B	;选择第二路进行AD转化(IGBT温度)
	LDI	GOT		,1110B	;开始转化
	LDI	AD_STATUS	,0010B	;设置第二路AD转化标志
	
	LDA	EVEN_STATUS	,00H	;判断IGBT温度采样平均值是否求取完毕
	BA0	$+2
	JMP	TP2			;平均值没有求取完毕,那么不进行处理
	ANDIM	EVEN_STATUS	,1110B
	
	LDA	TPER0B		,01H	;锅底的热敏电阻断路,关机报警
	BNZ	TP3
	LDA	TPER0A		,01H
	BNZ	TP3
	CALL	CLOSE_M
	LDI	FAULT_STATUS	,03H	;设置故障F3
	RTNI
TP3:
	LDA	TPER0B		,01H
	STA	TEMP		,00H
	SBI	TEMP		,0FH	;锅底的热敏电阻短路,关机报警
	BNZ	TP4
	LDA	TPER0A		,01H
	STA	TEMP		,00H
	SBI	TEMP		,0FH
	BNZ	TP4
	CALL	CLOSE_M
	LDI	FAULT_STATUS	,04H	;设置故障F4
	RTNI	
TP4:
	
			
	LDA	TPER0A	,01H		;锅底温度值与E0H比较,如果高于这一个值,那么就是锅底温度过高故障
	STA	ACCOMP1	,01H
	LDA	TPER0B	,01H
	STA	ACCOMP2	,01H
	LDI	TEMP0	,00H
	STA	ACCOMP3	,01H
	LDI	TEMP0	,0EH
	STA	ACCOMP4	,01H
	CALL	ACCOMPARE
	LDA	COMPARE_STATUS	,00H
	BA2	TP1			;过底温度过高
	LDA	TPER0A	,01H		;锅底温度值与D0H比较,如果低于这一个值,那么清除锅底温度过高
	STA	ACCOMP1	,01H
	LDA	TPER0B	,01H
	STA	ACCOMP2	,01H
	LDI	TEMP0	,00H
	STA	ACCOMP3	,01H
	LDI	TEMP0	,0DH
	STA	ACCOMP4	,01H
	CALL	ACCOMPARE
	LDA	COMPARE_STATUS	,00H
	BA2	TP2			;过底温度过高
	ANDIM	WRONG	,0111B		;清除锅底温度过高故障
	JMP	TP2
TP1:
	ORIM	WRONG	,1000B		;设置锅底温度过高故障
TP2:	
	RTNI

;;*****************************************************
;电流采样子函数:每一次采集完毕数据都要迳行处理,检测电流
;的变化不停的修正PWM参数
;;*****************************************************
CURRENT_ADC:

	CALL	C_EVEN			;求得256次采样的平均值
	
	LDA	ADCDH		,00H	;读取电流
	STA	NOWCURREB	,01H
	LDA	ADCDL		,00H
	STA	NOWCURREA	,01H
	LDI	ADCS		,1000B	;选择第一路进行AD转化(锅底温度)
	LDI	GOT		,1110B	;开始转化
	LDI	AD_STATUS	,0001B	;设置第一路AD转化标志
	CALL	CURRENT			;电流处理子函数
	RTNI
		
;;*****************************************************
;IGBT温度采样子函数:程序每循环一次,AD采样完成一次
;;*****************************************************
IGBT_T_ADC:
	
	CALL	I_EVEN			;求得256次采样的平均值
	
	LDI	ADCS		,1011B	;选择第三路进行AD转化(电罔电压)
	LDI	GOT		,1110B	;开始转化
	LDI	AD_STATUS	,0100B	;设置第三路AD转化标志
	
	LDA	EVEN_STATUS	,00H	;判断IGBT温度采样平均值是否求取完毕
	BA1	$+2
	JMP	ITP2			;平均值没有求取完毕,那么不进行处理
	ANDIM	EVEN_STATUS	,1101B	
	
	LDA	TPER1A_B	,01H
	BNZ	IP3
	LDA	TPER1B_B	,01H
	BNZ	IP3
	LDA	TPER1A		,01H	;IGBT热敏电阻断路,关机报警
	BNZ	IP3
	LDA	TPER1B		,01H
	BNZ	IP3
	CALL	CLOSE_M
	LDI	FAULT_STATUS	,01H	;设置故障F1
	RTNI
IP3:
	LDA	TPER1B		,01H
	STA	TEMP		,00H
	SBI	TEMP		,0FH	;IGBT热敏电阻短路,关机报警
	BNZ	IP4
	LDA	TPER1A		,01H
	STA	TEMP		,00H
	SBI	TEMP		,0FH
	BNZ	IP4
	CALL	CLOSE_M
	LDI	FAULT_STATUS	,02H	;设置故障F2
	RTNI	
IP4:


			
	LDA	TPER1A	,01H		;IGBT温度过高,那么IGBT温度故障计数器+1
	STA	ACCOMP1	,01H
	LDA	TPER1B	,01H
	STA	ACCOMP2	,01H
	LDI	TEMP0	,05H
	STA	ACCOMP3	,01H
	LDI	TEMP0	,08H
	STA	ACCOMP4	,01H
	CALL	ACCOMPARE
	LDA	COMPARE_STATUS	,00H
	BA2	ITP1			;IGBT温度过高
	
	LDA	TPER1A	,01H		;IGBT温度过高,那么IGBT温度故障计数器+1
	STA	ACCOMP1	,01H
	LDA	TPER1B	,01H
	STA	ACCOMP2	,01H
	LDI	TEMP0	,00H
	STA	ACCOMP3	,01H
	LDI	TEMP0	,08H
	STA	ACCOMP4	,01H
	CALL	ACCOMPARE
	LDA	COMPARE_STATUS	,00H
	BA2	ITP2			;IGBT温度过高
	
	ANDIM	WRONG	,1011B		;清除IGBT温度故障
	JMP	ITP2
ITP1:
	ORIM	WRONG	,0100B		;设置IGBT温度故障
ITP2:	
	RTNI
;;*****************************************************
;比较子函数:2个8位数比较,>那么COMPARE_STATUS=04H,<那么
;COMPARE_STATUS=02H,=那么COMPARE_STATUS=01H
;;*****************************************************
ACCOMPARE:
	LDA	ACCOMP2	,01H		;读取比较数高位
	STA	COMP1	,00H
	LDA	ACCOMP4	,01H		;读取被比较数高位
	STA	COMP2	,00H
	CALL	COMPARE			;比较
	LDA	COMPARE_STATUS	,00H	;读取比较结果
	BA2	ACCOM1			;大于
	BA1	ACCOM2			;小于
	LDA	ACCOMP1	,01H		;读取比较数低位
	STA	COMP1	,00H
	LDA	ACCOMP3	,01H		;读取被比较数低位
	STA	COMP2	,00H
	CALL	COMPARE			;比较
	LDA	COMPARE_STATUS	,00H	;读取比较结果
	BA2	ACCOM1			;大于
	BA1	ACCOM2			;小于
	LDI	COMPARE_STATUS	,01H	;等于
	JMP	ACCOM3
ACCOM1:
	LDI	COMPARE_STATUS	,04H
	JMP	ACCOM3
ACCOM2:
	LDI	COMPARE_STATUS	,02H
ACCOM3:
	RTNI
;;*****************************************************
;比较子函数:2个4位数比较,>那么COMPARE_STATUS=04H;<那么
;COMPARE_STATUS=02H,=那么COMPARE_STATUS=01H
;;*****************************************************
COMPARE:
	LDI	COMPARE_STATUS	,00H	;清零结果
	LDA	COMP2	,00H		;备比较数高位
	SUB	COMP1	,00H		;采样数据高位
	BAZ	$+4
	BC	$+5
	ORIM	COMPARE_STATUS	,02H	;小于
	JMP	$+4
	ORIM	COMPARE_STATUS	,01H	;等于
	JMP	$+2
	ORIM	COMPARE_STATUS	,04H	;大于
	RTNI
	
;;*****************************************************
;电罔电压AD采样子函数:每当程序循环一次,AD采样一次,当采
;集完毕256次后,判断是否出现电压故障   
;;*****************************************************
ACVOLTAGE_ADC:
	
	CALL	V_EVEN			;求平均值
	
	LDI	ADCS		,1100B	;选择第四路进行AD转化(电流)
	LDI	GOT		,1110B	;开始转化
	LDI	AD_STATUS	,1000B	;设置第四路AD转化标志
	
	LDA	EVEN_STATUS	,00H	;判断电罔电压256次是否求取完毕
	BA2	$+2			;求取完毕
	JMP	ACC2			;没有求取完毕
	ANDIM	EVEN_STATUS	,1011B	;清除平均值结束标志
		
	LDA	ACVOLA	,01H		;读取采集到的平均电压
	STA	ACCOMP1	,01H
	LDA	ACVOLB	,01H
	STA	ACCOMP2	,01H
	LDI	TEMP0	,V_L_ON_L	;设置低压关闭们限
	STA	ACCOMP3	,01H
	LDI	TEMP0	,V_L_ON_H
	STA	ACCOMP4	,01H
	CALL	ACCOMPARE
	LDA	COMPARE_STATUS	,00H
	BA2	ACC1			;电压高于175V

⌨️ 快捷键说明

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