1、程序清单72 无位置传感器的无刷直流电动机调速控制程序程序清单7-2 无位置传感器的无刷直流电动机调速控制程序#include .SECTION/PM IVreset; JUMP START; .SECTION/PM IVint4; JUMP TRIP_IRQ; .SECTION/PM IVint5; JUMP PWMSYNC_IRQ; .section/data data1; .VAR STALL=0; .VAR COMP=0; .VAR CAPT=0; .VAR TIME=0; .VAR V1=0; .VAR V2=0; .VAR V3=0; .VAR NEUTRAL=0; .VAR BC
2、OUNT=0; .VAR FLAG=0; .VAR ASYM=0; .VAR FLAGUP=0; .VAR B2COUNT=0; .VAR FLAGCUR=0; .VAR SPEEDFLAG=1; .VAR SPEED_REF=145; .VAR SPEED_COUNT=0; .VAR KP=0x007D; .VAR S_K=0;.SECTION/PM program;START: DIS INT; INTERRUPT_INT: IRPTL=0; IMASK=0; ICNTL=0; IOPG=Interrupt_Controller_Page; AX0=0xFF01; IO(IPR2)=AX0
3、; AX0=0xFFFF; IO(IPR5)=AX0; IO(IPR3)=AX0; IO(IPR0)=AX0; IO(IPR1)=AX0; PWM_INT: IOPG=0x08; AX0=2500; IO(PWM0_TM)=AX0; AX0=75; IO(PWM0_DT)=AX0; AX0=0; IO(PWM0_CHA)=AX0; IO(PWM0_CHB)=AX0; IO(PWM0_CHC)=AX0; AX0=0x01D5; IO(0x008)=AX0; NOP; NOP;CLOCK_INT: IOPG=Clock_and_System_Control_Page; AX0=0x0100; IO
4、(PLLCTL)=AX0; NOP;ADC_INT: IOPG=ADC_Page; AX0=0x0200; IO(ADC_CTRL)=AX0; NOP; NOP; NOP; TMR_INT: IOPG=Timer_Page; AX0=0x001E; IO(T_CFGR0)=AX0; NOP; NOP;.SECTION/PM program;IPM_INT: IOPG=0x08; AX0=0x03; IO(PWM0_CTRL)=AX0; NOP;START_CHONG_DIAN: CNTR=0x0F; DO END_C_D UNTIL CE; NOP; NOP; NOP; NOP; NOP; N
5、OP; NOP; NOP; NOP;END_C_D: NOP;START_F_W: IOPG=0x08; AX0=0x0000; IO(PWM0_CHA)=AX0; NOP; IO(PWM0_CHB)=AX0; NOP; IO(PWM0_CHC)=AX0; AY0=0x002A; IO(PWM0_SEG)=AY0; NOP; CNTR=0x2710; NOP; DO END_F_W UNTIL CE; NOP;END_F_W: NOP; NOP; NOP; .SECTION/PM program; IOPG=0x08; AX0=DM(COMP); IO(PWM0_CHA)=AX0; IO(PW
6、M0_CHC)=AX0; AX0=0x006D; IO(PWM0_SEG)=AX0; NOP; IOPG=Timer_Page; AX0=0x0100; IO(T_GSR0)=AX0; IMASK=0x0070; ENA INT; NOP; MAGSTALL: NOP; NOP; NOP; AR=DM(STALL); NOP; AR=AR-0; NOP; IF EQ JUMP MAGSTALL; NOP; NOP;FINSH: IOPG=0x08; AX0=DM(COMP); IO(PWM0_CHB)=AX0; IO(PWM0_CHC)=AX0; AX0=0x0079; IO(PWM0_SEG
7、)=AX0; AX0=2; DM(CAPT)=AX0; LOOP1: NOP; NOP; NOP; NOP; NOP; NOP; AR=DM(FLAGCUR); AR=AR-0; IF EQ JUMP LOOP1; NOP; AX0=0; DM(FLAGCUR)=AX0; CALL SEQUENCE; NOP; JUMP LOOP1;.SECTION/PM program;SEQUENCE: AR=DM(TIME); AR=AR+1; DM(TIME)=AR; ENA M_MODE; I0=CAPT_DETER; AR=DM(CAPT); NOP; M0=AR; NOP; NOP; MODIF
8、Y(I0+=M0); NOP; NOP; NOP; JUMP (I0); CAPT_DETER: JUMP R1; JUMP F3; JUMP R2; JUMP F1; JUMP R3; JUMP F2;R2: IOPG=0x08; MX1=DM(COMP); IO(PWM0_CHB)=MX1; IO(PWM0_CHC)=MX1; AX0=0x0079; IO(PWM0_SEG)=AX0; AR=DM(ASYM); AR=AR+1; DM(ASYM)=AR; AX0=3; AR=AR-AX0; IF LE JUMP END_EXCH; NOP; AX0=3; DM(ASYM)=AX0; COM
9、_FLAG_R2: AR=DM(FLAG); AR=AR-0; IF NE JUMP END_EXCH; NOP; MX0=DM(V1); MY0=3; ASTAT=0; ENA M_MODE; AR=DM(NEUTRAL); MR=MX0*MY0(UU); AR=MR0-AR; IF GE JUMP END_EXCH; NOP; AX0=1; DM(FLAG)=AX0; AX0=DM(BCOUNT); DM(B2COUNT)=AX0; JUMP END_EXCH;F2: IOPG=0x08; MX1=DM(COMP); IO(PWM0_CHB)=MX1; IO(PWM0_CHC)=MX1;
10、AX0=0x00B6; IO(PWM0_SEG)=AX0; AR=DM(ASYM); AR=AR+1; DM(ASYM)=AR; AX0=3; AR=AR-AX0; IF LE JUMP END_EXCH; NOP; AX0=3; DM(ASYM)=AX0; COM_FLAG_F2: AR=DM(FLAG); AR=AR-0; IF NE JUMP END_EXCH; NOP; MY0=DM(V1); MX0=3; ASTAT=0; AR=DM(NEUTRAL); ENA M_MODE; MR=MX0*MY0(UU); AR=MR0-AR; IF LE JUMP END_EXCH; NOP;
11、AX0=1; DM(FLAG)=AX0; A X0=DM(BCOUNT); DM(B2COUNT)=A X0; JUMP END_EXCH;R3: IOPG=0x08; MX1=DM(COMP); IO(PWM0_CHA)=MX1; IO(PWM0_CHC)=MX1; AX0=0x011E; IO(PWM0_SEG)=AX0; AR=DM(ASYM); AR=AR+1; DM(ASYM)=AR; AX0=3; AR=AR-AX0; IF LE JUMP END_EXCH; NOP; AX0=3; DM(ASYM)=AX0; COM_FLAG_R3: AR=DM(FLAG); AR=AR-0;
12、IF NE JUMP END_EXCH; NOP; MX0=DM(V2); MY0=3; ASTAT=0; ENA M_MODE; AR=DM(NEUTRAL); MR=MX0*MY0(UU); AR=MR0-AR; IF GE JUMP END_EXCH; NOP; AX0=1; DM(FLAG)=AX0; AX0=DM(BCOUNT); DM(B2COUNT)=AX0; JUMP END_EXCH;F3: IOPG=0x08; MX1=DM(COMP); IO(PWM0_CHA)=MX1; IO(PWM0_CHC)=MX1; AX0=0x006D; IO(PWM0_SEG)=AX0; AR
13、=DM(ASYM); AR=AR+1; DM(ASYM)=AR; AX0=3; AR=AR-AX0; IF LE JUMP END_EXCH; NOP; AX0=3; DM(ASYM)=AX0; COM_FLAG_F3: AR=DM(FLAG); AR=AR-0; IF NE JUMP END_EXCH; NOP; MX0=DM(V2); MY0=3; ASTAT=0; ENA M_MODE; AR=DM(NEUTRAL); MR=MX0*MY0(UU); AR=MR0-AR; IF LE JUMP END_EXCH; NOP; AX0=1; DM(FLAG)=AX0; A X0=DM(BCO
14、UNT); DM(B2COUNT)=A X0; JUMP END_EXCH;R1: IOPG=0x08; MX1=DM(COMP); IO(PWM0_CHA)=MX1; IO(PWM0_CHB)=MX1; AX0=0x00A7; IO(PWM0_SEG)=AX0; AR=DM(ASYM); AR=AR+1; DM(ASYM)=AR; AX0=3; AR=AR-AX0; IF LE JUMP END_EXCH; NOP; AX0=3; DM(ASYM)=AX0; COM_FLAG_R1: AR=DM(FLAG); AR=AR-0; IF NE JUMP END_EXCH; NOP; MX0=DM
15、(V3); MY0=3; ASTAT=0; ENA M_MODE; AR=DM(NEUTRAL); MR=MX0*MY0(UU); AR=MR0-AR; IF GE JUMP END_EXCH; NOP; AX0=1; DM(FLAG)=AX0; AX0=DM(BCOUNT); DM(B2COUNT)=AX0; JUMP END_EXCH;F1: IOPG=0x08; MX1=DM(COMP); IO(PWM0_CHA)=MX1; IO(PWM0_CHB)=MX1; AX0=0x011B; IO(PWM0_SEG)=AX0; AR=DM(ASYM); AR=AR+1; DM(ASYM)=AR;
16、 AX0=3; AR=AR-AX0; IF LE JUMP END_EXCH; NOP; AX0=3; DM(ASYM)=AX0; AX0=1; DM(FLAGUP)=AX0; COM_FLAG_F1: AR=DM(FLAG); AR=AR-0; IF NE JUMP END_EXCH; NOP; MX0=DM(V3); MY0=3; ASTAT=0; ENA M_MODE; AR=DM(NEUTRAL); MR=MX0*MY0(UU); AR=MR0-AR; IF LE JUMP END_EXCH; NOP; AX0=1; DM(FLAG)=AX0; A X0=DM(BCOUNT); DM(
17、B2COUNT)=A X0; END_EXCH: RTS; .SECTION/PM program;PWMSYNC_IRQ: ENA SEC_REG,ENA SEC_DAG; IOPG=PWM0_Page; AX0=0x0200; IO(PWM0_STAT)=AX0; NOP; NOP; NOP; AR=DM(STALL); AR=AR-0; IF EQ JUMP VDC_IDC; NOP; AR=DM(SPEEDFLAG); AR=AR-0; IF NE JUMP VDC_IDC; NOP; AR=DM(SPEED_COUNT); AY0=2000; AR=AR-AY0; IF NE JUM
18、P NO_SPEED_REG; NOP; CALL SPEED_REG; NO_SPEED_REG: AR=DM(SPEED_COUNT); AR=AR+1; DM(SPEED_COUNT)=AR; VDC_IDC: IOPG=ADC_Page; AX0=IO(ADC_DATA1); SI=AX0; SR=LSHIFT SI BY -2(LO); DM(V1)=SR0; AX0=IO(ADC_DATA4); SI=AX0; SR=LSHIFT SI BY -2(LO); DM(V2)=SR0; AX0=IO(ADC_DATA5); SI=AX0; SR=LSHIFT SI BY -2(LO);
19、 DM(V3)=SR0; COMP_OK: AR=DM(FLAG); AR=AR-0; IF EQ JUMP NEU; NOP; AR=DM(B2COUNT); AR=AR-1; DM(B2COUNT)=AR; IF GE JUMP NEU; NOP; AR=DM(CAPT); AR=AR+1; DM(CAPT)=AR; AY0=5; AR=AR-AY0; IF LE JUMP OKCAPT; NOP; AR=0; DM(CAPT)=AR;OKCAPT: AX0=0; DM(FLAG)=AX0; DM(ASYM)=AX0; .SECTION/PM program;NEU: AR=DM(V1);
20、 AX0=DM(V2); AR=AR+AX0; AY0=DM(V3); AR=AR+AY0; DM(NEUTRAL)=AR; AR=1; DM(FLAGCUR)=AR; AR=DM(STALL); AR=AR-0; IF NE JUMP SPEEDUP; NOP; AR=DM(BCOUNT); AR=AR+1; DM(BCOUNT)=AR; AY0=0x00FF; AR=AR-AY0; IF LE JUMP RESTO; NOP; AX0=0; DM(TIME)=AX0; AX0=48; DM(BCOUNT)=AX0; AX0=1; DM(STALL)=AX0; DM(SPEEDFLAG)=A
21、X0; JUMP RESTO;SPEEDUP: AR=DM(CAPT); AY0=2; AR=AR-AY0; IF NE JUMP RESTO; NOP; AR=DM(FLAGUP); AR=AR-0; IF EQ JUMP RESTO; NOP; AX0=0; DM(SPEEDFLAG)=AX0; AF=PASS 0; ASTAT=0; AY0=DM(TIME); SR=LSHIFT AY0 BY 1(LO); AY0=SR0; AX0=12; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ
22、 AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DIVQ AX0; DM(BCOUNT)=AY0; AX0=5; AR=AX0-AY0; IF GT JUMP RESTO; NOP; AX0=10; AR=AX0-AY0; IF GT JUMP BUCHANG1; NOP; AR=DM(BCOUNT); AR=AR+1; DM(BCOUNT)=AR;BUCHANG1: AR=DM(BCOUNT); AR=AR+1; DM(BCOUNT)=AR;RESTO: AX0=0; DM(TIME)=A
23、X0; DM(FLAGUP)=AX0; DIS SEC_REG,DIS SEC_DAG; RTI; SPEED_REG: AX0=0; DM(SPEED_COUNT)=AX0; ASTAT=0; AF=PASS 0; AY0=0X0FFFF; AX0=DM(BCOUNT); SR=LSHIFT AX0 BY -1(HI); AX0=SR1; DIVQ AX0;DIVQ AX0;DIVQ AX0;DIVQ AX0; DIVQ AX0;DIVQ AX0;DIVQ AX0;DIVQ AX0; DIVQ AX0;DIVQ AX0;DIVQ AX0;DIVQ AX0; DIVQ AX0;DIVQ AX0
24、;DIVQ AX0;DIVQ AX0; AR=DM(SPEED_REF); AR=AR-AY0; MY0=DM(KP); MR=AR*MY0(SU); SR=ASHIFT MR1 BY 5(HI); SR=SR OR LSHIFT MR0 BY 5(LO); AX0=SR1; AR=DM(COMP); AR=AR+AX0; DM(COMP)=AR; IF LT JUMP SUB; NOP; AX0=2000; AR=AR-AX0; IF LE JUMP SPEED_END; NOP; DM(COMP)=AX0; JUMP SPEED_END;SUB: AX0=-425; AR=AR-AX0; IF GE JUMP SPEED_END; NOP; DM(COMP)=AX0; SPEED_END: RTS; .SECTION/PM program;TRIP_IRQ:LOOP2: AX0=0x0000; IO(0x000)=AX0; JUMP LOOP2; RTI;