pmsm3_4.c

来自「通过F2812产生PWM波形来控制电机的运转.」· C语言 代码 · 共 478 行 · 第 1/2 页

C
478
字号
/* ==============================================================================
System Name:  PMSM34

File Name:	PMSM3_4.C

Description:	Primary system file for the Real Implementation of Position Control
                Based Sensored Field Orientation Control for a Three Phase Permanent-
                Magnet Synchronous Motor (PMSM) using QEP sensor

Originator:		Digital control systems Group - Texas Instruments

Note: In this software, the default inverter is supposed to be DMC550 board. 
=====================================================================================
 History:
-------------------------------------------------------------------------------------
 04-15-2005	Version 3.20: Support both F280x and F281x targets 
 04-25-2005 Version 3.21: Move EINT and ERTM down to ensure that all initialization
 						  is completed before interrupts are allowed.
=================================================================================  */

// Include header files used in the main function

//#define stop_key_addr 0xa0001

#include "target.h"


#if (DSP_TARGET==F2812)
#include "DSP281x_Device.h"
#endif

#include "IQmathLib.h"
#include "pmsm3_4.h"
#include "parameter.h"
#include "build.h"
#include "sdf2812_user.h"
#include <math.h>

// Prototype statements for functions found within this file.
interrupt void MainISR(void);
#if (DSP_TARGET==F2812)
interrupt void QepISR(void);
#endif

// Global variables used in this system
float32 VdTesting = 0;            // Vd testing (pu) 
float32 VqTesting = 0.25;         // Vq testing (pu) 
float32 IdRef = 0;                // Id reference (pu) 
float32 IqRef = 0.2;              // Iq reference (pu) 
float32 SpeedRef = 0.1;           // Speed reference (pu) 
float32 PositionRef = 0.5;      // Position reference (Mechanical rotor Anglele  (pu) 
float32 T = 0.001/ISR_FREQUENCY;  // Samping period (sec), see parameter.h 

Uint16 IsrTicker = 0;
Uint16 BackTicker = 0;

int16 PwmDacCh1=0;
int16 PwmDacCh2=0;
int16 PwmDacCh3=0;

int16 DlogCh1 = 0;
int16 DlogCh2 = 0;
int16 DlogCh3 = 0;
int16 DlogCh4 = 0;


//volatile Uint16 EnableFlag = TRUE;
volatile Uint16 EnableFlag = FALSE;


Uint16 LockRotorFlag = FALSE;

Uint16 SpeedLoopPrescaler = 10;      // Speed loop prescaler
Uint16 SpeedLoopCount = 1;           // Speed loop counter

// Instance a few transform objects
CLARKE clarke1 = CLARKE_DEFAULTS;
PARK park1 = PARK_DEFAULTS;
IPARK ipark1 = IPARK_DEFAULTS;

// Instance PID regulators to regulate the d and q synchronous axis currents,
// speed and position
PIDREG3 pid1_id = PIDREG3_DEFAULTS;
PIDREG3 pid1_iq = PIDREG3_DEFAULTS;
PIDREG3 pid1_pos = PIDREG3_DEFAULTS;
PIDREG3 pid1_spd = PIDREG3_DEFAULTS;

// Instance a PWM driver instance
PWMGEN pwm1 = PWMGEN_DEFAULTS;

// Instance a PWM DAC driver instance
PWMDAC pwmdac1 = PWMDAC_DEFAULTS;

// Instance a Space Vector PWM modulator. This modulator generates a, b and c
// phases based on the d and q stationery reference frame inputs
SVGENDQ svgen_dq1 = SVGENDQ_DEFAULTS;

// Instance a QEP interface driver 
QEP qep1 = QEP_DEFAULTS;

// Instance a speed calculator based on QEP
SPEED_MEAS_QEP speed1 = SPEED_MEAS_QEP_DEFAULTS;

// Instance a enable PWM drive driver (only for DMC1500) 
DRIVE drv1 = DRIVE_DEFAULTS;

// Instance a ramp controller to smoothly ramp the frequency
RMPCNTL rc1 = RMPCNTL_DEFAULTS;

//	Instance a ramp generator to simulate an Anglele
RAMPGEN rg1 = RAMPGEN_DEFAULTS;

// Create an instance of the current/dc-bus voltage measurement driver
ILEG2DCBUSMEAS ilg2_vdc1 = ILEG2DCBUSMEAS_DEFAULTS;

// Create an instance of DATALOG Module
DLOG_4CH dlog = DLOG_4CH_DEFAULTS;      


void main(void)
{


// ******************************************
// Initialization code for DSP_TARGET = F2812
// ******************************************
#if (DSP_TARGET==F2812)

// Initialize System Control registers, PLL, WatchDog, Clocks to default state:
        // This function is found in the DSP281x_SysCtrl.c file.
	InitSysCtrl();

// HISPCP prescale register settings, normally it will be set to default values
    EALLOW;   // This is needed to write to EALLOW protected registers
    SysCtrlRegs.HISPCP.all = 0x0000;     // SYSCLKOUT/1  
    EDIS;   // This is needed to disable write to EALLOW protected registers 

// Disable and clear all CPU interrupts:
	DINT;
	IER = 0x0000;
	IFR = 0x0000;

// Initialize Pie Control Registers To Default State:
        // This function is found in the DSP281x_PieCtrl.c file.
	InitPieCtrl();

// Initialize the PIE Vector Table To a Known State:
        // This function is found in DSP281x_PieVect.c.
	// This function populates the PIE vector table with pointers
        // to the shell ISR functions found in DSP281x_DefaultIsr.c.
	InitPieVectTable();	
	
// User specific functions, Reassign vectors (optional), Enable Interrupts:
	
// Initialize EVA Timer 1:
    // Setup Timer 1 Registers (EV A)
    EvaRegs.GPTCONA.all = 0;


//8888 
/****************************/

	//(*((volatile unsigned int *)0x70c4))=0x0;
	//(*((volatile unsigned int *)0x70c5))=0xffff;
	//(*((volatile unsigned int *)0x70e5))=0xffff;
	//(*((volatile unsigned int *)0x70e6))=0x1000;	
	//(*((volatile unsigned int *)0x70e5))=0x1000;



	(*((volatile unsigned int *)0x70c4))=0xc3ff;
	(*((volatile unsigned int *)0x70c5))=0x3c00;
	(*((volatile unsigned int *)0x70e6))=0x1000;
	(*((volatile unsigned int *)0x70e5))=0x400;
	



	//(*((volatile unsigned int *)0x70e6))=0xffff;	   
    
    
/**************************************************/

   // Waiting for enable flag set
   while (EnableFlag==FALSE) 
    { 
/***********************************/
      

	while(key_addr != 0x00FB);     //INTFLAG KEY  
	 //printf("Stop!");

       EnableFlag=TRUE;
/***********************************/
      
      //BackTicker++;
    }



// Enable Underflow interrupt bits for GP timer 1
    EvaRegs.EVAIMRA.bit.T1UFINT = 1;
    EvaRegs.EVAIFRA.bit.T1UFINT = 1;

// Enable CAP3 interrupt bits for GP timer 2
    EvaRegs.EVAIMRC.bit.CAP3INT = 1;
    EvaRegs.EVAIFRC.bit.CAP3INT = 1;

// Reassign ISRs. 
        // Reassign the PIE vector for T1UFINT and CAP3INT to point to a different 
        // ISR then the shell routine found in DSP281x_DefaultIsr.c.
        // This is done if the user does not want to use the shell ISR routine
        // but instead wants to use their own ISR.
	
	EALLOW;	// This is needed to write to EALLOW protected registers
	PieVectTable.T1UFINT = &MainISR;
	PieVectTable.CAPINT3 = &QepISR;
	EDIS;   // This is needed to disable write to EALLOW protected registers

// Enable PIE group 2 interrupt 6 for T1UFINT
    PieCtrlRegs.PIEIER2.all = M_INT6;

// Enable PIE group 3 interrupt 7 for CAP3INT
    PieCtrlRegs.PIEIER3.all = M_INT7;

// Enable CPU INT2 for T1UFINT and INT3 for CAP3INT:
	IER |= (M_INT2 | M_INT3);

#endif

// Initialize PWM module
    pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2;  // Perscaler X1 (T1), ISR period = T x 1 
	pwm1.init(&pwm1); 

// Initialize PWMDAC module
    pwmdac1.PeriodMax = (SYSTEM_FREQUENCY*200/(30*2))*5;   // PWMDAC Frequency = 30 kHz
    pwmdac1.PwmDacInPointer0 = &PwmDacCh1;
    pwmdac1.PwmDacInPointer1 = &PwmDacCh2;
    pwmdac1.PwmDacInPointer2 = &PwmDacCh3;

⌨️ 快捷键说明

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