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

📄 smcpos.h

📁 Sensorless Field Oriented Control of PMSM Motors
💻 H
字号:
#ifndef smcpos_H
#define smcpos_H

#include "UserParms.h"

typedef struct	{  
				SFRAC16  Valpha;   		// Input: Stationary alfa-axis stator voltage 
                SFRAC16  Ealpha;   		// Variable: Stationary alfa-axis back EMF 
				SFRAC16  EalphaFinal;	// Variable: Filtered EMF for Angle calculation
                SFRAC16  Zalpha;      	// Output: Stationary alfa-axis sliding control 
                SFRAC16  Gsmopos;    	// Parameter: Motor dependent control gain 
                SFRAC16  EstIalpha;   	// Variable: Estimated stationary alfa-axis stator current 
                SFRAC16  Fsmopos;    	// Parameter: Motor dependent plant matrix 
                SFRAC16  Vbeta;   		// Input: Stationary beta-axis stator voltage 
                SFRAC16  Ebeta;  		// Variable: Stationary beta-axis back EMF 
				SFRAC16  EbetaFinal;	// Variable: Filtered EMF for Angle calculation
                SFRAC16  Zbeta;      	// Output: Stationary beta-axis sliding control 
                SFRAC16  EstIbeta;    	// Variable: Estimated stationary beta-axis stator current 
                SFRAC16  Ialpha;  		// Input: Stationary alfa-axis stator current 
                SFRAC16  IalphaError; 	// Variable: Stationary alfa-axis current error                 
                SFRAC16  Kslide;     	// Parameter: Sliding control gain 
                SFRAC16  Ibeta;  		// Input: Stationary beta-axis stator current 
                SFRAC16  IbetaError;  	// Variable: Stationary beta-axis current error                 
                SFRAC16  Kslf;       	// Parameter: Sliding control filter gain 
                SFRAC16  KslfFinal;    	// Parameter: EMF Filter for angle calculation
                SFRAC16  Theta;			// Output: Compensated rotor angle 
				SFRAC16  Omega;     	// Output: Rotor speed
				} SMC;	            

typedef SMC *SMC_handle;

#define SMC_DEFAULTS {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

// SLOPEx and LINEOFFSETx is taken from the theta
// compensation spreadsheet

#define SPEED_CONSTANT 0.625

// Define this in RPMs

#define SPEED0 500
#define SPEED1 1000
#define SPEED2 1500
#define SPEED3 2000
#define SPEED4 2500
#define SPEED5 3000

// Define this in Degrees, from 0 to 360

#define THETA_AT_SPEED0 30  //30
#define THETA_AT_SPEED1 100 //100
#define THETA_AT_SPEED2 140 //140
#define THETA_AT_SPEED3 160 //160
#define THETA_AT_SPEED4 190 //190
#define THETA_AT_SPEED5 220 //220

#define OMEGA0 (float)(SPEED0 * dLoopTimeInSec * SPEED_CONSTANT * \
                diIrpPerCalc * diPoles * 2.0 / 60.0)
#define OMEGA1 (float)(SPEED1 * dLoopTimeInSec * SPEED_CONSTANT * \
                diIrpPerCalc * diPoles * 2.0 / 60.0)
#define OMEGA2 (float)(SPEED2 * dLoopTimeInSec * SPEED_CONSTANT * \
                diIrpPerCalc * diPoles * 2.0 / 60.0)
#define OMEGA3 (float)(SPEED3 * dLoopTimeInSec * SPEED_CONSTANT * \
                diIrpPerCalc * diPoles * 2.0 / 60.0)
#define OMEGA4 (float)(SPEED4 * dLoopTimeInSec * SPEED_CONSTANT * \
                diIrpPerCalc * diPoles * 2.0 / 60.0)
#define OMEGA5 (float)(SPEED5 * dLoopTimeInSec * SPEED_CONSTANT * \
                diIrpPerCalc * diPoles * 2.0 / 60.0)

#define THETA0 (float)(THETA_AT_SPEED0 * 90.0 / 32768.0)
#define THETA1 (float)(THETA_AT_SPEED1 * 90.0 / 32768.0)
#define THETA2 (float)(THETA_AT_SPEED2 * 90.0 / 32768.0)
#define THETA3 (float)(THETA_AT_SPEED3 * 90.0 / 32768.0)
#define THETA4 (float)(THETA_AT_SPEED4 * 90.0 / 32768.0)
#define THETA5 (float)(THETA_AT_SPEED5 * 90.0 / 32768.0)

#define SLOPECALC0 (float)(THETA0 / OMEGA0)
#define SLOPECALC1 (float)((THETA1 - THETA0) / (OMEGA1 -OMEGA0))
#define SLOPECALC2 (float)((THETA2 - THETA1) / (OMEGA2 -OMEGA1))
#define SLOPECALC3 (float)((THETA3 - THETA2) / (OMEGA3 -OMEGA2))
#define SLOPECALC4 (float)((THETA4 - THETA3) / (OMEGA4 -OMEGA3))
#define SLOPECALC5 (float)((THETA5 - THETA4) / (OMEGA5 -OMEGA4))

#define LINEOFFSET0 (float)(THETA0 - OMEGA0 * SLOPECALC0)
#define LINEOFFSET1 (float)(THETA1 - OMEGA1 * SLOPECALC1)
#define LINEOFFSET2 (float)(THETA2 - OMEGA2 * SLOPECALC2)
#define LINEOFFSET3 (float)(THETA3 - OMEGA3 * SLOPECALC3)
#define LINEOFFSET4 (float)(THETA4 - OMEGA4 * SLOPECALC4)
#define LINEOFFSET5 (float)(THETA5 - OMEGA5 * SLOPECALC5)

#define SLOPEINT0 (int)(SLOPECALC0)
#define SLOPEINT1 (int)(SLOPECALC1)
#define SLOPEINT2 (int)(SLOPECALC2)
#define SLOPEINT3 (int)(SLOPECALC3)
#define SLOPEINT4 (int)(SLOPECALC4)
#define SLOPEINT5 (int)(SLOPECALC5)

#define SLOPEFRAC0 Q15(SLOPECALC0 - SLOPEINT0)
#define SLOPEFRAC1 Q15(SLOPECALC1 - SLOPEINT1)
#define SLOPEFRAC2 Q15(SLOPECALC2 - SLOPEINT2)
#define SLOPEFRAC3 Q15(SLOPECALC3 - SLOPEINT3)
#define SLOPEFRAC4 Q15(SLOPECALC4 - SLOPEINT4)
#define SLOPEFRAC5 Q15(SLOPECALC5 - SLOPEINT5)

#define CONSTANT0 Q15(LINEOFFSET0)
#define CONSTANT1 Q15(LINEOFFSET1)
#define CONSTANT2 Q15(LINEOFFSET2)
#define CONSTANT3 Q15(LINEOFFSET3)
#define CONSTANT4 Q15(LINEOFFSET4)
#define CONSTANT5 Q15(LINEOFFSET5)
#define DEFAULTCONSTANT Q15(THETA5)

void SMC_Position_Estimation(SMC_handle);
void SMCInit(SMC_handle);
SFRAC16 FracDiv(SFRAC16 numerator, SFRAC16 denominator);
int cordic(int x, int y);

extern SFRAC16 PrevTheta;
extern SFRAC16 AccumTheta;
extern unsigned int AccumThetaCnt;

#endif

⌨️ 快捷键说明

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