2.4 无刷直流电动机驱动控制程序
//#############################################################################///
//无刷电机控制源程序 //TMS320F2812 //
//#############################################################################
//===================================================================== //头文件调用
//===================================================================== #include \#include \#include \
//===================================================================== //常量附值
//===================================================================== #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 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 spd_ki=0; //转速环I参数
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); interrupt void cap_int(void); void Ad(void);
void speed(void); //计算速度 void Ia_PI(void); //电流环调节Ia void speed_PI(void); //速度环调节 void bldc(void);
void Check_Rxdata(void);
void Sci_Send(signed int sci_delay); char *Fen_Jie(signed int Send_Temp);
unsigned int Sci_Rx_check(unsigned int i_Rx,unsigned int *p_Rx); signed int DIV_CAL(long signed int dividend,signed int divisor);
unsigned int U_DIV_CAL(long unsigned int udividend,unsigned int udivisor);
//===================================================================== //主程序开始
//===================================================================== void main(void) {
//控制寄存器初始设置
InitSysCtrl(); //初始化系统 DINT; //关全局中断 IER = 0x0000; IFR = 0x0000;
InitPieCtrl(); //初始化PIE中断 InitPieVectTable(); //初始化PIE中断矢量表 InitGpio(); //初始化Gpio输入输出口 InitEv(); //初始化Eva的T和T2 InitAdc_Eva(); //初始化AD InitData();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.T1UFINT=&t1uf_int;//T1下溢中断地址 PieVectTable.CAPINT4=&cap_int; PieVectTable.CAPINT5=&cap_int; PieVectTable.CAPINT6=&cap_int;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrl.PIEIER2.bit.INTx6 = 1; //T1下溢中断使能 PieCtrl.PIEIER5.bit.INTx5 = 1; PieCtrl.PIEIER5.bit.INTx6 = 1; PieCtrl.PIEIER5.bit.INTx7 = 1;
IER |= M_INT2; // Enable CPU Interrupt 2 IER |= M_INT4; // Enable CPU Interrupt 4 IER |= M_INT5; // Enable CPU Interrupt 5 EvbRegs.EVBIMRC.bit.CAP4INT=1; EvbRegs.EVBIMRC.bit.CAP5INT=1; EvbRegs.EVBIMRC.bit.CAP6INT=1; EvbRegs.CAPCONB.all=0x36FF; NOP; NOP; NOP; NOP;
EvbRegs.CAPCONB.all=0xB6FF;
EINT; //使能全局中断INTM ERTM;
//等待中断(中断之外的时间内进行LCD的发送和接收)
SCI_CTL(); }
//===================================================================== //串口控制
//===================================================================== //************* //接收数据检测 //************ void Check_Rxdata()
} for(;;) {
// Enable Global realtime interrupt DBG
{
switch(Sci_Rx[0]) {
case 'm': //转速给定和转速在线更新 case 'v': {
FlagRegs.bit.Vflag=1;
if(Sci_Rx[1]=='-') {
FlagRegs.bit.Sign1=0; //转速为负值 spd_given1 = Sci_Rx_check(4,Sci_Rx); } else {
FlagRegs.bit.Sign1=1; //转速为正值 spd_given1 = Sci_Rx_check(3,Sci_Rx); }
if(Sci_Rx[0]=='m') {
FlagRegs.bit.Sign2=FlagRegs.bit.Sign1; FlagRegs.bit.Sign=FlagRegs.bit.Sign1; } break; }
case 's': //启动 {
Sci_Tx[0]='a'; Sci_Tx[1]='+'; Sci_Tx[2]='0'; Sci_Tx[3]='0'; Sci_Tx[4]='0'; Sci_Tx[5]='0'; Sci_Tx[6]='0'; Sci_Tx[7]='z';
spd_given=spd_given1; Protect_Data(); Motor_Start(); FlagRegs.bit.Send=1; T_length=8; T_pointer=0; break; }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库DSP无刷直流电动机驱动控制程序在线全文阅读。
相关推荐: