📄 svpwm.asm
字号:
LENTH EQU 120 ;数据长度30
CurrentFrequency EQU 40H ;记数单元
MaxFrequency EQU 41H ;最高转速单元
OverCurrent BIT 00H ;过电流标志位
StartState EQU 42H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EFINT
ORG 0300H
MAIN:
MOV SP,#60H
MOV P0,#0FFH
SETB EX0
SETB IT0
SETB EA
CLR OverCurrent
MOV MaxFrequency ,#32H ;初始化最高转速为50Hz
SystemStart:MOV P2,#0FFH ;开启电机,判断p2.6
JB P2^6, SystemStart ;最高位D7表示方向,D6=0 启动,D6=1表示刹车.
RunStart: SETB P2^7
JB P2^7, ForwardRun ;正转运行
SJMP BackwardRun ;反转运行
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;正转运行程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ForwardRun: MOV DPTR,#TAB3
MOV StartState,#15H
MOV R0,#30 ;脉冲30个,每个脉冲分为4小区间
SETB P2^6
JB P2^6,FNext
SJMP VoltFreqTrans
FNext : MOV DPTR,#TAB2 ;当收到停止程序,电机反向加电能耗制动
MOV StartState,#2AH
MOV R0,#30
CLR C
MOV A,CurrentFrequency
SUBB A,#15
JC SmallSpeed1
LCALL VoltFreqSpeed
MOV R0,#LENTH
MOV DPTR,#TAB3
MOV B,#2AH
LCALL SELECTTAB
LJMP Stop
SmallSpeed1:LCALL VoltFreqSpeed1
MOV R0,#LENTH
MOV DPTR,#TAB3
MOV B,#2AH
LCALL SELECTTAB
LJMP Stop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;反转运行程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BackwardRun:MOV DPTR,#TAB2
MOV StartState,#2AH
MOV R0,#30 ;脉冲30个,每个脉冲分为4小区间
SETB P2^6
JB P2^6,BNext
SJMP VoltFreqTrans
BNext : MOV DPTR,#TAB3
MOV StartState,#15H
MOV R0,#30
CLR C
MOV A,CurrentFrequency
SUBB A,#15
JC SmallSpeed2
LCALL VoltFreqSpeed
MOV R0,#LENTH
MOV DPTR,#TAB2
MOV B,#2AH
LCALL SELECTTAB
LJMP Stop
SmallSpeed2:LCALL VoltFreqSpeed1
MOV R0,#LENTH
MOV DPTR,#TAB2
MOV B,#2AH
LCALL SELECTTAB
LJMP Stop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;U/F转换程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VoltFreqTrans:
MOV P2,#0FFH
MOV CurrentFrequency,P2
ANL CurrentFrequency,#3FH
CLR C
MOV A,MaxFrequency ; 50hz,最高频率
SUBB A,CurrentFrequency ;example CurrentFrequency=40hz,substact10hz
NextStep0: CJNE A,#10,Step5040
Step5040: JNC NextStep1
MOV R1,A ;用于调整占空比
MOV R4,#01H
AJMP common
NextStep1: CJNE A,#20,Step4030
Step4030: JNC NextStep2
ADD A,#01H
MOV R1,A ;用于调整占空比
MOV R4,#01H
AJMP common
NextStep2: CJNE A,#25,Step3025
Step3025: JNC NextStep3
ADD A,#07H
MOV R1,A ;用于调整占空比
MOV R4,#03H
AJMP common
NextStep3: CJNE A,#35,Step2515
Step2515: JNC NextStep4
MOV A,#26
SUBB A,CurrentFrequency
MOV B,#04
MUL AB
ADD A,#39
MOV R1,A ;用于调整占空比
MOV R4,#06H
AJMP common
NextStep4: CJNE A,#40,Step1510
Step1510: JNC NextStep5
MOV A,#16
SUBB A,CurrentFrequency
MOV B,#11
MUL AB
ADD A,#76
MOV R1,A
MOV R5,#01H ;用于调整占空比
MOV R4,#0EH
LJMP common1
NextStep5: CJNE A,#45,Step1005
Step1005: JNC NextStep6
MOV A,#11
SUBB A,CurrentFrequency
MOV B,#27 ;Fcommon
MUL AB
MOV R5,A
INC R5
MOV R1,#133 ;用于调整占空比
MOV R4,#11H
LJMP common1
NextStep6: CJNE A,#49,Step0501
Step0501: JNC NextStep7
MOV A,#7
SUBB A,CurrentFrequency
MOV B,#84 ;Fcommon
MUL AB
MOV R5,A
INC R5
MOV R1,#221 ;用于调整占空比
MOV R4,#1BH
LJMP common1
NextStep7: AJMP Stop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50HZ到15HZ之间的程序;;;;;;;;;;;;;;;;;;;;;;;;;;;
common: MOV B,StartState
LCALL VoltFreqSpeed
AJMP RunStart
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15HZ到5HZ之间的程序;;;;;;;;;;;;;;;;;;;;;;;;;;;
common1: MOV B,StartState
LCALL VoltFreqSpeed1
AJMP RunStart
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;停止程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Stop: MOV P1,#00H
AJMP SystemStart
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50HZ到15HZU/F调速程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;注意:当程序跳转到AlarmStop时,程序在AlarmStop返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VoltFreqSpeed:
JNB OverCurrent,Normal1
LJMP AlarmStop
Normal1: MOV A,#00H ;第一小区
MOVC A,@A+DPTR
MOV R3,A
ANL A,B
JNB OverCurrent,Normal11A
LJMP AlarmStop
Normal11A:
MOV P1,A
MOV A,R3
MOV B,A
INC DPTR
JNB OverCurrent,Normal11B
LJMP AlarmStop
Normal11B:
MOV P1,A
MOV A,#00H
MOVC A,@A+DPTR
ADD A,R1 ;调整占空比
MOV R2,A
VoltFreqTime1: NOP
NOP
NOP
NOP
NOP
DJNZ R2,VoltFreqTime1
INC DPTR
MOV A,#00H ;第二小区
MOVC A,@A+DPTR
MOV R3,A
ANL A,B
JNB OverCurrent,Normal12A
LJMP AlarmStop
Normal12A:
MOV P1,A
MOV A,R3
MOV B,A
INC DPTR
JNB OverCurrent,Normal12B
LJMP AlarmStop
Normal12B:
MOV P1,A
MOV A,#00H
MOVC A,@A+DPTR
ADD A,R4
MOV R2,A
VoltFreqTime2: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R2,VoltFreqTime2
INC DPTR
MOV A,#00H ;第三小区
MOVC A,@A+DPTR
MOV R3,A
ANL A,B
JNB OverCurrent,Normal13A
LJMP AlarmStop
Normal13A:
MOV P1,A
MOV A,R3
MOV B,A
INC DPTR
JNB OverCurrent,Normal13B
LJMP AlarmStop
Normal13B:
MOV P1,A
MOV A,#00H
MOVC A,@A+DPTR
ADD A,R4
MOV R2,A
VoltFreqTime3: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R2,VoltFreqTime3
INC DPTR
MOV A,#00H ;第四小区
MOVC A,@A+DPTR
MOV R3,A
ANL A,B
JNB OverCurrent,Normal14A
LJMP AlarmStop
Normal14A:
MOV P1,A
MOV A,R3
MOV B,A
INC DPTR
JNB OverCurrent,Normal14B
LJMP AlarmStop
Normal14B:
MOV P1,A
MOV A,#00H
MOVC A,@A+DPTR
ADD A,R1
MOV R2,A
VoltFreqTime4: NOP
NOP
NOP
NOP
NOP
DJNZ R2,VoltFreqTime4
DEC R0
INC DPTR
CJNE R0,#0,TempA
RET
TempA: AJMP VoltFreqSpeed
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15HZ到5HZU/F调速程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -