ImageVerifierCode 换一换
格式:DOCX , 页数:90 ,大小:45.49KB ,
资源ID:3681256      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3681256.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(svpwm完整程序.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

svpwm完整程序.docx

1、svpwm完整程序头文件 UserParms.h C文件 ACIM.c Encoder.c InitCurModel.cUserParms.h /#define TORQUE_MODE #define DIAGNOSTICS /* 振荡器 * #define dFoscExt 7372800 / 外部晶振或时钟频率 (Hz) #define dPLL 8 / PLL比率 #define dLoopTimeInSec 0.00005 / PWM周期 - 100 uS, 10Khz PWM #define dDeadTimeSec 0.000002 / 以秒为单位的死区时间 / Derived #

2、define dFosc (dFoscExt*dPLL) / 时钟频率 ( Hz) #define dFcy (dFosc/4) / 指令频率 ( Hz) #define dTcy (1.0/dFcy) / 指令周期 (s) #define dDeadTime (int)(dDeadTimeSec*dFcy) / 以 dTcys为单位的死区时间 #define dLoopInTcy (dLoopTimeInSec/dTcy) / 以 Tcy为单位的基本循环周期 #define dDispLoopTime 0.100 / 显示和按钮状态查询循环 /* 电机参数 * #define diPoles

3、 1 / 极对数 #define diCntsPerRev 2000 / 每转的编码器线数 #define diNomRPM 3600 / 电机铭牌上的转速( RPM) #define dfRotorTmConst 0.078 / 以秒为单位的转子时间常数,来自电机制造商 /* 测量 * #define diIrpPerCalc 30 / 每次速度计算的 PWM循环次数 /* PI 系数 * #define dDqKp 0x2000 / 4.0 (NKo = 4) #define dDqKi 0x0100; / 0.125 #define dDqKc 0x0100; / 0.125 #defi

4、ne dDqOutMax 0x5A82; / 0.707设定该值以避免饱和 #define dQqKp 0x2000; / 4.0 (NKo = 4) #define dQqKi 0x0100; / 0.125 #define dQqKc 0x0100; / 0.125 #define dQqOutMax 0x5A82; / 0.707设定该值以避免饱和 #define dQrefqKp 0x4000 / 8.0 (NKo = 4) #define dQrefqKi 0x0800 / 1.0 #define dQrefqKc 0x0800 / 1.0 #define dQrefqOutMax

5、0x3FFF / 0.4999设定该值以避免饱和 /* ADC换算 * / 标定常数 :由校准或硬件设计确定。 #define dqK 0x3FFF; / 等于 0.4999 #define dqKa 0x3FFF; / 等于 0.4999 #define dqKb 0x3FFF; / 等于 0.4999 /* 弱磁 * / 在恒转矩范围内的磁通给定值。 / 根据经验确定、给出额定压 /频比 #define dqK1 3750; / ACIM.c /* * * 作者 : John Theys/Dave Ross * * * 文件名 : ACIM.c * * 日期 : 10/31/03 * *

6、文件版本 : 3.00 * * * 使用工具 : MPLAB - 6.43 * * 编译器 - 1.20.00 * * * 链接文件 : p30f6010.gld * * * * *10/31/03 2.00 发布电机运行正常,但仍有些遗留的小问题 * *12/19/03 2.01 完成结构,为所有用户定义变量创建 UserParms.h。 * *02/12/043.00-从项目中去除了不需要的文件。 * -将 iRPM 改为 int以纠正浮点计算问题。 * -CalcVel() 和转速控制环仅在 iIrpPerCalc指定的数个循环周期后执行 * *-增加了 iDispLoopCount 变

7、量以安排显示和按钮子程序的执行时间 * -trig.s文件改为使用程序空间来存储正弦数据。 *-增加了 DiagnosticsOutput()函数,该函数使用输出比较通道来输出控 * 制变量信息。 *-增加了 TORQUE_MODE 定义以忽略转速控制环。 *-关闭 curmodel.s文件中的 SATDW位。自动饱和功能阻止转差角计算正确 * 翻转返回。 * *代码说明 * *该文件给出了使用 dsPIC30F实现的三相交流感应电机矢量控制实例。 *采用空间矢量调制作为控制策略。 */ /* 全局定义 */ #define INITIALIZE #include Motor.h #inclu

8、de Parms.h #include Encoder.h #include SVGen.h #include ReadADC.h #include MeasCurr.h #include CurModel.h #include FdWeak.h #include Control.h #include PI.h #include Park.h #include OpenLoop.h #include LCD.h #include bin2dec.h #include UserParms.h /* 全局定义结束 */ unsigned short uWork; short iCntsPerRev

9、; short iDeltaPos; union struct unsigned DoLoop:1; unsigned OpenLoop:1; unsigned RunMotor:1; unsigned Btn1Pressed:1; unsigned Btn2Pressed:1; unsigned Btn3Pressed:1; unsigned Btn4Pressed:1; unsigned ChangeMode:1; unsigned ChangeSpeed:1; unsigned :7; bit; WORD Word; uGF; / 通用标志 tPIParm PIParmQ; tPIPar

10、m PIParmQref; tPIParm PIParmD; tReadADCParm ReadADCParm; int iRPM; WORD iMaxLoopCnt; WORD iLoopCnt; WORD iDispLoopCnt; /*/ void _attribute_(_interrupt_) _ADCInterrupt(void); void SetupBoard( void ); bool SetupParm(void); void DoControl( void ); void Dis_RPM( BYTE bChrPosC, BYTE bChrPosR ); void Diag

11、nosticsOutput(void); /* 主函数开头 */ int main ( void ) SetupPorts(); InitLCD(); while(1) uGF.Word = 0; / 清除标志 / 初始化模式 uGF.bit.OpenLoop = 1; / 以开环模式起动 / 初始化 LED pinLED1 = 0; pinLED2 = !uGF.bit.OpenLoop; pinLED3 = 0; pinLED4 = 0; / 初始化控制板 SetupBoard(); / 对用户指定参数进行初始化并在出错时停止 if( SetupParm() ) /错误 uGF.bit.R

12、unMotor=0; return; / 清零 i和 PIParmD.qdSum = 0; PIParmQ.qdSum = 0; PIParmQref.qdSum = 0; iMaxLoopCnt = 0; Wrt_S_LCD(Vector Control , 0 , 0); Wrt_S_LCD(S4-Run/Stop , 0, 1); / 使能 ADC中断并开始主循环定时 IFS0bits.ADIF = 0; IEC0bits.ADIE = 1; if(!uGF.bit.RunMotor) / 初始化电流偏移量补偿 while(!pinButton1) /在此处等待直至按钮 1按下 ClrW

13、dt(); / 开始偏移量累加 /并在等待时对电流偏移量进行累加 MeasCompCurr(); while(pinButton1); /当按钮 1释放时 uGF.bit.RunMotor = 1; /随后起动电机 /电机运行 uGF.bit.ChangeMode = 1; / 使能电机控制 PCB上的驱动器 IC pinPWMOutputEnable_ = 0; Wrt_S_LCD(RPM= , 0, 0); Wrt_S_LCD(S5-Cls. Lp S6-2x, 0, 1); /电机运行循环 while(1) ClrWdt(); / 如果使用 OC7和 OC8显示矢量控制变量, / 调用更

14、新代码。 #ifdefDIAGNOSTICS DiagnosticsOutput(); #endif / 每隔 50毫秒执行更新 LCD显示和查询按钮状态的代码。 / if(iDispLoopCnt = dDispLoopCnt) /Display RPM Dis_RPM(5,0); / 按钮 1控制电机的起停 if(pinButton1) if( !uGF.bit.Btn1Pressed ) uGF.bit.Btn1Pressed = 1; else if( uGF.bit.Btn1Pressed ) / 按钮刚被释放 uGF.bit.Btn1Pressed = 0; / 开始停止过程 uG

15、F.bit.RunMotor = 0; pinPWMOutputEnable_ = 1; break; / 在运行时按钮 2将控制开 /闭环模式之间的切换 if(pinButton2) if( !uGF.bit.Btn2Pressed ) uGF.bit.Btn2Pressed = 1; else if( uGF.bit.Btn2Pressed ) / 按钮刚释放 uGF.bit.Btn2Pressed = 0; uGF.bit.ChangeMode = 1; uGF.bit.OpenLoop = ! uGF.bit.OpenLoop; pinLED2 = !uGF.bit.OpenLoop;

16、 /在运行时按钮 3将加倍 /减半速度或转矩给定 if(pinButton3) if( !uGF.bit.Btn3Pressed ) uGF.bit.Btn3Pressed = 1; LATGbits.LATG0 = 0; else if( uGF.bit.Btn3Pressed ) / 按钮刚释放 uGF.bit.Btn3Pressed = 0; uGF.bit.ChangeSpeed = !uGF.bit.ChangeSpeed; pinLED3 = uGF.bit.ChangeSpeed; LATGbits.LATG0 = 1; / 按钮 4不具备任何功能 if(pinButton4)

17、if( !uGF.bit.Btn4Pressed ) uGF.bit.Btn4Pressed = 1; else if( uGF.bit.Btn4Pressed ) / 按钮刚被释放 uGF.bit.Btn4Pressed = 0; /* 此处加入按钮 4功能的代码 / 显示和按钮查询代码结束 / 电机运行循环结束 /主循环结束 / 不应执行到此处 while(1) /-/ 对 Id控制环、 Iq控制环和速度控制环中的每个控制环执行一次 PI迭代 void DoControl( void ) short i; / 假定 ADC通道 0具有来自速度电位器( AN7)的有符号小数格式原始 A/D值

18、 ReadSignedADC0( &ReadADCParm ); / 设定给定速度 if(uGF.bit.ChangeSpeed) CtrlParm.qVelRef = ReadADCParm.qADValue/8; else CtrlParm.qVelRef = ReadADCParm.qADValue/16; if( uGF.bit.OpenLoop ) / 开环:强制旋转角、 Vd和 Vq if( uGF.bit.ChangeMode ) / 改变为开环模式 uGF.bit.ChangeMode = 0; / 同步角度 OpenLoopParm.qAngFlux = CurModelPa

19、rm.qAngFlux; / 未使用 VqRef和 VdRef CtrlParm.qVqRef = 0; CtrlParm.qVdRef = 0; OpenLoopParm.qVelMech = CtrlParm.qVelRef; / 为 CorrectPhase所需的给定值和符号 / 计算 1.15格式的转子磁通旋转角。 CurModelParm.qVelMech = EncoderParm.qVelMech; CurModel(); ParkParm.qVq = 0; if( OpenLoopParm.qVelMech = 0 ) i = OpenLoopParm.qVelMech; else i = -OpenLoopParm.qVelMech; uWork = i 0x5a82 ) uWork = 0x5a82; if( uWork iMaxLoopCnt ) iMaxLoopCnt = iLoopCnt; / 清零用于诊断的 LED1 pinLED1 = 0; /-/ SetupBoard / / 初始化控制板 /-void SetupBoard( void ) BYTE b; /禁止 ADC中断 IEC0bits.ADIE = 0; / 复位电机控制功率模块上的所有故障。 p

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

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