⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 srm.c

📁 一个基于DSP 2812的开关磁阻电机的控制程序的例子。用霍尔传感器测相位
💻 C
字号:
#include "IQmathLib.h"
#include "DSP28_Device.h"
#include "pmsm3_1.h"
#include "parameter.h"
#include "build.h"

//   函数声明
interrupt void EvaTimer1(void);
interrupt void EvaTimer2(void);

//全局变量定义
float Vd_testing=0;
float Vq_testing=0.25;
float Id_ref=0;
float Iq_ref=0.4;
float speed_ref=0.2;
float T=0.001/ISR_FREQUENCY;
int isr_ticker=0;

int pwmdac_ch1=0;
int pwmdac_ch2=0;
int pwmdac_ch3=0;

volatile int enable_flg=0;
int lockrtr_flg=1;

int speed_loop_ps=10;  //速度环定标器
int speed_loop_count=1;  //速度环计数器

CLARKE clarke1=CLARKE_DEFAULTS;
PARK park1=PARK_DEFSULTS;
IPARK ipark1=IPARK_DEFAULTS;

PIDREG3 pid1_id=PIDREG3_DEFAULTS;
PIDREG3 pid1_iq=PIDREG3_DEFAULTS;
PIDREG3 pid1_spd=PIDREG3_DEFAULTS;

PWMGEN pwm1=PWMGEN_DEFAULTS;
PWMDAC pwmdac1=PWMDAC_DEFAULTS;

SVGENDQ svgen_dq1=SVGENDQ_DEFAULTS;
QEP qep1=QEP_DEFAULTS;
SPEED_MEAS_QEP speed1=SPEED_MEAS_QEP_DEFAULTS;
DRIVE drv1=DRIVE_DEFAULTS;

RMPCNTL rc1=RMPXNTL_DEFAULTS;
RAMPGEN rg1=RAMPGEN_DEFAULTS;

ILEG2DCBUSMEAS ilg2_vdc1=ILEG2DCBUSMEAS_DEFAULTS;

// 主函数
void main(void)
{
InitSysCtrl();
EALLOW;
SysCtrlRegs.HISPCP.all=ox0000;
EDIS;

DINT;
IER=ox0000;
IFR=ox0000;

InitPieCtrl();

InitPieVectTable();
 
EvaRegs.CPTCONA.all=0;

while (enable_flg==0)
  {
  EvaRegs.EVAIMRA.bit.T1UFINT=1;
  EvaRegs.EVAIFRA.bit.T1UFINT=1;
  
  EvaRegs.EVAIMRA.bit.CAP3INT=1;
  EvaRegs.EVAIFRA.bit.CAP3INT=1;
  
  }
//  重新分配中断向量
EALLOW;
PieVectTable.T1UFINT=&EvaTimer1;
PieVectTable.CAPINT3=&EvaTimer2;
EDIS;
//使能PIE组2的中断6
PieCtrlRegs.PIEIER2.all=M_INT6;
//使能PIE组3的中断7
PieCtrlTegs.PIEIER3.all=M_INT7;

IER |= (M_INT2|M_INT3)

EINT; //使能全局中断INTM
ERTM; //使能适时调试中断DBGM
//  模块初始化
/*           */
//循环等待
for (;;);

}
interrupt void EvaTimer1(void)
{
  isr_ticker++;
  if (speed_loop_count=speed_loop_ps)
  {
  pid1_spd.pid_ref_reg3=_IQ(speed_ref);
  pid1_spd.pid_fdb_reg3=speed1.speed.frq;
  pid1_spd.calc(&pid1_spd);
  speed_loop_count=1;
  
  
  }
 else speed_loop_count++;
 
 
 
//使能定时器中断
  EvaRegs.EVAIMRA.bit.T1UFINT=1;
  EvaRegs.EVAIFRA.all=BIT9;
  PieCtrlRegs.PIEACK.all |=PIEACK_GROUP2;

}
interrupt void EvaTimer2(void)
{
  qep1.isr=(&qep1);
  EvaRegs.EVAIMRC.bit.CAP3INT=1;
  EvaRegs.EVAIFRC.all=BIT2;
  PieCtrlRegs.PIEACK.all |=PIEACK_GROUP3;


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -