无位置传感器的无刷直流电动机调速控制程序.docx
《无位置传感器的无刷直流电动机调速控制程序.docx》由会员分享,可在线阅读,更多相关《无位置传感器的无刷直流电动机调速控制程序.docx(20页珍藏版)》请在冰豆网上搜索。
无位置传感器的无刷直流电动机调速控制程序
《无位置传感器的无刷直流电动机调速控制程序》
.include"240x.h"
.global_c_int0
;--------------------------------------以下定义常数和变量--------------------------------------------------
KP.set245;电流调节比例系数,0.12的Q11格式
KPS.set100;速度调节比例系数
.bssCAPT,1;换相控制字
.bssCOMP,1;更新占空比的比较值,由电流调节输出
.bssIDC_REF,1;电流参考值,由速度调节输出
.bssIDC_ERRORK,1;电流偏差
.bssFLAGCUR,1;更新比较值和换相标志,1-允许更新,0-不允许
.bssSPEED_REF,1;给定速度参考
.bssV_ERRORK,1;速度偏差
.bssSPEED_COUNT,1;速度调节环计数器
.bssV1,1;相电压1
.bssV2,1;相电压2
.bssV3,1;相电压3
.bssNEUTRAL,1;中性点电压
.bssFLAG,1;感应电动势变符号标志,1-变了;0-没变
.bssFLAGUP,1;转过一机械转标志,1-没转过,0-转过
.bssBCOUNT,1;延迟时间更新值,磁定位时临时变量
.bssB2COUNT,1;延迟时间
.bssSTALL,1;磁定位结束标志,1-结束,0-没结束
.bssASYM,1;延时计算感应电动势计数器
.bssSPEEDFLAG,1;第一转时禁止速度调节标志,1-禁止,0-允许
.bssTIME,1;每转时间计数器
.bssSTACK,6;软堆栈区
;--------------------------------------定义主向量-------------------------------------------------------------
.sect"vectors"
RSVECTB_c_int0;复位
INT1BPHANTOM;INT1
INT2BPHANTOM;INT2
INT3BPHANTOM;INT3
INT4BPHANTOM;INT4
INT5BPHANTOM;INT5
INT6BADCINT;ADC中断
… ;略
;--------------------------------------以下是程序-------------------------------------------------------------
.text
;--------------------------------------初始化程序--------------------------------------------------------------
_c_int0
SETCCNF
CLRCOVM
SETCSXM;符号扩展
SETCINTM;关中断
LARAR1,#STACK
LDP#0E0H
SPLK#68H,WDCR;不用看门狗
SPLK#0284H,SCSR1;10MCLKIN,20MCLKOUT
LDP#0E8H
SPLK#500,T1PR;PWM设置,周期50微秒
SPLK#0000H,T1CNT
SPLK#0FFFH,ACTRA;PWM1~6全部高电平输出
SPLK#01F4H,DBTCONA;死区1.6微秒
SPLK#500,CMPR1;占空比为0
SPLK#500,CMPR2
SPLK#500,CMPR3
SPLK#8200H,COMCONA;允许比较,T1下溢重载
SPLK#0840H,T1CON;连续增减计数,内部时钟,不分频
SPLK#0100H,GPTCONA;T1周期中断标志启动AD转换
LDP#0E1H
SPLK#0FC0H,MCRA;引脚设置为PWM
LDP#0
LACC#020H
SACLIMR;允许INT6中断
LACCIFR;清标志
SACLIFR
LDP#0E8H
LACCEVAIFRA;清标志
SACLEVAIFRA
LACCEVAIFRB
SACLEVAIFRB
LACCEVAIFRC
SACLEVAIFRC
SPLK#0,EVAIMRA;屏蔽中断
SPLK#0,EVAIMRB
SPLK#0,EVAIMRC
LDP#0E1H;AD设置
SPLK#0500H,ADCTRL2;允许EVA启动AD转换
SPLK#0900H,ADCTRL1;10分频
SPLK#0003H,MAXCONV;4个转换通道
SPLK#3210H,CHSELSEQ1;ADCIN00-03通道
CLRCINTM;开总中断
;--------------------------------------变量初始化---------------------------------------------------------
LDP#0;变量初始化
SPLK#020H,IDC_REF;磁定位电流
SPLK#0,IDC_ERRORK
SPLK#0300H,SPEED_REF;转速初值
SPLK#00112,COMP;最小占空比
SPLK#0000H,FLAGCUR
SPLK#0000H,SPEED_COUNT
SPLK#0000H,CAPT
SPLK#0000H,V1
SPLK#0000H,V2
SPLK#0000H,V3
SPLK#0000H,NEUTRAL
SPLK#0000H,FLAG
SPLK#0001H,FLAGUP;没转过一转
SPLK#0001H,SPEEDFLAG;禁止速度调节
SPLK#0000H,BCOUNT
SPLK#0000H,B2COUNT
SPLK#0000H,STALL
SPLK#0000H,ASYM
SPLK#0000H,V_ERRORK
SPLK#0000H,TIME
;--------------------------------------准备磁定位-------------------------------------------------------------
LDP#0
LACCCOMP;装载比较初值
LDP#0E8H;反相驱动
SPLK#03FDH,ACTRA;PWM1低有效,PWM6低电平,其它高电平
SACLCMPR1;A相入,C相出,B相不通电
SPLK#0000H,CMPR2
SPLK#0000H,CMPR3
;--------------------------------------等待磁定位结束------------------------------------------------------
MAGSTALL
LDP#0
LACCSTALL;检测磁定位是否结束
BCNDMAGSTALL,EQ;没结束继续等待
;--------------------------------------磁定位结束换相----------------------------------------------------
LACCCOMP
LDP#0E8H
SPLK#03DFH,ACTRA;PWM3低有效,PWM6低电平,其它高电平
SACLCMPR2;B相入,C相出,A不通电
SPLK#0000H,CMPR3
SPLK#0000H,CMPR1
LDP#0
SPLK#4,CAPT;CAPT初值
;--------------------------------------主循环-----------------------------------------------------------------
LOOP
LDP#0
LACCFLAGCUR;检测是否更新比较值
BCNDLOOP,EQ;不更新跳转
SPLK#0,FLAGCUR;更新,清标志
CALLSEQUENCE;调用更新子程序
BLOOP;等待下次更新
;--------------------------------------假中断处理-------------------------------------------------------------
PHANTOM
CLRCINTM
RET
;--------------------------------------更新比较值或换相子程序-----------------------------------------
SEQUENCE
LDP#0
LACCTIME;每转时间计数器
ADD#1
SACLTIME
LACCCAPT;换相控制字
ADD#CAPT_DETER;加起始地址
BACC
CAPT_DETER
BRISING1;相当于H1上升沿
BFALLING3;相当于H3下降沿
BRISING2;相当于H2上升沿
BFALLING1;相当于H1下降沿
BRISING3;相当于H3上升沿
FALLING2;相当于H2下降沿
LACCCOMP
LDP#0E8H
SPLK#0D3FH,ACTRA;PWM5低有效,PWM4低电平,其它高电平
SACLCMPR3;C相入,B相出,A相不通电
SPLK#0000H,CMPR2
SPLK#0000H,CMPR1
LDP#0;延时过滤干扰
LACCASYM;延时计数器
ADD#1;加1
SACLASYM
SUB#10;检测是否到计数值
BCNDEND,LEQ;没到,退出
SPLK#10,ASYM;计数值已到,测量感应电动势过零点
LACCFLAG;感应电动势符号变化?
BCNDEND,NEQ;变了,退出
LACCV1,1;没变,检测.V1乘2
ADDV1;ACC=3*(BEMFA+NEUTRAL)
SUBNEUTRAL;ACC=3*BEMFA
BCNDEND,LT;<0符号没变,退出
SPLK#1,FLAG;否则符号改变,置过零标志
LACCBCOUNT
SACLB2COUNT;更新延迟时间
BEND;退出
RISING3
LACCCOMP
LDP#0E8H
SPLK#0DF3H,ACTRA;PWM5低有效,PWM2低电平,其它高电平
SACLCMPR3;C相入,A相出,B相不通电
SPLK#0000H,CMPR2
SPLK#0000H,CMPR1
LDP#0;延时过滤干扰
LACCASYM;延时计数器
ADD#1;加1
SACLASYM
SUB#10;检测是否到计数值
BCNDEND,LEQ;没到,退出
SPLK#10,ASYM;计数值已到,测量感应电动势过零点
LDP#0
LACCFLAG;感应电动势符号变化?
BCNDEND,NEQ;变了,退出
LACCV2,1;没变,检测.V2乘2
ADDV2;ACC=3*(BEMFB+NEUTRAL)
SUBNEUTRAL;ACC=3*BEMFB
BCNDEND,GEQ;≥0符号没变,退出
SPLK#1,FLAG;否则符号改变,置过零标志
LACCBCOUNT
SACLB2COUNT;更新延迟时间
BEND;退出
FALLING3
LACCCOMP
LDP#0E8H
SPLK#03FDH,ACTRA;PWM1低有效,PWM6低电平,其它高电平
SACLCMPR1;A相入,C相出,B相不通电
SPLK#0000H,CMPR2
SPLK#0000H,CMPR3
LDP#0;延时过滤干扰
LACCASYM;延时计数器
ADD#1;加1
SACLASYM
SUB#10;检测是否到计数值
BCNDEND,LEQ;没到,退出
SPLK#10,ASYM;计数值已到,测量感应电动势过零点
LDP#0
LACCFLAG;感应电动势符号变化?
BCNDEND,NEQ;变了,退出
LACCV2,1;没变,检测.V2乘2
ADDV2;ACC=3*(BEMFB+NEUTRAL)
SUBNEUTRAL;ACC=3*BEMFB
BCNDEND,LT;<0符号没变,退出
SPLK#1,FLAG;否则符号改变,置过零标志
LACCBCOUNT
SACLB2COUNT;更新延迟时间
BEND;退出
RISING2
LACCCOMP
LDP#0E8H
SPLK#03DFH,ACTRA;PWM3低有效,PWM6低电平,其它高电平
SACLCMPR2;B相入,C相出,A相不通电
SPLK#0000H,CMPR3
SPLK#0000H,CMPR1
LDP#0;延时过滤干扰
LACCASYM;延时计数器
ADD#1;加1
SACLASYM
SUB#10;检测是否到计数值
BCNDEND,LEQ;没到,退出
SPLK#10,ASYM;计数值已到,测量感应电动势过零点
LDP#0
LACCFLAG;感应电动势符号变化?
BCNDEND,NEQ;变了,退出
LACCV1,1;没变,检测.V1乘2
ADDV1;ACC=3*(BEMFA+NEUTRAL)
SUBNEUTRAL;ACC=3*BEMFA
BCNDEND,GEQ;≥0符号没变,退出
SPLK#1,FLAG;否则符号改变,置过零标志
LACCBCOUNT
SACLB2COUNT;更新延迟时间
BEND;退出
RISING1
LACCCOMP
LDP#0E8H
SPLK#0F3DH,ACTRA;PWM1低有效,PWM4低电平,其它高电平
SACLCMPR1;A相入,B相出,C相不通电
SPLK#0000H,CMPR2
SPLK#0000H,CMPR3
LDP#0;延时过滤干扰
LACCASYM;延时计数器
ADD#1;加1
SACLASYM
SUB#10;检测是否到计数值
BCNDEND,LEQ;没到,退出
SPLK#10,ASYM;计数值已到,测量感应电动势过零点
LDP#0
LACCFLAG;感应电动势符号变化?
BCNDEND,NEQ;变了,退出
LACCV3,1;没变,检测.V3乘2
ADDV3;ACC=3*(BEMFC+NEUTRAL)
SUBNEUTRAL;ACC=3*BEMFC
BCNDEND,GEQ;≥0符号没变,退出
SPLK#1,FLAG;否则符号改变,置过零标志
LACCBCOUNT
SACLB2COUNT;更新延迟时间
BEND;退出
FALLING1
LACCCOMP
LDP#0E8H
SPLK#0FD3H,ACTRA;PWM3低有效,PWM2低电平,其它高电平
SACLCMPR2;B相入,A相出,C相不通电
SPLK#0000H,CMPR3
SPLK#0000H,CMPR1
LDP#0;延时过滤干扰
LACCASYM;延时计数器
ADD#1;加1
SACLASYM
SUB#10;检测是否到计数值
BCNDEND,LEQ;没到,退出
SPLK#10,ASYM;计数值已到,测量感应电动势过零点
LDP#0
SPLK#0,FLAGUP;转过一机械转,置标志
LACCFLAG;感应电动势符号变化?
BCNDEND,NEQ;变了,退出
LACCV3,1;没变,检测.V3乘2
ADDV3;ACC=3*(BEMFC+NEUTRAL)
SUBNEUTRAL;ACC=3*BEMFC
BCNDEND,LT;<0符号没变,退出
SPLK#1,FLAG;否则符号改变,置过零标志
LACCBCOUNT
SACLB2COUNT;更新延迟时间
END
RET
;--------------------------------------速度计算和调节子程序------------------------------------------------
SPEED_REG
LDP#0
SPLK#32,SPEED_COUNT;25
CLRCSXM
LACC#0
OR#0FFFFH;ACC=FFFFH无符号数
RPT#15
SUBCBCOUNT;除1/12机械转时间
AND#0FFFFH;屏蔽高位
SETCSXM
SUBSPEED_REF
NEG;速度偏差=SPEED_REF-SPEED
BCNDPOS,GEQ;检测偏差是否超限.≥0跳转
ABS;<0则取绝对值
SPLK#-32,SPEED_COUNT;-25
POS
SACLV_ERRORK;保存速度偏差
SUB#03FFH;检测上限
BCNDOKPOS,LEQ;不超上限则跳转
SPLK#03FFH,V_ERRORK;否则=3FFH
OKPOS
LTV_ERRORK;-1024<速度偏差<1024
MPYSPEED_COUNT;乘25
PAC
SACLV_ERRORK;速度偏差<<5
LTV_ERRORK;速度比例调节
MPY#KPS;乘比例系数
PAC
ADDIDC_REF,16
SACHIDC_REF;IDC_REF(K)=IDC_REF(K-1)+KPS*V_ERRORK
LACCIDC_REF;检测IDC_REF是否超限
BCNDRES,GEQ;≥0跳转
SPLK#0,IDC_REF;超下限则=0
RES
SPLK#0,SPEED_COUNT;速度调节环计数器清0
RET
;--------------------------------------ADC中断子程序---------------------------------------------------
ADCINT;每50微秒转换一次
MAR*,AR1;保存现场
MAR*+
SST#1,*+;保存ST1
SST#0,*+;保存ST0
SACH*+;保存ACC高16位
SACL*;保存ACC低16位
;--------------------------------------速度调节与否---------------------------------------------------------------
LDP#0
LACCSTALL;检测磁定位是否完成?
BCNDVDC_IDC,EQ;STALL=0(磁定位没完成)禁止速度调节
LACCSPEEDFLAG;禁止速度调节?
BCNDVDC_IDC,NEQ;SPEEDFLAG=1,禁止速度调节
LACCSPEED_COUNT;检测是否该速度调节?
SUB#2000;每100ms进行一次速度调节
BCNDNO_SPEED_REG,NEQ;时间没到,跳转
CALLSPEED_REG;时间到,调速度调节子程序
NO_SPEED_REG
LACCSPEED_COUNT
ADD#1
SACLSPEED_COUNT;SPEED_COUNT+1
;--------------------------------------读ADC转换结果-------------------------------------------------------
VDC_IDC
LDP#0E0H
LACCPIVR;清ADC中断标志
LDP#0E8H
LACCEVAIFRA;清T1周期中断标志
SACLEVAIFRA
LDP#0E1H
LACCADCTRL2
OR#0202H
SACLADCTRL2
LACCRESULT0,10;读电流值
LDP#0
SACHIDC_ERRORK
LDP#0E1H
LACCRESULT1,10;读A相电压
LDP#0
SACHV1
LDP#0E1H
LACCRESULT2,10;读B相电压
LDP#0
SACHV2
LDP#0E1H
LACCRESULT3,10;读C相电压
LDP#0
SACHV3
;--------------------------------------电流比例调节-----------------------------------------------------------
SETCSXM
LACCIDC_ERRORK,5;Q5格式
SUBIDC_REF,5
SACLIDC_ERRORK;保存电流偏差,Q5格式
LTIDC_ERRORK;电流比例调节
MPY#KP;Q11格式
PAC;ACC=KP*IDC_ERRORK
ADDCOMP,16
SACHCOMP;KP*IDC_ERRORK+COMP(K-1)
LACCCOMP;检测是否超限
BCNDSUP_LIM,GT
SPLK#0,COMP;超过下限,COMP=0
BCOMP_OK
SUP_LIM
SUB#0500
BCNDCOMP_OK,LT
SPLK#0500,COMP;超过上限,COMP=500
COMP_OK;在上下限内
;--------------------------------------换相准备-----------------------------------------------------