首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
基于TMS320F2812的永磁同步电动机控制
万国机械
收藏本文     查看收藏

第7章  基于TMS320F2812的永磁同步电动机控制

例1、空间矢量算法实现

 

SVGEN_DQ对象结构体定义

typedef struct {

_iq Ualpha;      // 输入: 轴参考电压

_iq Ubeta;        // 输入: 轴参考电压

_iq Ta;             // 输出:参考相位a开关函数

_iq Tb;             // 输出:参考相位b开关函数

_iq Tc;             // 输出:参考相位c开关函数

void (*calc)(); //        函数指针

} SVGENDQ;

typedef SVGENDQ *SVGENDQ_handle;

SVGEN_DQ模块调用方法:

main()

{

}

void interrupt periodic_interrupt_isr()

{

svgen_dq1.Ualpha = Ualpha1;          // 提供输入参数:svgen_dq1

svgen_dq1.Ubeta = Ubeta1;              // 提供输入参数:svgen_dq1

svgen_dq2.Ualpha = Ualpha2;          // 提供输入参数:vgen_dq2

svgen_dq2.Ubeta = Ubeta2;              // 提供输入参数:svgen_dq2

svgen_dq1.calc(&svgen_dq1);          // 调用函数模块svgen_dq1

svgen_dq2.calc(&svgen_dq2);          // 调用函数模块svgen_dq2

Ta1 = svgen_dq1.Ta;                        // 访问运算结果svgen_dq1

Tb1 = svgen_dq1.Tb;                        // 访问运算结果svgen_dq1

Tc1 = svgen_dq1.Tc;                        // 访问运算结果svgen_dq1

Ta2 = svgen_dq2.Ta;                        // 访问运算结果svgen_dq2

Tb2 = svgen_dq2.Tb;                        // 访问运算结果 svgen_dq2

Tc2 = svgen_dq2.Tc;                        // 访问运算结果svgen_dq2

}

为进一步了解空间矢量算法的基本原理,下面给出空间矢量模块的源代码:

void svgendq_calc(SVGENDQ *v)

{

 

   _iq Va,Vb,Vc,t1,t2;

   _iq sector = 0;  /*设相位置(sector)等于Q0   */

/*逆clarke变换 */

    Va = v->Ubeta;

    Vb = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualfa);  /* 0.8660254 = sqrt(3)/2 */

    Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualfa);   /* 0.8660254 = sqrt(3)/2 */

 

/* 60度sector的确定*/

    if (Va>_IQ(0))

       sector = 1;

    if (Vb>_IQ(0))

       sector = sector + 2;

    if (Vc>_IQ(0)) 

       sector = sector + 4;

     

/* X,Y,Z (Va,Vb,Vc)的计算  */

    Va = v->Ubeta;                                                  /* X = Va */

    Vb = _IQmpy(_IQ(0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualfa);   /* Y = Vb */

    Vc = _IQmpy(_IQ(0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualfa);   /* Z = Vc */

     

    if (sector==1)  /* sector 1: t1=Z and t2=Y (abc ---> Tb,Ta,Tc) */

    {

       t1 = Vc;

       t2 = Vb;

       v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      /* tbon = (1-t1-t2)/2 */

       v->Ta = v->Tb+t1;           /* taon = tbon+t1 */

       v->Tc = v->Ta+t2;           /* tcon = taon+t2 */

    }

    else if (sector==2)  /* sector 2: t1=Y and t2=-X (abc ---> Ta,Tc,Tb) */

    {

       t1 = Vb;

       t2 = -Va;

       v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      /* taon = (1-t1-t2)/2 */

       v->Tc = v->Ta+t1;           /* tcon = taon+t1 */

       v->Tb = v->Tc+t2;           /* tbon = tcon+t2 */

    }    

    else if (sector==3)  /* sector 3: t1=-Z and t2=X (abc ---> Ta,Tb,Tc) */

    {

       t1 = -Vc;

       t2 = Va;

       v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      /* taon = (1-t1-t2)/2 */

       v->Tb = v->Ta+t1;           /* tbon = taon+t1 */

       v->Tc = v->Tb+t2;           /* tcon = tbon+t2 */

    } 

    else if (sector==4)  /* sector 4: t1=-X and t2=Z (abc ---> Tc,Tb,Ta) */

    {

       t1 = -Va;

       t2 = Vc;

       v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      /* tcon = (1-t1-t2)/2 */

       v->Tb = v->Tc+t1;           /* tbon = tcon+t1 */

       v->Ta = v->Tb+t2;           /* taon = tbon+t2 */

    } 

    else if (sector==5)  /* sector 5: t1=X and t2=-Y (abc ---> Tb,Tc,Ta) */

    {

       t1 = Va;

       t2 = -Vb;

       v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      /* tbon = (1-t1-t2)/2 */

       v->Tc = v->Tb+t1;           /* tcon = tbon+t1 */

       v->Ta = v->Tc+t2;           /* taon = tcon+t2 */

    } 

    else if (sector==6)  /* sector 6: t1=-Y and t2=-Z (abc ---> Tc,Ta,Tb) */

    {

       t1 = -Vb;

       t2 = -Vc;

       v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));      /* tcon = (1-t1-t2)/2 */

       v->Ta = v->Tc+t1;           /* taon = tcon+t1 */

       v->Tb = v->Ta+t2;           /* tbon = taon+t2 */

    }

     

    v->Ta = _IQmpy(_IQ(2),(v->Ta-_IQ(0.5)));

    v->Tb = _IQmpy(_IQ(2),(v->Tb-_IQ(0.5)));

    v->Tc = _IQmpy(_IQ(2),(v->Tc-_IQ(0.5)));      

}

在相位置(sector)3中的一个矢量的例子:

图  相位置(sector)PWM 实例及其占空比

例2、事件管理器配置

 

EvaRegs.T1PR = p->n_period;                                      /* SYSTEM_FREQUENCY*1000000*T/2     */

                         /*初始化Timer 1周期寄存器                         */

/* 预定标器X1 (T1),ISR周期= T x 1         */

EvaRegs.T1CON.all = PWM_INIT_STATE;          /* 对称操作模式                                     */

EvaRegs.DBTCONA.all = DBTCON_INIT_STATE;

EvaRegs.ACTRA.all = ACTR_INIT_STATE;

EvaRegs.COMCONA.all = 0xA200;

EvaRegs.CMPR1 = p->n_period;

EvaRegs.CMPR2 = p->n_period;

EvaRegs.CMPR3 = p->n_period;

EALLOW;

GpioMuxRegs.GPAMUX.all |= 0x003F;

 

例3、TMS320F2812电流及DC母线电压检测

//******************************************************************************

//    TMS320F2812电流及DC母线电压检测

//    文件名称:F28XILEG_VDC.C

//******************************************************************************

#include "DSP28_Device.h"

#include "f28xileg_vdc.h"

#include "f28xbmsk.h"

#define CPU_CLOCK_SPEED      6.6667L   //  CPU时钟速度150MHz

#define ADC_usDELAY 5000L

#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L)

/ (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L)

extern void DSP28x_usDelay(unsigned long Count);

void F28X_ileg2_dcbus_drv_init(ILEG2DCBUSMEAS *p)

{

    DELAY_US(ADC_usDELAY);      

    AdcRegs.ADCTRL1.all = ADC_RESET_FLAG;        /*复位ADC模块                 */

      asm(" NOP ");

      asm(" NOP ");  

    AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;            /* 为bandgap和参考电路供电*/

      DELAY_US(ADC_usDELAY);                                  /*为ADC其他单元上电前延时 */

  

    AdcRegs.ADCTRL3.bit.ADCPWDN = 1;                  /*为ADC其他单元上电     */

    AdcRegs.ADCTRL3.bit.ADCCLKPS = 3;               /* 设置ADCTRL3寄存器  */

DELAY_US(ADC_usDELAY);      

 

    AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE;           /*设置ADCTRL1寄存器 */

    AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE;            /*设置ADCTRL2寄存器    */

AdcRegs.ADCMAXCONV.bit.MAX_CONV = 2;                      /* 确定3个转换                  */

    AdcRegs.ADCCHSELSEQ1.all = p->Ch_sel;                 /* 配置通道选择                  */

 

EvaRegs.GPTCONA.bit.T1TOADC = 1;                /*设置采用Timer1 UF触发ADC转换 */

}

 

void F28X_ileg2_dcbus_drv_read(ILEG2DCBUSMEAS *p)

{

       int dat_q15;

       long tmp;

        /* 等待ADC转换结束*/

        while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)

        {};

 

        dat_q15 = AdcRegs.ADCRESULT0^0x8000;     /*将转换结果变成Q15格式双极性数据*/

        tmp = (long)(p->Imeas_a_gain*dat_q15);

        p->Imeas_a = (int)(tmp>>13);

        p->Imeas_a += p->Imeas_a_offset;

        p->Imeas_a *= -1;                                /*正向,电流流向电动机*/

        

        dat_q15 = AdcRegs.ADCRESULT1^0x8000;   /*将转换结果变成Q15格式双极性数据*/

        tmp = (long)(p->Imeas_b_gain*dat_q15);

        p->Imeas_b = (int)(tmp>>13);

        p->Imeas_b += p->Imeas_b_offset;

        p->Imeas_b *= -1;                                /*正向,电流流向电动机*/

 

        dat_q15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF;   /*将转换结果变成Q15格式双极性数据*/

        tmp = (long)(p->Vdc_meas_gain*dat_q15);

        p->Vdc_meas = (int)(tmp>>13);

        p->Vdc_meas += p->Vdc_meas_offset;

 

        p->Imeas_c = -(p->Imeas_a + p->Imeas_b);

 

        AdcRegs.ADCTRL2.all |= 0x4040;                 /* 复位排序器                                        */

 

}

 

 

例4、电动机位置检测

/******************************************************************************

//    TMS320F2812电动机位置检测  QEP电路初始化及应用

//    文件名称:F28XQEP.C

//******************************************************************************

#include "DSP28_Device.h"

#include "f28xqep.h"

#include "f28xbmsk.h"

 

void  F28X_EV1_QEP_Init(QEP *p)

{

 

          EvaRegs.CAPCON.all = QEP_CAP_INIT_STATE;     /*设置捕捉单元 */

          EvaRegs.T2CON.all = QEP_TIMER_INIT_STATE;    /*设置捕捉定时器*/

          EvaRegs.T2PR = 0xFFFF;

          EvaRegs.EVAIFRC.bit.CAP3INT = 1;                         /*清除CAP3标志*/

          EvaRegs.EVAIMRC.bit.CAP3INT = 1;                        /*使能CAP3中断*/

          GpioMuxRegs.GPAMUX.all |= 0x0700;                       /*配置捕捉单元的引脚*/

}  

 

 

void F28X_EV1_QEP_Calc(QEP *p)

{

     long tmp;

 

     p->dir_QEP = 0x4000&EvaRegs.GPTCONA.all;

     p->dir_QEP = p->dir_QEP>>14;

   

     p->theta_raw = EvaRegs.T2CNT + p->cal_angle;

   

     tmp = (long)(p->theta_raw*p->mech_scaler);                   /* Q0*Q26 = Q26 */

     tmp &= 0x03FFF000;

     p->theta_mech = (int)(tmp>>11);                               /* Q26 -> Q15 */

     p->theta_mech &= 0x7FFF;

            

     p->theta_elec = p->pole_pairs*p->theta_mech;                 /* Q0*Q15 = Q15 */

     p->theta_elec &= 0x7FFF;

   

}

 

void F28X_EV1_QEP_Isr(QEP *p)

{

 

     p->QEP_cnt_idx = EvaRegs.T2CNT;

     EvaRegs.T2CNT = 0;

     p->index_sync_flag = 0x00F0;

 

}

 

//******************************************************************************

//    TMS320F2812电动机位置检测  QEP电路初始化参数及函数定义

//    文件名称:F28XQEP.H

//******************************************************************************

#ifndef __F28X_QEP_H__

#define __F28X_QEP_H__

 

#include "f28xbmsk.h"

/*               初始化T2CON和CAPCON                */

#define QEP_CAP_INIT_STATE    0x9004

#define QEP_TIMER_INIT_STATE (FREE_RUN_FLAG +          \

                          TIMER_DIR_UPDN +         \

                          TIMER_CLK_PRESCALE_X_1 + \

                          TIMER_ENABLE_BY_OWN +    \

                          TIMER_ENABLE +           \

                          TIMER_CLOCK_SRC_QEP +    \

                          TIMER_COMPARE_LD_ON_ZERO)

 

/*  定义QEP (正交编码电路) 驱动的对象 */

typedef struct {int theta_elec;               /* 输出: 电动机电角度(Q15)                                                   */

                int theta_mech;      /* 输出: 电动机机械角度(Q15)                                                        */

                int dir_QEP;      /* 输出: 电动机转动方向 (Q0)                                                 */

                int QEP_cnt_idx;     /* 变量: 编码器计数(Q0)                                                         */

                int theta_raw;       /* 变量: 定时器2得出的角度(Q0)                              */

                int mech_scaler;     /* 参数: 0.9999/计数最大值,计数最大值 = 4000 (Q26)       */

                int pole_pairs;       /* 参数: 极对数(Q0)                                                                 */

                int cal_angle;        /* 参数: 编码器和相之间的角度偏移量 (Q0)                         */

                int index_sync_flag; /* 输出: Index sync status (Q0)                                                      */

                void (*init)();       /* 初始化函数指针                                                             */

                void (*calc)();     /* 计算函数指针                                                                   */

                void (*isr)();      /* 中断程序指针                                                                       */

                }  QEP;

 

/*                定义一个QEP_handle                            */

typedef QEP *QEP_handle;

#define QEP_DEFAULTS { 0x0, 0x0,0x0,0x0,0x0,16776,2,-2365,0x0,  \

                (void (*)(long))F28X_EV1_QEP_Init,            \

                (void (*)(long))F28X_EV1_QEP_Calc,                   \

                (void (*)(long))F28X_EV1_QEP_Isr }

void F28X_EV1_QEP_Init(QEP_handle);

void F28X_EV1_QEP_Calc(QEP_handle);

void F28X_EV1_QEP_Isr(QEP_handle);

 

#endif /*  __F28X_QEP_H__ */

例5、TMS320F2812实现三相永磁同步电动机的磁场定向控制

//******************************************************************************

//    采用TMS320F2812实现三相永磁同步电动机的磁场定向控制

//    文件名称:PMSM3_1.C

//******************************************************************************

 

#include "IQmathLib.h"         /* 包含IQmath库函数的头文件 */

#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;                     /* Vd testing (pu) */

float Vq_testing = 0.25;                   /* Vq testing (pu) */

float Id_ref = 0;                        /* Id reference (pu) */

float Iq_ref = 0.4;                       /* Iq reference (pu) */

float speed_ref = 0.2;                     /* Speed reference (pu) */

float T = 0.001/ISR_FREQUENCY;   /* Samping period (sec), see parameter.h */

 

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

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 = RMPCNTL_DEFAULTS;

RAMPGEN rg1 = RAMPGEN_DEFAULTS;

 

ILEG2DCBUSMEAS ilg2_vdc1 = ILEG2DCBUSMEAS_DEFAULTS;

 

//  主函数

void main(void)

{

 

//   系统初始化

         InitSysCtrl();

 

//  HISPCP 设置

    EALLOW; 

    SysCtrlRegs.HISPCP.all = 0x0000;     /* SYSCLKOUT/1  */

    EDIS; 

 

// 禁止并清除所有CPU中断:

         DINT;

         IER = 0x0000;

         IFR = 0x0000;

 

// 初始化Pie到默认状态

         InitPieCtrl();

 

// 初始化PIE相量表

         InitPieVectTable();      

       

// 初始化EVA  定时器1:

    //设置定时器1寄存器 (EV A)

    EvaRegs.GPTCONA.all = 0;

   //等待使能标志位

   while (enable_flg==0)

    {

// 使能定时器1的下溢中断

    EvaRegs.EVAIMRA.bit.T1UFINT = 1;

    EvaRegs.EVAIFRA.bit.T1UFINT = 1;

 

// 使能CAP3中断(定时器2)

    EvaRegs.EVAIMRC.bit.CAP3INT = 1;

    EvaRegs.EVAIMRC.bit.CAP3INT = 1;

    };

 

// 重新分配中断向量

         EALLOW;

         PieVectTable.T1UFINT = &EvaTimer1;

         PieVectTable.CAPINT3 = &EvaTimer2;

         EDIS; 

 

// 使能PIE组2的中断6(T1UFINT)

    PieCtrlRegs.PIEIER2.all = M_INT6;

 

// 使能PIE组3的中断7(CAPINT3)

    PieCtrlRegs.PIEIER3.all = M_INT7;

 

// 使能CPU INT2(T1UFINT)和INT3(CAPINT3):

         IER |= (M_INT2 | M_INT3);

 

// 使能全局中断和最高优先级适时调试事件管理器功能:

       

         EINT;      //使能全局中断INTM

         ERTM;       // 使能适时调试中断DBGM

 

/*      模块初始化        */

    pwm1.n_period = SYSTEM_FREQUENCY*1000000*T/2;  /* 预定标器X1 (T1), ISR周期 = T x 1 */

         pwm1.init(&pwm1);

 

    pwmdac1.pwmdac_period = 2500;  /* PWM频率 = 30 kHz */

    pwmdac1.PWM_DAC_IPTR0 = &pwmdac_ch1;

    pwmdac1.PWM_DAC_IPTR1 = &pwmdac_ch2;

    pwmdac1.PWM_DAC_IPTR2 = &pwmdac_ch3;

         pwmdac1.init(&pwmdac1);

 

    qep1.init(&qep1);

 

    drv1.init(&drv1);

 

    ilg2_vdc1.init(&ilg2_vdc1);

 

/* 初始化SPEED_FRQ模块 */

    speed1.K1 = _IQ21(1/(BASE_FREQ*T));

    speed1.K2 = _IQ(1/(1+T*2*PI*30));  /* 低通截至频率 = 30 Hz */

    speed1.K3 = _IQ(1)-speed1.K2;

    speed1.rpm_max = 120*BASE_FREQ/P;

 

/*初始化RAMPGEN模块 */

    rg1.step_angle_max = _IQ(BASE_FREQ*T);

 

/* 初始化PID_REG3  Id调节模块 */

         pid1_id.Kp_reg3 = _IQ(0.75);

         pid1_id.Ki_reg3 = _IQ(T/0.0005);                                  

         pid1_id.Kd_reg3 = _IQ(0/T);                                                     

         pid1_id.Kc_reg3 = _IQ(0.2);

    pid1_id.pid_out_max = _IQ(0.30);

    pid1_id.pid_out_min = _IQ(-0.30);  

 

/* 初始化PID_REG3  Iq调节模块 */

         pid1_iq.Kp_reg3 = _IQ(0.75);

         pid1_iq.Ki_reg3 = _IQ(T/0.0005);

         pid1_iq.Kd_reg3 = _IQ(0/T);

         pid1_iq.Kc_reg3 = _IQ(0.2);

    pid1_iq.pid_out_max = _IQ(0.95);

    pid1_iq.pid_out_min = _IQ(-0.95);

 

/*初始化PID_REG3  速度调节模块 */

     pid1_spd.Kp_reg3 = _IQ(1);

         pid1_spd.Ki_reg3 = _IQ(T*speed_loop_ps/0.1);

         pid1_spd.Kd_reg3 = _IQ(0/(T*speed_loop_ps));    

        pid1_spd.Kc_reg3 = _IQ(0.2);

    pid1_spd.pid_out_max = _IQ(1);

    pid1_spd.pid_out_min = _IQ(-1);

 

// 循环等待

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

 

               pid1_iq.pid_ref_reg3 = pid1_spd.pid_out_reg3;

                  pid1_iq.pid_fdb_reg3 = park1.qe;

                  pid1_iq.calc(&pid1_iq);

 

               pid1_id.pid_ref_reg3 = _IQ(Id_ref);

                  pid1_id.pid_fdb_reg3 = park1.de;

                  pid1_id.calc(&pid1_id);

 

               ipark1.de = pid1_id.pid_out_reg3;

               ipark1.qe = pid1_iq.pid_out_reg3;

               ipark1.ang = speed1.theta_elec;

               ipark1.calc(&ipark1);

 

       svgen_dq1.Ualfa = ipark1.ds;

                 svgen_dq1.Ubeta = ipark1.qs;

                svgen_dq1.calc(&svgen_dq1);

 

    pwm1.Mfunc_c1 = (int)_IQtoIQ15(svgen_dq1.Ta); /* Mfunc_c1 is in Q15 */

               pwm1.Mfunc_c2 = (int)_IQtoIQ15(svgen_dq1.Tb); /* Mfunc_c2 is in Q15 */

    pwm1.Mfunc_c3 = (int)_IQtoIQ15(svgen_dq1.Tc); /* Mfunc_c3 is in Q15 */

                  pwm1.update(&pwm1);

       

ilg2_vdc1.read(&ilg2_vdc1);

       

        clarke1.as = _IQ15toIQ((long)ilg2_vdc1.Imeas_a);

                clarke1.bs = _IQ15toIQ((long)ilg2_vdc1.Imeas_b);

                  clarke1.calc(&clarke1);

       

               park1.ds = clarke1.ds;

               park1.qs = clarke1.qs;

               park1.ang = speed1.theta_elec;

               park1.calc(&park1);

 

               qep1.calc(&qep1);

 

               speed1.theta_elec = _IQ15toIQ((long)qep1.theta_elec);

               speed1.dir_QEP = (long)(qep1.dir_QEP);

               speed1.calc(&speed1);

 

               pwmdac_ch1 = (int)_IQtoIQ15(svgen_dq1.Ta);

               pwmdac_ch2 = (int)_IQtoIQ15(clarke1.as);  

               pwmdac_ch3 = (int)_IQtoIQ15(speed1.theta_elec);  

 

               drv1.enable_flg = enable_flg;

               drv1.update(&drv1);

 

                  pwmdac1.update(&pwmdac1);

 

// 使能定时器中断

                  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;

  }

 


 

状 态: 离线

会员简介

会员代号: citi
联 系 人: 张高
电  话: 020-326585
传  真:
地  址: 偌还饿16号
邮  编: 523620
主  页:
 
该厂商相关技术文摘:
基于TMS320F2812的永磁同步电动机控制
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved