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

📄 induction_cooker_v41.asm

📁 中颖SH69P44开发的电磁炉原程序和线路图
💻 ASM
📖 第 1 页 / 共 5 页
字号:

	LDI	TEMP0	,V_L_OFF_L	;设置165V的电压采集值
	STA	ACCOMP3	,01H
	LDI	TEMP0	,V_L_OFF_H
	STA	ACCOMP4	,01H
	CALL	ACCOMPARE
	LDA	COMPARE_STATUS	,00H
	BA2	ACC2			;电压高于165V,低于175V不改变故障状态
	ORIM	WRONG	,01H		;电压低于165V,设置出现电压故障

	JMP	ACC2
ACC1:					;电压高于165V
	LDI	TEMP0	,V_H_ON_L	;设置250V对应AD值
	STA	ACCOMP3	,01H
	LDI	TEMP0	,V_H_ON_H
	STA	ACCOMP4	,01H
	CALL	ACCOMPARE		;比较
	LDA	COMPARE_STATUS	,00H	;读取结果
	BA2	ACC3			;高于250V
	ANDIM	WRONG	,1110B		;电压处于175-250V之间设定应该工作
	JMP	ACC2
ACC3:					;>250V
	LDI	TEMP0	,V_H_OFF_L
	STA	ACCOMP3	,01H
	LDI	TEMP0	,V_H_OFF_H	;260V对应AD值
	STA	ACCOMP4	,01H
	CALL	ACCOMPARE		;比较
	LDA	COMPARE_STATUS	,00H	;读取结果
	BA1	ACC2			;低于260V,高于250V不改变故障计数器状态
	ORIM	WRONG	,01H		;高于260V
ACC2:
	RTNI


;;*****************************************************
;AD采样子函数:程序每循环一次,电压,锅底温度和IGBT温度采
;样一次,当采集完毕256次后处理一次数据,电流是采集一次处
;理一次
;;*****************************************************
ADC_GET:
	LDA	MAIN_STATUS	,00H
	BA2	$+2
	JMP	GETADC6
	LDA	HEAT_POINT	,00H
	BAZ	GETADC6
	LDI	VACR		,1101B	;配置ADC参数(外部5V参考电压,PORTA为AD通道)
	LDA	GOT		,00H	;转化正在进行
	BA3	GETADC6
	LDA	AD_STATUS	,00H
	BA0	GETADC1			;MARKING=01H,应该进行锅底温度检测
	BA1	GETADC2			;MARKING=02H,应该进行IGBT温度检测
	BA2	GETADC3			;MARKING=04H,应该进行电流检测
	BA3	GETADC4			;MARKING=08H,应该进行电压检测
	JMP	GETADC5
GETADC1:
	CALL	PAN_T_ADC		;转化结束,处理采集到的锅底温度值
	JMP	GETADC6
GETADC2:
	CALL	IGBT_T_ADC		;转化结束,处理IGBT温度值
	JMP	GETADC6
GETADC3:
	CALL	ACVOLTAGE_ADC		;转化结束,处理电压值
	JMP	GETADC6
GETADC4:
	CALL	CURRENT_ADC		;转化结束,处理电流值
	CALL	EVEN_COUNTER		;AD采集计数器+1
	JMP	GETADC6
GETADC5:
	CALL	ADC_BEGIN		;开始采样
GETADC6:
	RTNI
	


;;*****************************************************
;PWM参数设置子函数:根据计算得到的平均电压和电流的乘积计
;算应该的PWM
;;*****************************************************
PWM_SETUP:	
	LDA	PORTB		,00H	;如果IGBT关闭,那么进行功率的计算
	BA2	$+2
	RTNI
	
	LDA	PWM_STATUS	,00H	;判断软启动结束标志
	BA0	$+2			;软启动已经结束
	RTNI				;软启动没有结束,那么不要进行功率调整
	

SAME_CURRENT:
	LDA	NOWCURREA	,01H	;判断当前电流是否连续4次大于最大电流
	STA	TEMP		,00H
	ANDIM	TEMP		,1000B	;最后一位不比较,只要高7位一样就认为相同
	STA	ACCOMP1		,01H
	LDA	NOWCURREB	,01H
	STA	ACCOMP2		,01H
	LDI	TBR		,07H	;最大电流存放于0770H中
	LDA	HEAT_POINT	,00H
	CALL	0770H
	STA	ACCOMP4		,01H
	LDA	TBR		,00H
	ANDIM	TBR		,1000B
	STA	ACCOMP3		,01H
	CALL	ACCOMPARE		;比较数据
	LDA	COMPARE_STATUS	,00H	;读取比较结果
	BA0	PWM_SETUP_END		;如果电流达到最大值,那么不用改变PWM
	BA1	SAME_POWER		;如果电流小于最大值,那么恒流
PWM_DEC:	
	ADIM	OVER_CURRENT_CN	,01H	;过流计数器+1
	BA2	$+2
	JMP	PWM_SETUP_END		;不修正PWM
	LDI	OVER_CURRENT_CN	,00H	;设置=03H,下一次的时候不需要连续4次探测到过流
	
	LDA	PD0L		,00H	;PWM参数-1
	STA	TEMP		,00H
	SBIM	TEMP		,01H
	LDI	TEMP0		,00H
	SBCM	PD0M		,00H
	LDI	TEMP0		,00H
	SBCM	PD0H		,00H
	LDA	TEMP		,00H
	STA	PD0L		,00H
	JMP	PWM_SETUP_END


SAME_POWER:
	
	LDI	OVER_CURRENT_CN	,00H	;复位过流计数器
	
	LDA	EVEN_STATUS	,00H	;判断功率是否发生变化
	BA3	$+2
	RTNI
	ANDIM	EVEN_STATUS	,0111B	;清除功率发生改变位(电流采集完毕)
	
	CALL	MULT			;计算功率
	
	LDA	RUT_2		,00H	;比较高位(只比较高8位,如果高8位数据一样,那么就认为功率一样)
	STA	ACCOMP1		,01H
	LDA	RUT_3		,00H
	STA	ACCOMP2		,01H
	
	LDI	TBR		,0BH
	LDA	HEAT_POINT	,00H	;读取火力档
	CALL	07B0H			;从07B0H读取设定功率档的高8位
	STA	ACCOMP4		,01H
	LDA	TBR		,00H
	STA	ACCOMP3		,01H
	
	CALL	ACCOMPARE		;比较
	LDA	COMPARE_STATUS	,00H	;读取比较结果
	BA2	PWM_DOWN		;实际功率大于设定功率
	BA1	PWM_UP			;实际功率小于设定功率
	

	JMP	PWM_SETUP_END		;实际功率等于设定功率,不调整PWM
PWM_DOWN:
	CALL	PWMDOWN			;PWM向下调整子函数
	JMP	PWM_SETUP_END
PWM_UP:
	CALL	PWMUP			;PWM向上调整子函数
	JMP	PWM_SETUP_END
PWM_SETUP_END:
	RTNI

;;*****************************************************
;PWM增加子函数:根据当前功率和设定功率之间的差值确定当前
;增加的量的多少
;;*****************************************************
PWMUP:

	
	LDA	PD0M		,00H	;比较PWM是否已经达到最大值?
	STA	ACCOMP1		,01H
	LDA	PD0H		,00H
	STA	ACCOMP2		,01H
	LDI	TBR		,08H
	LDA	HEAT_POINT	,00H
	CALL	0780H			;每一档的最大PWM的PD0H和PD0M存放于0780H
	STA	ACCOMP4		,01H
	LDA	TBR		,00H
	STA	ACCOMP3		,01H
	CALL	ACCOMPARE		;比较
	LDA	COMPARE_STATUS	,00H	;读取比较结果
	BA2	PWM_UP_END		;如果现在的PWM已经大于最大的PWM,那么不要修正PWM.
	
	LDI	TBR		,09H
	LDA	HEAT_POINT	,00H
	CALL	0790H			;读取功率的4-9位数据
	STA	DELTA_L		,00H
	LDI	TBR		,0BH
	LDA	HEAT_POINT	,00H
	CALL	07B0H			;读取功率的8-15位数据
	STA	DELTA_H		,00H
	LDA	TBR		,00H
	STA	DELTA_M		,00H
	
	LDA	RUT_1		,00H	;求取实际功率和设定功率的差值
	SUBM	DELTA_L		,00H
	LDA	RUT_2		,00H
	SBCM	DELTA_M		,00H
	LDA	RUT_3		,00H
	SBCM	DELTA_H		,00H

	CALL	RIGHTSHIFT
	CALL	RIGHTSHIFT
	CALL	RIGHTSHIFT
	CALL	RIGHTSHIFT
	CALL	RIGHTSHIFT
	
	LDA	DELTA_L		,00H	;判断结果是否等于0
	BNZ	PWMUP2			;不等
	LDA	DELTA_M		,00H
	BNZ	PWMUP2			;不等
	LDA	DELTA_H		,00H
	BNZ	PWMUP2			;不等
	
	ADIM	DELTA_L		,01H	;最低值
	LDI	TEMP0		,00H
	ADCM	DELTA_M		,00H	;中间值
	LDI	TEMP0		,00H
	ADCM	DELTA_H		,00H	;最高值
PWMUP2:	
	LDA	PD0L		,00H
	ADDM	DELTA_L		,00H
	LDA	DELTA_M		,00H
	ADCM	PD0M		,00H
	LDA	DELTA_H		,00H
	ADCM	PD0H		,00H
	LDA	DELTA_L		,00H
	STA	PD0L		,00H
PWM_UP_END:				;PWM向上调整结束
	RTNI
;;*****************************************************
;PWM减小子函数:根据当前功率和设定功率之间的差值确定当前
;减小的量的多少
;;*****************************************************
PWMDOWN:
	
	
	LDI	TBR		,09H	;读取设定功率的4-7位
	LDA	HEAT_POINT	,00H
	CALL	0790H
	STA	DELTA_L		,00H
	LDI	TBR		,0BH	;读取设定功率的8-15位
	LDA	HEAT_POINT	,00H
	CALL	07B0H
	STA	DELTA_H		,00H
	LDA	TBR		,00H
	STA	DELTA_M		,00H

	LDA	DELTA_L		,00H	;求取设定功率和实际功率的差值
	SUBM	RUT_1		,00H
	LDA	DELTA_M		,00H
	SBCM	RUT_2		,00H
	LDA	DELTA_H		,00H
	SBCM	RUT_3		,00H

	LDA	RUT_3		,00H
	STA	DELTA_H		,00H
	LDA	RUT_2		,00H
	STA	DELTA_M		,00H
	LDA	RUT_1		,00H
	STA	DELTA_L		,00H
	
	CALL	RIGHTSHIFT		;右移2位
	CALL	RIGHTSHIFT
	CALL	RIGHTSHIFT		;右移2位
	CALL	RIGHTSHIFT
	
	LDA	DELTA_L		,00H	;判断差值是否等于0
	BNZ	PWMDOWN2		;不等
	LDA	DELTA_H		,00H
	BNZ	PWMDOWN2		;不等
	LDA	DELTA_M		,00H
	BNZ	PWMDOWN2		;不等
PWMDOWN1:
	ADIM	DELTA_L	,01H		;最低值
	LDI	TEMP0	,00H
	ADCM	DELTA_M	,00H		;中间值
	LDI	TEMP0	,00H
	ADCM	DELTA_H	,00H		;最高值
PWMDOWN2:	
	LDA	PD0L	,00H
	STA	TEMP0	,00H
	LDA	DELTA_L	,00H
	SUBM	TEMP0	,00H
	LDA	DELTA_M	,00H
	SBCM	PD0M	,00H
	LDA	DELTA_H	,00H
	SBCM	PD0H	,00H
	LDA	TEMP0	,00H
	STA	PD0L	,00H
	RTNI
;;*****************************************************
;右移子函数:DELTAH,DELTAM,DELTAL的数据依次有移一位
;;*****************************************************
RIGHTSHIFT:
	LDA	DELTA_L	,00H
	SHR
	STA	DELTA_L	,00H
	LDA	DELTA_M	,00H
	SHR
	STA	DELTA_M	,00H
	BNC	$+2
	ORIM	DELTA_L	,1000B
	LDA	DELTA_H	,00H
	SHR
	STA	DELTA_H
	BNC	$+2
	ORIM	DELTA_M	,1000B
	RTNI
;;*****************************************************
;乘法子函数:是电流和电压值相乘,其中结果存放在RUT_0,RUT_1
;RUT_2,RUT_3中;电流在CURREA和CURREB中,而电压值存放在ACVOLA
;和ACVOLB中
;;*****************************************************
MULT:
	LDI	RUT_0	,00H		;清除结果寄存器低4位
	LDI	RUT_1	,00H		;清除结果寄存器中4位
	LDI	RUT_2	,00H		;清除结果寄存器高4位
	LDI	RUT_3	,00H
	LDA	ACVOLA	,01H
	STA	RUT_2	,00H
	LDA	ACVOLB	,01H
	STA	RUT_3	,00H
	LDI	TEMP	,08H
MULT_A:
	CALL	MULT3			;计算一次
	SBIM	TEMP	,01H		;次数-1
	BNZ	MULT_A
	RTNI

;;*****************************************************
;这个子函数的功能是:RUT_3中最高位是0,那么只左移一位,如
;果是1,那么左移一位,并且加上乘数
;;*****************************************************
MULT3:
	LDA	RUT_3		,00H
	BA3	$+2
	JMP	MULT31
	LDA	RUT_0		,00H	;结果左移一位
	ADDM	RUT_0		,00H
	LDA	RUT_1		,00H
	ADCM	RUT_1		,00H
	LDA	RUT_2		,00H
	ADCM	RUT_2		,00H
	LDA	RUT_3		,00H
	ADCM	RUT_3		,00H
	LDA	CURREA		,01H
	ADDM	RUT_0		,00H
	LDA	CURREB		,01H
	ADCM	RUT_1		,00H
	LDI	TEMP0		,00H
	ADCM	RUT_2		,00H
	LDI	TEMP0		,00H
	ADCM	RUT_3		,00H
	RTNI
MULT31:
	LDA	RUT_0		,00H	;结果左移一位
	ADDM	RUT_0		,00H
	LDA	RUT_1		,00H
	ADCM	RUT_1		,00H
	LDA	RUT_2		,00H
	ADCM	RUT_2		,00H
	LDA	RUT_3		,00H
	ADCM	RUT_3		,00H
	RTNI
;;*****************************************************
;电流处理子函数:当IGBT不加热的时候,不判断是否无锅,IGBT
;开启的时候判断方法如下:
;IGBT开启的第一秒不检测电流是否达到要求,第1秒到第5秒,
;检测门限比较低,5秒后检测门限比较高.如果一旦当前电流低
;于门限电流,那么认定无锅
;;*****************************************************
CURRENT:
;	LDA	NOWCURREA	,01H
;	STA	AD_STA3	,00H
;	LDA	NOWCURREB	,01H
;	STA	AD_STA4	,00H
	
	LDA	PORTB		,00H	;如果IGBT关闭,那么不判断是否无锅
	BA2	$+2
	JMP	CURRE2

	LDA	TIME_STATUS	,00H	;1S定时已到标志,没有到达1S前,不检测电流是否比较小
	BA1	$+2
	JMP	CURRE2
	
	LDA	NOWCURREA	,01H		
	STA	ACCOMP1		,01H
	LDA	NOWCURREB	,01H
	STA	ACCOMP2		,01H
	
	LDA	TIME_STATUS	,00H	;判断5秒定时是否已到
	BA2	CURRE1_0
	
	LDI	TBR		,05H	;5秒没有到,门限存放于0750H
	LDA	HEAT_POINT	,00H
	CALL	0750H
	STA	ACCOMP4		,01H
	LDA	TBR		,00H
	STA	ACCOMP3		,01H
	JMP	CURRE1_1
CURRE1_0:

	LDI	TBR		,06H
	LDA	HEAT_POINT	,00H	;5秒已到,门限存放于0760H
	CALL	0760H
	STA	ACCOMP4		,01H
	LDA	TBR		,00H
	STA	ACCOMP3		,01H
	
CURRE1_1:
	CALL	ACCOMPARE		;比较数据
	LDA	COMPARE_STATUS	,00H	;读取结果
	BA1	CURRE1			;电流值<设定值
	LDA	NO_BOIL_COUNTER	,00H	;无锅故障计数器如果不等于0,那么-1
	BAZ	$+2
	SBIM	NO_BOIL_COUNTER	,01H
	JMP	CURRE2
CURRE1:
	ADIM	NO_BOIL_COUNTER	,01H	;无锅故障计数器+1,直到等于4
	BA3	$+2
	JMP	CURRE2
	LDI	NO_BOIL_COUNTER	,00H
	ORIM	WRONG		,0010B	;设置出现无锅故障

CURRE2:	
	RTNI
;;*****************************************************
;平均值计数器-1子函数:每当完成4路AD采样一次,那么计数器
;-1,当完成256次采样,那么设置一些标志,表明ad采样的平均值
;已经完成
;;*****************************************************
EVEN_COUNTER:
	SBIM	EVEN_C1	,01H		;平均值计数器-1

⌨️ 快捷键说明

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