头文件
UserParms.h
C文件
ACIM.c Encoder.c InitCurModel.c
UserParms.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
#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 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
#define 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 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 *
* 文件版本 : 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 变量以安排显示和按钮子程序的执行时间 * -trig.s文件改为使用程序空间来存储正弦数据。
*-增加了 DiagnosticsOutput()函数,该函数使用输出比较通道来输出控 * 制变量信息。
*-增加了 TORQUE_MODE 定义以忽略转速控制环。
*-关闭 curmodel.s文件中的 SATDW位。自动饱和功能阻止转差角计算正确 * 翻转返回。
************************************************************************ *代码说明 *
*该文件给出了使用 dsPIC30F实现的三相交流感应电机矢量控制实例。 *采用空间矢量调制作为控制策略。
***********************************************************************/ /*************************** 全局定义 ***********************/
#define INITIALIZE #include \ #include \ #include \ #include \ #include \ #include \ #include \ #include \ #include \ #include \ #include \
#include \ #include \ #include \ #include \
/*********************** 全局定义结束 ********************/
unsigned short uWork; short iCntsPerRev; 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; tPIParm PIParmQref; tPIParm PIParmD;
tReadADCParm ReadADCParm;