DSP无刷直流电动机驱动控制程序

2019-02-21 00:55

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; }


DSP无刷直流电动机驱动控制程序.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:浅析需量计费与容量计费对企业电费的影响

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: