📄 dc_pwm2.asm
字号:
/*直流电动机双极性可逆双闭环PWM控制程序*/
.INCLUDE "240x.H"
/*--------------------------------------以下定义变量和常数---------------------------*/
.DATA
.BSS N_KP,1 ;速度调节比例系数
.BSS N_KI,1 ;速度调节积分系数
.BSS N_KC,1 ;速度调节积分饱和修正系数
.BSS I_KP,1 ;电流调节比例系数
.BSS I_KI,1 ;电流调节积分系数
.BSS I_KC,1 ;电流调节积分饱和修正系数
.BSS I_REF,1 ;电流参考值
.BSS N_REF,1 ;速度参考值
.BSS DIRECTION,1 ;速度方向标志
.BSS STACK,6 ;软堆栈初始地址
.BSS I_EK,1 ;电流偏差
.BSS I_RK,1 ;电流第K次积分调节累计
.BSS I_U,1 ;电流调节输出
.BSS I_ELPI,1 ;电流极限偏差
.BSS TMP,1 ;临时变量
.BSS ENCODEROLD,1 ;前一次编码器读数
.BSS ENCINCR,1 ;编码增量
.BSS SPEEDTMP,1 ;编码脉冲累计
.BSS SPEEDSTEP,1 ;速度调节计数器
.BSS KSPEED,1 ;编码脉冲-速度转换系数
.BSS N,1 ;速度反馈量
.BSS N_EK,1 ;速度偏差
.BSS N_RK,1 ;速度第K次积分调节累计
.BSS N_U,1 ;速度调节输出
.BSS N_ELPI,1 ;速度极限偏差
.BSS I_MIN,1 ;电流最小值
.BSS I_MAX,1 ;电流最大值
/*--------------------------------------定义主向量----------------------------------------------------*/
.SECT "VECTORS"
RSVECT B _C_INT0 ;复位
INT1 B PHANTOM ;INT1
INT2 B PHANTOM ;INT2
INT3 B PHANTOM ;INT3
INT4 B PHANTOM ;INT4
INT5 B PHANTOM ;INT5
INT6 B ADCINT ;ADC中断
RESERVED B PHANTOM ;地址000EH,测试,优先级10
SW_INT8 B PHANTOM ;地址0010H,自定义软中断
SW_INT9 B PHANTOM ;地址0012H,自定义软中断
SW_INT10 B PHANTOM ;地址0014H,自定义软中断
SW_INT11 B PHANTOM ;地址0016H,自定义软中断
SW_INT12 B PHANTOM ;地址0018H,自定义软中断
SW_INT13 B PHANTOM ;地址001AH,自定义软中断
SW_INT14 B PHANTOM ;地址001CH,自定义软中断
SW_INT15 B PHANTOM ;地址001EH,自定义软中断
SW_INT16 B PHANTOM ;地址0020H,自定义软中断
TRAP B PHANTOM ;地址0022H,TRAP矢量
NMI B PHANTOM ;地址0024H,NMI,优先级3
EMU_TRAP B PHANTOM ;地址0026H,仿真Trap,优先级2
SW_INT20 B PHANTOM ;地址0028H,自定义软中断
SW_INT21 B PHANTOM ;地址002AH,自定义软中断
SW_INT22 B PHANTOM ;地址002CH,自定义软中断
SW_INT23 B PHANTOM ;地址002EH,自定义软中断
SW_INT24 B PHANTOM ;地址0030H,自定义软中断
SW_INT25 B PHANTOM ;地址0032H,自定义软中断
SW_INT26 B PHANTOM ;地址0034H,自定义软中断
SW_INT27 B PHANTOM ;地址0036H,自定义软中断
SW_INT28 B PHANTOM ;地址0038H,自定义软中断
SW_INT29 B PHANTOM ;地址003AH,自定义软中断
SW_INT30 B PHANTOM ;地址003CH,自定义软中断
SW_INT31 B PHANTOM ;地址003EH,自定义软中断
/*--------------------------------------以下是主程序-------------------------------------------------*/
.TEXT
/*--------------------------------------初始化程序---------------------------------------------------*/
_C_INT0
SETC CNF
CLRC OVM
SETC SXM ;符号扩展
SETC INTM ;关中断
LAR AR1,#STACK ;软堆栈指针
LDP #0E0H
SPLK #68H, WDCR ;不用看门狗
SPLK #0284H,SCSR1 ;10MCLKIN,20MCLKOUT
LDP #0E8H
SPLK #0FFFFH,T2PR ;最大周期
SPLK #0000H,T2CNT
SPLK #9870H,T2CON ;定向增减,允许编码接口
SPLK #500,T1PR ;PWM设置,周期50微秒
SPLK #0000H,T1CNT
SPLK #0096H,ACTRA ;PWM1,4高有效,2,3低有效
SPLK #01F4H,DBTCONA ;死区1.6微秒
SPLK #250,CMPR1 ;占空比为50%
SPLK #250,CMPR2
SPLK #8200H,COMCONA ;允许比较,T1下溢重载
SPLK #0840H,T1CON ;连续增减计数,内部时钟,不分频
SPLK #0100H,GPTCONA ;T1周期中断标志启动AD转换
LDP #0E1H
SPLK #03D8H, MCRA ;引脚设置为PWM1-4,QEP1-2
LDP #0
LACC #020H
SACL IMR ;允许INT6中断
LACC IFR ;清标志
SACL IFR
LDP #0E8H
LACC EVAIFRA ;清标志
SACL EVAIFRA
LACC EVAIFRB
SACL EVAIFRB
LACC EVAIFRC
SACL EVAIFRC
SPLK #0,EVAIMRA
SPLK #0,EVAIMRB
SPLK #0,EVAIMRC
LDP #0E0H ;AD设置
SPLK #0500H,ADCTRL2 ;允许EVA启动AD转换
SPLK #0900H,ADCTRL1 ;10分频
SPLK #0000H,MAXCONV ;一个转换通道
SPLK #0000H,CHSELSEQ1 ;ADCIN00通道
CLRC INTM ;开总中断
LDP #0 ;变量初始化
SPLK #0,I_REF
SPLK #0,N_REF
SPLK #I_KP,I_KP ;给电流比例系数赋值,Q12格式
SPLK #I_KI,I_KI ;给电流积分系数赋值,Q12格式
SPLK #I_KC,I_KC ;给电流积分饱和修正系数赋值,Q12格式
SPLK #N_KP,N_KP ;给速度比例系数赋值,Q12格式
SPLK #N_KI,N_KI ;给速度积分系数赋值,Q12格式
SPLK #N_KC,N_KC ;给速度积分饱和系数赋值,Q12格式
SPLK #1, DIRECTION ;正转
SPLK #0, I_RK
SPLK #0, I_ELPI
SPLK #0, ENCODEROLD
SPLK #0, SPEEDTMP
SPLK #100, SPEEDSTEP ; 100个PWM周期
SPLK #1000H, KSPEED ;编码脉冲-速度转换系数,Q22格式
SPLK #0, N_RK
SPLK #I_MIN,I_MIN ;给电流最小值赋值
SPLK # I_MAX,I_MAX ;给电流最大值赋值
/*--------------------------------------以下可添加应用程序----------------------------------------------*/
LOOP LDP #0
NOP
NOP
B LOOP ;循环
/*--------------------------------------假中断处理------------------------------------------------------*/
PHANTOM
CLRC INTM
RET
/*--------------------------------------A/D中断处理子程序---------------------------------------------*/
ADCINT
MAR *,AR1 ;保存现场
MAR *+
SST #1, *+ ;保存ST1
SST #0, * ;保存ST0
LDP #0E0H
LACC PIVR ;清ADC中断标志
LDP #0E8H
LACC EVAIFRA ;清T1周期中断标志
SACL EVAIFRA
LDP #0E1H
LACC ADCTRL2
OR #0202H
SACL ADCTRL2
/*-------------------------------------电流PI调节----------------------------------------------------*/
LACC RESULT0,10 ;读ADC转换结果
LDP #0
SUB I_REF,16 ;减电流参考值,计算电流偏差
NEG
SACL I_EK ;保存偏差
LACC I_RK,12 ;左移12位
LT I_EK
MPY I_KP ;Q12格式
APAC
SACH I_U,4 ;相当于右移12位
BIT I_U,0 ;检测调节器输出的正负
BCND UP,NTC ;如果正,跳转
LACC #0 ;否则是负
B LIMITERS
UP
BIT DIRECTION,15 ;检测转向
BCND CW,TC ;正转,跳转
LACC #500 ;否则反转.检测是否超过上限
SUB I_U
BCND TOP,LT ;超过上限进入饱和区则跳转
LACC #250 ;否则检测下限
SUB I_U
BCND LOW,GT ;超过下限跳转
LACC I_U ;否则正常调整
B LIMITERS
TOP
LACC #500 ;ACC =上限值
B LIMITERS
LOW
LACC #250
B LIMITERS
CW LACC #250 ;检测是否超过上限
SUB I_U
BCND CWTOP,LT ;超过上限跳转
LACC I_U ;否则正常调整
B LIMITERS
CWTOP
LACC #250 ;ACC=上限值
LIMITERS
LDP #0E8H
SACL CMPR2 ;输出,更新占空比
SACL CMPR1 ;更新占空比
LDP #0
SUB I_U
SACL I_ELPI ;求极限偏差
LT I_ELPI
MPY I_KC ;Q12格式
PAC
LT I_EK
MPY I_KI ;Q12格式
APAC
ADD I_RK,12
SACH I_RK,4 ;更新
/*-----------------------读编码器脉冲数,计算转角增量和转速-----------------------------------------*/
LDP #0E8H
LACC T2CNT ;读编码脉冲
LDP #0
SACL TMP
SUB ENCODEROLD ;减去前一个周期测的脉冲数
SACL ENCINCR ;得到编码增量
ADD SPEEDTMP
SACL SPEEDTMP ;编码脉冲累计
LACC TMP
SACL ENCODEROLD ;更新ENCODEROLD
LACC SPEEDSTEP ;检测是否该速度调节
SUB #1
SACL SPEEDSTEP
BCND GO,GT ;没到,退出
LT SPEEDTMP ;否则计算转速
MPY KSPEED ;Q22格式
PAC
SACH N,6 ;相当于右移10位,Q12格式
LT N
MPY #3000
PAC
SACH N,4 ;速度反馈值,Q0格式
LACC #0
SACL SPEEDTMP ;SPEEDTMP清零
SPLK #100, SPEEDSTEP ; SPEEDSTEP重新赋初值
/*--------------------------------------速度PI调节-----------------------------------------------------------*/
LACC N_REF ;速度给定值,由外部输入
SUB N ;减反馈值
SACL N_EK ;保存偏差
LACC N_RK,12 ;左移12位
LT N_EK
MPY N_KP ;比例系数,Q12格式
APAC
SACH N_U,4 ;相当于右移12位
LACC N_U ;检测调节器输出是否超限
SUB I_MIN ;与下限比较
BCND POS1,GT ;如果大于则跳转
LACC I_MIN ;否则超过下限
B LIM ;ACC =下限值
POS1
LACC N_U
SUB I_MAX ;与上限比较
BCND POS2,GT ;超过上限则跳转
LACC N_U ;否则正常调整
B LIM
POS2
LACC I_MAX ; ACC =上限值
LIM
SACL I_REF ;输出
SUB N_U
SACL N_ELPI ;求极限偏差
LT N_ELPI
MPY N_KC ;积分饱和修正系数,Q12格式
PAC
LT N_EK
MPY N_KI ;积分系数,Q12格式
APAC
ADD N_RK,12
SACH N_RK,4 ;更新N_RK
/*-------------------------------------恢复现场退出----------------------------------------------------------*/
GO MAR *, AR1 ;恢复现场
LST #0, *- ;恢复ST0
LST #1, *- ;恢复ST1
CLRC INTM
RET
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -