📄 induction_cooker_v41.asm
字号:
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 + -