DSP无刷直流电动机驱动控制程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.4 无刷直流电动机驱动控制程序
//########################################################################## ###///
//无刷电机控制源程序
//TMS320F2812
//
//########################################################################## ###
//=====================================================================
//头文件调用
//=====================================================================
#include "DSP28_Device.h"
#include "math.h"
#include "float.h"
//=====================================================================
//常量附值
//=====================================================================
#define Idc_max 3000 //电流给定最大值
#define Idc_min 0 //电流给定最小值
//=====================================================================
//标志位
//=====================================================================
char Iab_Data=0;
struct Flag_Bits { // bits description
Uint16 Send:1; // 0 串口发数
Uint16 Test:1; // 1 串口测试
Uint16 Vflag:1; // 2 转速更新
Uint16 SendEnd:1; // 3 串口发送结束
Uint16 Sign1:1; // 4 上一次给定转向标志
Uint16 Sign2:1; // 5 本次给定转向标志
Uint16 Openint:1; // 6 启动标志
Uint16 Adfrist:1; // 7 保留
Uint16 Spdoff:1; // 8 保留
Uint16 Zero:1; // 9 转速过零标志
Uint16 Mode:3; // 10-12 保留
Uint16 Dshow:1; // 13 保留
Uint16 Sign:1; // 14 当前转向标志
};
union Flag_Reg {
Uint16 all;
struct Flag_Bits bit;
}FlagRegs;
//===================================================================== //全局变量
//===================================================================== //串口通信变量
unsigned int Sci_Rx[8]={0,0,0,0,0,0,0,0}; //接收数据数组
unsigned int Sci_Tx[8]={0,0,0,0,0,0,0,0}; //发送数据数组
char T_pointer=0; //发送数据数组指针
char R_pointer=0; //接收数据数组指针
char T_length=1; //发送数据长度
char R_length=0; //接收数据长度
char a2=0;
//控制参数
unsigned int spd_kp=0; //转速环P参数unsigned int spd_ki=0; //转速环I参数unsigned int id_kp=0,id_ki=0; //电流PI参数
signed int spd_given=0; //转速给定
signed int spd_given1=0; //转速给定
signed int spd_given2=0; //转速给定
//控制变量
unsigned int cap1=0; //前次换向标志位unsigned int cap2=0; //本次换向标志位unsigned int intruptcount=0; //定时器1下溢中断次数unsigned int speed_given = 1000; //转速给定
signed int Idc_given2=0; //算得本次电流给定值signed int speed_e1=0; //前次转速误差
signed int speed_e2=0; //本次转速误差
signed int Ia_e1=0; //前次电流误差
signed int Ia_e2=0; //本次电流误差
char t2first=0;
signed int COMP2=0; //装比较寄存器值
//转速反馈
char Spd_Data=0; //滤波计数
int speed_counter=0; //速度环计数器
unsigned int cap_a; //本次捕获单元数据
unsigned int cap_b; //上次捕获单元数据
long cap_c; //捕获单元数据差
signed int BLDC_SPD[10]={0,0,0,0,0,0,0,0,0,0};//转速滤波
signed int spd_fd_q1=0; //转速反馈临时变量
unsigned int spd_fd_q0=0; //转速检测值
char cc=0;
//电流反馈
unsigned int ia[6]={0,0,0,0,0,0}; //A相电流反馈值
unsigned int ib[6]={0,0,0,0,0,0}; //B相电流反馈值
signed int ia_fd=0,ib_fd=0; //电流反馈
signed int Temp_filter=0; //临时变量
unsigned int t1per=0; //周期寄存器数值
//临时变量
signed long long1_tmp=0;
signed long long2_tmp=0;
signed int u16_tmp1=0;
signed int u16_tmp2=0;
//===================================================================== //子程序声明
//===================================================================== interrupt void t1uf_int(void);