{
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; // 连续增减计数
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库DSP无刷直流电动机驱动控制程序(4)在线全文阅读。
相关推荐: