DSP电机控制PMSM.docx_第1页
DSP电机控制PMSM.docx_第2页
DSP电机控制PMSM.docx_第3页
DSP电机控制PMSM.docx_第4页
DSP电机控制PMSM.docx_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include DSP28_Device.hEVA eva = EVA_DEFAULTS;EVB evb = EVB_DEFAULTS;RAMPGEN rampgen = RAMPGEN_DEFAULTS;VHZPROF vhzprof = VHZPROF_DEFAULTS;SVGENDQ svgendq = SVGENDQ_DEFAULTS;ROTATEVECTOR rotatevector = ROTATEVECTOR_DEFAULTS;static unsigned int RBBuf;static unsigned int RABuf;interrupt void ISRTimer1(void);interrupt void ISRTimer2(void);interrupt void T1UFINT_ISR(void);long f_given=0;long f_now=0;float happy=0;/显示相关unsigned int f_given_disp=0; /接到的的值unsigned int ku=10; /输入电压与电机额定电压的比unsigned int DispBuf2;/显示缓存,存在EEPROM,(ku,f_given)unsigned int RunFlag=0; /运行标志unsigned int TurnFlag=0; /正反转/_iq ha = 65545;/_iq hb = 65521;/_iq hc ;void ShowDisp(void); /显示函数,用于将数据显示到显示板_iq test120;_iq test220;void main(void)/*初始化系统*/InitSysCtrl();/*关中断*/DINT;IER = 0x0000;IFR = 0x0000;/*初始化PIE控制寄存器*/InitPieCtrl();/*初始化PIE矢量表*/InitPieVectTable();/*初始化SCIb寄存器*/ InitSci();/初始化24Vxx/Init24Cxx();/*设置CPU定时器*/InitCpuTimers();ConfigCpuTimer(&CpuTimer2, 150, 20000);ConfigCpuTimer(&CpuTimer1, 150, 100000);/每0.1秒加1Hz,每秒加Y*1000000赫兹 StartCpuTimer1(); StartCpuTimer2();/*初始化IO口*/ InitGpio(); /*初始化EV*/eva.Init(&eva);evb.Init(&evb);/*设置中断服务程序入口地址*/EALLOW;/ This is needed to write to EALLOW protected registersPieVectTable.T1UFINT = &T1UFINT_ISR;PieVectTable.TXBINT = &SCITXINTB_ISR; /设置串口B发送中断的中断向量PieVectTable.RXBINT = &SCIRXINTB_ISR; /设置串口B接受中断的中断向量 PieVectTable.TXAINT = &SCITXINTA_ISR; /设置串口A发送中断的中断向量PieVectTable.RXAINT = &SCIRXINTA_ISR; /设置串口A接受中断的中断向量PieVectTable.TINT2 = &ISRTimer2; PieVectTable.XINT13= &ISRTimer1;/定时器1和外部中断合用一个中断标志位 /此处为XINT13并不是TINT1EDIS; / This is needed to disable write to EALLOW protected registers/*使能位于PIE中组2的第6个中断 定时器1下溢中断*/PieCtrl.PIEIER2.bit.INTx6=1;/*开中断*/IER |= M_INT2; /EVAIER |= M_INT9; /SCI /允许串口中断IER |= M_INT14; /cputimer2 IER |= M_INT13; /cputimer1 EINT; / Enable Global interrupt INTMERTM;/ Enable Global realtime interrupt DBGMeva.Close(&eva);evb.Open(&evb);rampgen.StepAngleMax = _IQ(0.0128); /最大频率128hz 中断频率10k while(1)/hc= _IQmpy(ha,hb);只进行保留整数位,对于小数位不进行四舍五入。hc=(ha*hb)/65536 /=/ 定时器1下溢中断服务程序./=interrupt void T1UFINT_ISR(void) / EV-A/ asm ( ESTOP0); / PieCtrl.PIEACK.bit.ACK2=1; / EvaRegs.EVAIFRA.bit.T1UFINT=1; /清中断标志位 /rampgen模块 产生矢量旋转的角度 需要设置StepAngleMax这里是控制转速的。/ rampgen.Freq = _IQ(50)7;rampgen.Freq = _IQ(float)f_now)7;/ 因为最大频率128Hz,是2的7次方,那么除以128就是以最大频率来看的标幺值rampgen.calc(&rampgen);/vhzprof模块 vvvf控制,根据频率比例控制输出电压的量/vhzprof.Freq = _IQ(50);vhzprof.Freq = _IQ(float)f_now)+_IQ(0.11);vhzprof.calc(&vhzprof); /RotateVector模块 产生旋转矢量对应的Ualpha Ubeta if(TurnFlag=0) rotatevector.Angle = rampgen.Angle; /停止标志elserotatevector.Angle = -rampgen.Angle;rotatevector.k = vhzprof.VoltOut;rotatevector.calc(&rotatevector) ; /svgendq模块 根据Ualpha Ubeta 产生比较器需要的TA TB TC svgendq.Ualpha = rotatevector.Ualpha; svgendq.Ubeta = rotatevector.Ubeta ; svgendq.calc(&svgendq) ; happy=rotatevector.Angle ; /ev模块eva.Ta = svgendq.Ta;eva.Tb = svgendq.Tb;eva.Tc = svgendq.Tc;eva.SetPwm(&eva);evb.Ta = svgendq.Ta;evb.Tb = svgendq.Tb;evb.Tc = svgendq.Tc;evb.SetPwm(&evb); PieCtrl.PIEACK.bit.ACK2=1; EvaRegs.EVAIFRA.bit.T1UFINT=1; /清中断标志位interrupt void SCIRXINTA_ISR(void) PieCtrl.PIEACK.bit.ACK9 = 1;RABuf=SciaRegs.SCIRXBUF.all;switch(RABuf) EINT; interrupt void SCIRXINTB_ISR(void) / SCI-B PieCtrl.PIEACK.bit.ACK9 = 1;/相应PIE组9的其他中断RBBuf=ScibRegs.SCIRXBUF.all;switch(RBBuf)case 0: /增加输入电压百分比break;case 1:/运行 break;case 2: /增加频率 break;case 3:/增加频率 break;case 4:/减少输入电压百分比break;case 5:/停止f_given = 0;break;case 6: /减小频率break;case 7:/减小频率break;EINT;interrupt void ISRTimer1(void) /内部定义的计数变量 if(RABuf =0) CpuTimer1.InterruptCount=0; f_given=0;SciaRegs.SCITXBUF = (unsigned int)f_now; f_given_disp= f_now; if(RABuf =1)/FWD Auto /unsigned int a; RunFlag = 1; eva.Open(&eva); f_given_disp= f_now; TurnFlag=0; CpuTimer1.InterruptCount+; if(CpuTimer1.InterruptCount0) f_given+; f_now = f_given; /f_given = f_now ; SciaRegs.SCITXBUF = (unsigned int)f_now; if(CpuTimer1.InterruptCount=20)&(CpuTimer1.InterruptCount=30)&(CpuTimer1.InterruptCount=50) f_given=0; f_now=0; SciaRegs.SCITXBUF = (unsigned int)f_now; eva.Close(&eva); / RABuf =0 ; if(RABuf =2)/REV Auto RunFlag = 1; eva.Open(&eva); f_given_disp= f_now; TurnFlag=1; CpuTimer1.InterruptCount+; if(CpuTimer1.InterruptCount0) f_given+; f_now=f_given; SciaRegs.SCITXBUF = (unsigned int)f_now; if(CpuTimer1.InterruptCount=20)&(CpuTimer1.InterruptCount=40) f_given = 0 ; f_now=0; SciaRegs.SCITXBUF = (unsigned int)f_now; eva.Close(&eva); / RABuf =0 ; if(RABuf =3)/FWD High CpuTimer1.InterruptCount=0; TurnFlag=0; RunFlag = 1; eva.Open(&eva); f_now=10; f_given=10; f_given_disp= f_now; / CpuTimer1.InterruptCount+; / if (CpuTimer1.InterruptCount=10 ) / / RABuf =0; / CpuTimer1.InterruptCount=0; / SciaRegs.SCITXBUF = (unsigned int)f_now; if(RABuf =4)/REV High CpuTimer1.InterruptCount=0; TurnFlag=1; RunFlag = 1; eva.Open(&eva); f_now=10; f_given=10; f_given_disp= f_now; /if (CpuTimer1.InterruptCount=10 ) / / RABuf =0; / CpuTimer1.InterruptCount=0; / SciaRegs.SCITXBUF = (unsigned int)f_now; if(RABuf =5)/FWD Low CpuTimer1.InterruptCount=0; TurnFlag=0; RunFlag = 1; eva.Open(&eva); f_now=5; f_given=5; f_given_disp= f_now; SciaRegs.SCITXBUF = (unsigned int)f_now; if(RABuf =6)/REV Low CpuTimer1.InterruptCount=0; TurnFlag=1; RunFlag = 1; eva.Open(&eva); f_now=5; f_given=5; f_given_disp= f_now; SciaRegs.SCITXBUF = (unsigned int)f_now; if(RABuf =7)/All Pause /CpuTimer1Regs.TCR.bit.TRB=1;/*暂停*/ /f_now=50; eva.Close(&eva); SciaRegs.SCITXBUF = (unsigned int)f_now; CpuTimer1Regs.TCR.bit.TIF=1; ShowDisp(); PieCtrl.PIEACK.all=PIEACK_GROUP1;/SciaRegs.SCITXBUF = (unsigned int)f_now;EINT; interrupt void ISRTimer2(void)CpuTimer2.InterruptCount+;if(CpuTimer2.InterruptCount1) /20msif(f_givenf_now)if(f_now1)f_now=1;elsef_now+;else if(f_givenf_now)if(f_now1)eva.Close(&eva);f_now=0;f_given=0;RunFlag = 0; /停止标志elsef_now-;SciaRegs.SCITXBUF = (unsigned int)f_now;CpuTimer2.InterruptCount=0;ShowDisp();EINT;void ShowDisp(void) /更新显示static unsigned int i=0;switch(i)case 0:i+;ScibRegs.SCITXBUF =(ku&0xf)+(35); break;case 1:if(RunFlag)ScibRegs.SCITXBUF =23+(25);else ScibRegs.SCITXBUF =24+(25);i+;break;case 2:if(RunFlag)ScibRegs.SCITXBUF =f_now/10+(15);elseScibRegs.SCITXBUF =f_given_disp/10+(15);i+;break;case 3:if(RunFlag)ScibRegs.SCITXBUF =f_now%10;elseScibRegs.SCITXBUF =f_given_disp%10;i=0;break;default:i=0;break;/=/ No more./=/ Dont forget to set a proper GLOBAL_Q in IQmathLib.h file #include vhzprof.h#include void vhz_prof_calc(VHZPROF *v)_iq VfSlope, AbsFreq;/ Take absolute frequency to allow the operation of both rotational directions AbsFreq = labs(v-Freq);if (AbsFreq LowFreq) / Compute output voltage in profile #1 v-VoltOut = v-VoltMin; else if (AbsFreq v-LowFreq)&(AbsFreq HighFreq) / Compute slope of V/f profile VfSlope = _IQdiv(v-VoltMax - v-VoltMin),(v-HighFreq - v-LowFreq);/就是压频比的斜率 / Compute output voltage in profile #2 v-VoltOut =v-VoltMin + _IQmpy(VfSlope,(AbsFreq-v-LowFreq); else if (AbsFreq v-HighFreq)&(AbsFreq FreqMax) / Compute output voltage in profile #3 v-VoltOut = v-VoltMax; /最大的VoltMax线电压就是直流侧的电压DC直流,可以看思路图,任意时刻是上下桥臂导通。#include RotateVector.h#include iqmathlib.hvoid RotateVecotr_calc(RotateVecotr_Handle v) _iq Ua,Ub; / Using look-up IQ sine table Ub = _IQsinPU(v-Angle);/正弦函数标幺值,你站着个圆周的几分之几 Ua = _IQcosPU(v-Angle); v-Ualpha = _IQmpy(v-k,Ua); v-Ubeta = _IQmpy(v-k,Ub); #include IQmathLib.h / Include header for IQmath library/ Dont forget to set a proper GLOBAL_Q in IQmathLib.h file#include rampgen.hvoid rampgen_calc(RAMPGEN *v)/ Compute the angle rate v-Angle += _IQmpy(v-StepAngleMax,v-Freq); /这里“v-Freq”是以最大频率(128Hz)来看的给定频率标幺值,乘最大频率再乘中 /断周期就是每一个中短周期增加给定频率那么多的角度(只是线性对应关系,给定越 /大增加越快,给定越小增加就小) / Saturate the angle rate within (-1,1) if (v-Angle_IQ(1.0) v-Angle -= _IQ(1.0); else if (v-AngleAngle += _IQ(1.0);/ Compute the ramp output v-Out = _IQmpy(v-Angle,v-Gain) + v-Offset;/ Saturate the ramp output within (-1,1) if (v-Out_IQ(1.0) v-Out -= _IQ(1.0); else if (v-OutOut += _IQ(1.0);#include IQmathLib.h / Include header for IQmath library/ Dont forget to set a proper GLOBAL_Q in IQmathLib.h file#include rampgen.hvoid rampgen_calc(RAMPGEN *v)/ Compute the angle rate v-Angle += _IQmpy(v-StepAngleMax,v-Freq); /这里“v-Freq”是以最大频率(128Hz)来看的给定频率标幺值,乘最大频率再乘中 /断周期就是每一个中短周期增加给定频率那么多的角度(只是线性对应关系,给定越 /大增加越快,给定越小增加就小) / Saturate the angle rate within (-1,1) if (v-Angle_IQ(1.0) v-Angle -= _IQ(1.0); else if (v-AngleAngle += _IQ(1.0);/ Compute the ramp output v-Out = _IQmpy(v-Angle,v-Gain) + v-Offset;/ Saturate the ramp output within (-1,1) if (v-Out_IQ(1.0) v-Out -= _IQ(1.0); else if (v-OutOut += _IQ(1.0);#include DSP28_Device.hunsigned int * UART_MODE = (unsigned int *) 0x4010;/-/ InitSCI: /-/ This function initializes the SCI(s) to a known state./void InitSci(void)/ Initialize SCI-B:*UART_MODE = 0x44;EALLOW;GpioMuxRegs.GPGMUX.all = 0x0030;/使能串行接口SCIB,SCITXDB,SCIRXDB:EDIS;/* loopback 8 bit data */ScibRegs.SCICCR.all = 0x07;/SCI通信控制寄存器,奇偶校验禁止,送回模式禁止,与RS232通信兼容,8位字符的SCI字符:ScibRegs.SCICTL1.all = 0x03;/发送器使能,通过SCITXD发送数据,接收数据发送到SCIRXEMU和SCIRXBUF;ScibRegs.SCICTL2.all = 0x03;/接收中断使能,禁止TXRDY中断;/Baud = LSPCLK/(BBR+1)*8)/(6000000/(9600*8)-1=77.125/389.625 -0x0185波特率选择寄存器;ScibRegs.SCIHBAUD = 0x01;ScibRegs.SCILBAUD = 0xE7;ScibRegs.SCICTL1.all = 0x23;/重启SCI;PieCtrl.PIEIER9.bit.INTx3 = 1;/使能SCIRXINT;PieCtrl.PIEIER9.bit.INTx4 = 0;/禁止SCITXINT;/tbd. EALLOW;GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1; /对于GPIOF口进行选择使能SCIAEDIS;/* loopback 8 bit data */SciaRegs.SCICCR.all = 0x07; / 0x07选择地址位。0x00是空闲模式SciaRegs.SCICTL1.all = 0x03;SciaRegs.SCICTL2.all = 0x03;/Baud = LSPCLK/(BBR+1)*8)/(6000000/(9600*8)-1=77.125/389.625 -0x0185SciaRegs.SCIHBAUD = 0x01;SciaRegs.SCILBAUD = 0xE7;SciaRegs.SCICTL1.all = 0x23;PieCtrl.PIEIER9.bit.INTx1 = 1;PieCtrl.PIEIER9.bit.INTx2 = 0;/ Initialize SCI-B:/tbd./*name:int SciaTx_Ready(void)input:noneoutput:i1:ready0:busy*/int SciaTx_Ready(void)unsigned int i;if(SciaRegs.SCICTL2.bit.TXRDY = 1)i = 1;elsei = 0;return(i);/*name:int SciaRx_Ready(void)input:noneoutput:i1:new data0:none*/int SciaRx_Ready(void)unsigned int i;if(SciaRegs.SCIRXST.bit.RXRDY = 1)i = 1;elsei = 0;return(i);#include DSP28_Device.h/ InitEv: / This function initializes to a known state.void EvaInit(EvaHandle p)EALLOW;GpioMuxRegs.GPAMUX.all=0x00ff;EDIS;EvaRegs.GPTCONA.all = 0x0; /* gp timer control register */定时器EvaRegs.T1CNT = 0; /* timer1 count is zero */EvaRegs.T1CON.all = 0x0840; /* 启动定时器 连续增减模式 下溢时重装载 sysclk/1 */EvaRegs.T1PR = T1_PERIODS;/比较寄存器EvaRegs.ACTR.all = 0x0999; /* 反向旋转 1.3.5低有效,2.4.6高有效 */死区控制EvaRegs.DBTCONA.all = 0x0ff4; /* 死区时间8us */中断控制EvaRegs.EVAIMRA.all = 0x0200; /* 开定时器下溢中断 */void EvaSetPwm(EvaHandle p) E

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论