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

2019-02-21 00:55

{

cc=0;

spd_fd_q0=(BLDC_SPD[2]+BLDC_SPD[3]+BLDC_SPD[4]+BLDC_SPD[5]+BLDC_SPD[6]+BLDC_SPD[7]+BLDC_SPD[8]+BLDC_SPD[9])>>3; }

cap1=cap2; } else {

spd_fd_q0 = 0; } } else {

if(intruptcount>=1500) {

intruptcount=0; spd_fd_q0=0; } else {

spd_fd_q0=spd_fd_q0; } }

if(t2first==0) t2first=1; }

//******************************** //转速调节器

//******************************** void speed_PI(void) {

unsigned int abs_spd=0; signed int spd_ki_bldc=1; speed_counter++; if(speed_counter>=10) {

speed_counter=0;

if(FlagRegs.bit.Vflag==1) //转速给定更新 {

if(FlagRegs.bit.Sign1!=FlagRegs.bit.Sign2)//新转向和原有转向不同 {

FlagRegs.bit.Zero =1; //换转向标志位置位

spd_given2=spd_given; //缓存目标频率

spd_given=0; //当前目标频率给定0 }

FlagRegs.bit.Vflag =0; //转速给定更新标志位清零 FlagRegs.bit.Sign2=FlagRegs.bit.Sign1; //更新转向标志 }

if((spd_fd_q0==0)&&(FlagRegs.bit.Zero==1)) //当前给定频率,目标频率需要反向(电机需要从正转到反转) {

spd_given=spd_given2; //给定新的目标频率 FlagRegs.bit.Zero=0; //换转向标志位清零 FlagRegs.bit.Sign=FlagRegs.bit.Sign1; //给定新的转向 }

speed_e1 = speed_e2; //将本次误差用作下次使用 speed_e2 = spd_given - abs(spd_fd_q0); abs_spd=abs(spd_given)>>2; if((abs(speed_e2))

spd_ki_bldc=spd_ki; }

else {

if(spd_given<100) spd_ki_bldc=12;//10*8 else if(spd_given<150) spd_ki_bldc=10; else if(spd_given<200) spd_ki_bldc=8; else if(spd_given<250) spd_ki_bldc=6; else if(spd_given<300) spd_ki_bldc=5; else spd_ki_bldc=4; }

long1_tmp= (long)spd_kp * (speed_e2 - speed_e1); long2_tmp= (long)spd_ki_bldc * speed_e2; u16_tmp1=(long1_tmp+long2_tmp)>>10; Idc_given2=Idc_given2+u16_tmp1;

if(Idc_given2 > Idc_max) //限幅 Idc_given2 = Idc_max; else if(Idc_given2 < Idc_min) Idc_given2 = Idc_min; } }

//******************************** //电流调节器

//******************************** void Ia_PI(void)

{

Ia_e1 = Ia_e2; //将本次误差用作下次使用 Ia_e2 = Idc_given2 - ia_fd;

long1_tmp=(long)id_kp * (Ia_e2 - Ia_e1); long2_tmp=(long)id_ki * Ia_e2; u16_tmp1=(long1_tmp+long2_tmp)>>12; COMP2=COMP2+u16_tmp1;

if(COMP2 < 0) COMP2 = 0;

else if(COMP2 > (t1per-200)) COMP2 = (t1per-200); }

//===================================================================== //T1下溢中断子程序

//===================================================================== interrupt void t1uf_int(void) {

IFR=0x0000; //中断标志位清零

PieCtrl.PIEACK.all=0xffff;

if(FlagRegs.bit.Openint==1) //控制程序准备开始运行 {

bldc();

GpioDataRegs.GPACLEAR.bit.GPIOA11=1; Sci_Send(400); }

EvaRegs.EVAIFRA.bit.T1UFINT=1; //T1下溢中断标志位清零 EINT; }

//===================================================================== // CAP4/5/6中断子程序

//===================================================================== interrupt void cap_int(void) {

IFR=0x0000;

PieCtrl.PIEACK.all=0xffff;

GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=0; //将cap456设置为io口 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=0; GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=0;

cap2 = GpioDataRegs.GPBDAT.all & 0x0700; //记录cap4-6初始状态 cap2 = cap2>>8; cap2 = cap2&0x0007;

if(FlagRegs.bit.Sign==1) cap2=7-cap2; else cap2=cap2;

if(EvbRegs.EVBIFRC.bit.CAP4INT==1) {

cap_a=EvbRegs.CAP4FIFO;

EvbRegs.EVBIFRC.bit.CAP4INT=1; }

else if(EvbRegs.EVBIFRC.bit.CAP5INT==1) {

cap_a=EvbRegs.CAP5FIFO; EvbRegs.EVBIFRC.bit.CAP5INT=1; }

else if(EvbRegs.EVBIFRC.bit.CAP6INT==1) {

cap_a=EvbRegs.CAP6FIFO;

EvbRegs.EVBIFRC.bit.CAP6INT=1; }

cap_c=cap_a-cap_b;

if(cap_c<0) cap_c=cap_c+0xffff; cap_b=cap_a;

GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=1; //将cap456设置为CAP口 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=1; GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=1; EINT; }

InitData() { char i;

T_pointer=0; //发送数据数组指针 R_pointer=0; //接收数据数组指针 a2=0;

for(i=0;i<8;i++) {

Sci_Rx[i]=0; Sci_Tx[i]=0; }

cap1=0; //前次换向标志位 cap2=0; //本次换向标志位 intruptcount=0; //定时器1下溢中断次数 Idc_given2=0; //算得本次电流给定值 speed_e1=0; //前次转速误差

speed_e2=0; //本次转速误差

Ia_e1=0; //前次电流误差 Ia_e2=0; //本次电流误差 t2over=0; t2first=0;

COMP2=0; //装比较寄存器值 speed_counter=0; //速度环计数器 cap_a=0; cap_b=0; cap_c=0;

for(i=0;i<10;i++) {

BLDC_SPD[i]=0; } }

/////////////////////////////////////////////////////////////////////// // BLDC.c 程序结束

///////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////// // 文件名:

DSP28_Ev.c

// 意义: DSP28 EV初始化

/////////////////////////////////////////////////////////////////////// #include \void InitEv(void) {

//定时器T1初始化

EvaRegs.T1PR =7500; //周期寄存器 5khz EvaRegs.T1CON.all = 0X080C; //连续增减计数 EvaRegs.CMPR1=0; //比较寄存器初始化 EvaRegs.CMPR2=0; EvaRegs.CMPR3=0;

EvaRegs.ACTR.all=0X0FFF; //6PWM强制高

EvaRegs.COMCONA.all=0X8A00; //比较寄存器T1下溢重载 EvaRegs.COMCONA.bit.ACTRLD=2; //方式控制寄存器立即重载 EvaRegs.DBTCONA.all=0X0FF4; //死区3.2us EvaRegs.T1CNT=0;

EvaRegs.EVAIMRA.all=0X0200; //T1下溢使能 EvaRegs.EVAIFRA.all=0X0FFFF; //清中断标志位

//定时器T4初始化

EvbRegs.T4PR = 60000; // 周期寄存器 EvbRegs.T4CON.all = 0X0F0C; // 连续增减计数


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

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

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

马上注册会员

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