无位置传感器的无刷直流电动机调速控制程序.docx

上传人:b****7 文档编号:25063466 上传时间:2023-06-04 格式:DOCX 页数:20 大小:18.97KB
下载 相关 举报
无位置传感器的无刷直流电动机调速控制程序.docx_第1页
第1页 / 共20页
无位置传感器的无刷直流电动机调速控制程序.docx_第2页
第2页 / 共20页
无位置传感器的无刷直流电动机调速控制程序.docx_第3页
第3页 / 共20页
无位置传感器的无刷直流电动机调速控制程序.docx_第4页
第4页 / 共20页
无位置传感器的无刷直流电动机调速控制程序.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

无位置传感器的无刷直流电动机调速控制程序.docx

《无位置传感器的无刷直流电动机调速控制程序.docx》由会员分享,可在线阅读,更多相关《无位置传感器的无刷直流电动机调速控制程序.docx(20页珍藏版)》请在冰豆网上搜索。

无位置传感器的无刷直流电动机调速控制程序.docx

无位置传感器的无刷直流电动机调速控制程序

《无位置传感器的无刷直流电动机调速控制程序》

.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;在上下限内

;--------------------------------------换相准备-----------------------------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1