📄 control.txt
字号:
AD_COMMAND EQU 02H
AD_LOW EQU 02H
AD_HIGH EQU 03H
HSI_MODE EQU 03H
HSO_TIME EQU 04H
HSI_TIME EQU 04H
HSO_COMMAND EQU 06H
HSI_STATUS EQU 06H
INT_MASK EQU 08H
INT_PENDING EQU 09H
TIMER1 EQU 0AH
TIMER2 EQU 0CH
PORT1 EQU 0FH
IOS0 EQU 15H
IOC0 EQU 15H
IOS1 EQU 16H
IOC1 EQU 16H
SP EQU 18H
AX EQU 1CH
AL EQU 1CH
AH EQU 1DH
DX EQU 1EH
BX EQU 20H
BL EQU 20H
BH EQU 21H
CX EQU 22H
FLAG EQU 40H
U0 EQU 42H;给定电压幅值
WT EQU 44H
USIN EQU 48H;给定正弦值
NUMAD EQU 50H;AD转换次数
DLFK EQU 52H;输入电流整流后的反馈值
CZWIDE EQU 54H;设定迟滞宽度
NUMDELAY EQU 56H;延时数
SOFT0_COM EQU 18H;软件定时器0中断命令
DINGSHI EQU 52;定时时间为200us
U1 EQU 60H;反馈电压只值
ORG 2004H
DCW hsi_int
ORG 200AH
DCW SOFTTIMER
ORG 2080H
LD SP,#0E0H
LDB FLAG,#10
LDB WT,#0
LD CZWIDE,#700;给定迟滞宽度值
LD U0,#100
DI
REFLUSH:
LD 0,HSI_TIME
NOP
NOP
JBS IOS1,7,REFLUSH
CLRB INT_PENDING
LDB HSI_MODE,#01100000B;HSI.3正跳变中断(正半波)HSI.2负跳变中断(负半波)
LDB INT_MASK,#00100100B;允许软件中断、允许HSI中断
LDB IOC0,#01010010B;允许T2CLK计数,允许HSO.2,HSO.3输入,每次写定时器2复位
ANDB PORT1,#11110111B
EI
CALL DELAY
;等待过零信号并进行处理
WAIT:
CMPB FLAG,#10
JNE WAIT0
JMP WAIT
WAIT0:
LDB IOC0,#01010010B;每次写定时器2复位
LDB HSO_COMMAND,#SOFT0_COM
ADD HSO_TIME,TIMER1,#DINGSHI
WAIT1: CMPB FLAG,#1
JE WAVEZ;跳转到正半波处理程序
CMPB FLAG,#0
JE WAVEF;跳转到负半波处理程序
JMP WAIT;过零信号没到继续等待
;正半波处理程序
WAVEZ:
CALL ADCHANGE5;采样输入电流值
CLR 70H
LDB 70H,WT
LDB 80H,SIN[70H]
MULUB USIN,U0,80H;得到给定值
CMP USIN,DLFK
JNH WAVEZ0;给定小于反馈跳转
CALL DELAY
CMP USIN,DLFK
JNH WAVEZ;给定并不大于反馈从新判断
;给定大于反馈处理程序
CLR AX
SUB AX,USIN,DLFK;给定大于反馈得到差值
CMP AX,CZWIDE;比较差值和迟滞宽度
JNH ONV2;给定-反馈<某值,开V2进行充电
CALL OFFV2;给定-反馈>某值,关断V2,V3放电
;给定小于反馈处理程序
WAVEZ0:
CALL DELAY
CMP USIN,DLFK
JH WAVEZ;给定并不小于反馈从新判断
CLR AX
SUB AX,DLFK,USIN;给定小于反馈得到差值
CMP AX,CZWIDE;比较差值与迟滞宽度
JNH OFFV2;反馈-给定<某值,关断V2,V3继续放电
CALL ONV2;反馈-给定>某值,
;负半波处理程序
WAVEF:
CALL ADCHANGE5;采样输入电流值
CLR 80H
LDB 80H,WT
LDB 94H,SIN[80H]
MULUB USIN,U0,94H;得到给定值
CMP USIN,DLFK
JNH WAVEF0;给定小于反馈跳转
CALL DELAY
CMP USIN,DLFK
JNH WAVEF;给定并不大于反馈从新判断
;给定大于反馈处理程序
CLR AX
SUB AX,USIN,DLFK;给定大于反馈得到差值
CMP AX,CZWIDE;比较差值和迟滞宽度
JNH ONV4;给定-反馈<某值,开V2,V3进行充电
CALL OFFV4;给定-反馈>某值,关断V2,V3放电
;给定小于反馈处理程序
WAVEF0:
CALL DELAY
CMP USIN,DLFK
JH WAVEF;给定并不小于反馈从新判断
CLR AX
SUB AX,DLFK,USIN;给定小于反馈得到差值
CMP AX,CZWIDE;比较差值与迟滞宽度
JNH OFFV4;反馈-给定<某值,关断V2,V3继续放电
CALL ONV4;反馈-给定>某值,
;开通V4,交流整流时用单管
ONV4:
PUSHF
LDB HSO_COMMAND,#00100010B;HSO.2高电平输出
ADD HSO_TIME,TIMER1,#02
NOP
NOP
POPF
JMP WAIT1
;关断V4
OFFV4: PUSHF
LDB HSO_COMMAND,#00000010B;HSO.2低电平输出
ADD HSO_TIME,TIMER1,#02
NOP
NOP
POPF
JMP WAIT1
;开通V2
ONV2: PUSHF
LDB HSO_COMMAND,#00100001B;HSO.1高电平输出
ADD HSO_TIME,TIMER1,#02
NOP
NOP
POPF
JMP WAIT1
;关断V2
OFFV2:
PUSHF
LDB HSO_COMMAND,#00000001B;HSO.1低电平输出
ADD HSO_TIME,TIMER1,#02
NOP
NOP
POPF
JMP WAIT1
;对输入交流电流精密整流后进行AD转换
ADCHANGE5:
CLR BX
CLR AX
LDB NUMAD,#20;采样AD转换20次
ADBUSY: LDB AD_COMMAND,#00001000B;立即对A/D通道1转换
NOP
NOP
ADBUSY1:
JBS AD_LOW,3,ADBUSY1;正在转换,则等待
LDB BH,AD_HIGH;读A/D转换高8位
LDB BL,AD_LOW;读A/D转换低8位
SHR BX,#6;
ADD AX,BX
DECB NUMAD
JNE ADBUSY
DIVU AX,#30;求转换后平均值
CLR DLFK
LD DLFK,AX;得到电流反馈值
RET
;延时一段时间进行软件抗干扰
DELAY:
LDB NUMDELAY,#3
delay0: DECB NUMDELAY
JNE delay0
RET
;工频交流过零中断
hsi_int:
PUSHF
LD 0,HSI_TIME
JBS HSI_STATUS,4,DOWN;正半波中断跳转
JBS HSI_STATUS,6,UP;负半波中断跳转
RETURN: POPF
RET
UP:
ORB PORT1,#00000001B;测试HSI中断是否正确
LDB FLAG,#1
JMP RETURN
DOWN:
ANDB PORT1,#11111110B;测试HSI中断是否正确
LDB FLAG,#0
JMP RETURN
;软件定时中断
SOFTTIMER:
PUSHF
LDB HSO_COMMAND,#SOFT0_COM
ADD HSO_TIME,TIMER1,#DINGSHI;从设定软件定时命令
INCB WT
CMPB WT,#200
JNE RETURN
L:
CLR 84H
LD 84H,TIMER2
JMP L
LDB IOC0,#01010010B;允许T2CLK计数,允许HSO.2,HSO.3输入,每次写定时器2复位
LDB WT,#0
XORB PORT1,#00001000B
POPF
RET
;离散正弦值表
ORG 4000H
SIN: DB 000H,010H,01FH,02FH,03FH
DB 04EH,05DH,06CH,07AH,088H
DB 095H,0A2H,0AEH,0B9H,0C4H
DB 0CEH,0D7H,0DFH,0E6H,0EDH
DB 0F2H,0F6H,0FAH,0FCH,0FEH
DB 0FFH,0FEH,0FCH,0FAH,0F6H
DB 0F2H,0EDH,0E6H,0DFH,0D7H
DB 0CEH,0C4H,0B9H,0AEH,0A2H
DB 095H,088H,07AH,06CH,05DH
DB 04EH,03FH,02FH,01FH,010H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -