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

📄 mtc.h

📁 该程序是ST7MC驱动BLDC120
💻 H
字号:
/**************** (c) 2004 STMicroelectronics *********************************

PROJECT  : ST7MC demokit
COMPILER : ST7 METROWERKS C (HIWARE) / COSMIC

MODULE  :  Mtc.h
LIBRARY VERSION  :  1.0.2

CREATION DATE :    08.2003
AUTHOR :      Florent COSTE	/  Microcontroller Application Lab  / ST Hong Kong

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

DESCRIPTION :  MTC peripheral control routine prototypes

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

 ******************************************************************************
 THE SOFTWARE INCLUDED IN THIS FILE IS FOR GUIDANCE ONLY. ST MICROELECTRONICS
 SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES
 WITH RESPECT TO ANY CLAIMS ARISING FROM USE OF THIS SOFTWARE.
 ******************************************************************************
              
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

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

#ifndef MTC_AC_H
#define MTC_AC_H  
/*****************************************************************************/

/* Public Constants -------------------------------------------------------- */
// MotorStatus bitfield
#define	AUTO_SWITCH			((u8)0x01)
#define	FIRST_AUTO_SWITCH	((u8)0x02)
#define LAST_FORCED_SWITCH	((u8)0x04)
#define MOTOR_STALLED		((u8)0x10)
//#define HARD_FAILURE        ((u8)0x20)
#define SCI_FAILURE        	((u8)0x20)
#define START_UP_FAILED		((u8)0x40)
#define EMERGENCY_STOP		((u8)0x80)

#define FAULT_MSK			((u8)0xf0)    // START_UP_FAILED or MOTOR_STALLED or HARD_FAILURE or EMERGENCY_STOP
#define EMERGENCY_STALLED_SCI_MSK	((u8)0xb0)    // START_UP_FAILED or MOTOR_STALLED or HARD_FAILURE or EMERGENCY_STOP

#define PWM_FREQUENCY		((u16)(mem_MCPOH<<8) + mem_MCPOL) 
#define Min_Duty			((u16)(PWM_FREQUENCY * 10 /100)) 	// 10% min duty cycle
#define Start_Freq  		((u16)(35*Pole_Pair_Num*10))		// starting mechanical frequency: 35Hz
#define Freq_Switch_Mode    ((u16)(80*Pole_Pair_Num*10))		// starting mode switch frequency: 50Hz     //70
#define Init_Duty_Voltage 	((u16)(PWM_FREQUENCY * 20 /100)) 	// 20% initial duty cycle
#define Init_Duty_Current   ((u16)407)  		// ((3A)*(0.05 ohm)*5.3/5)*PWM_FREQUENCY = 407
 
#define RATIO_MAX			((u8)15)		/* Max MTIM prescaler ratio */
#define STARTING_UP	

#define T1	MCO0
#define T2	MCO1
#define T3	MCO2
#define T4	MCO3
#define T5	MCO4
#define T6	MCO5

                                    //        Mechanical frequency
#define SAMPLING_TIME_LowSpeed	20	// 50ms   [Fmin <-->35Hz]
#define SAMPLING_TIME_MidSpeed	30	// 20ms   [36Hz <-->Fmax] 
#define SAMPLING_TIME_HighSpeed	10                                   
//#define SAMPLING_TIME	30	// 5ms
                                    
/******* Rising/Falling Bemf, Ki, Kp coefficient calculation **********************
/*******           	Closed loop operation		     **********************
		

              /|\               /
               |               /
  	       	   |     	      /
               |             /
               |   _________/  
               |  /
               | /
	       	   |/_________________________\ 
	   	   Fmin   F_1      F_2  Fmax      /
				
		                                                                

We assume a linear variation of Falling/Rising, Bemf, Ki, Kp coefficients following
the motor frequency. We set 2 intermediate frequencies (see definition right after)
and 4 terms (Rising,Falling,Ki,Kp) associated with Fmin, F_1, F_2, Fmax 
(total: 4+4+4+4 terms); then we calculate the linear coefficient that will be use
to compute each term.

Example: 

Fmin = 500	50 Hz 	(reminder -> electrical frequency with 0.1 Hz resolution!)
Rising_min = 30	Falling_min = 40	Ki_min = 20		Kp_min = 40

F_1 = 2000	200 Hz 	
Rising_F_1 = 150	Falling_F_1 = 10	Ki_1 = 80	Kp_1 = 140

then:
alpha_Rising_1 = (Rising_F_1-Rising_Fmin)/(F_1-Freq_Min) = 120/1500 = 0.08
alpha_Falling_1 = (Falling_F_1-Falling_Fmin)/(F_1-Freq_Min) = -30/1500 = -0.02
alpha_Ki_1 = (Ki_1-Ki_Fmin)/(F_1-Fmin) = 60/1500 = 0.04
alpha_Kp_1 = (Kp_1-Kp_Fmin)/(F_1-Fmin) = 100/1500 = 0.066667

** Result **
From Freq_Min to F_1, Rising, Falling, Ki, Kp will then obey to:
Rising = Rising_Fmin + alpha_Rising_1*(Freq_motor-Freq_Min)
Falling = Falling_Fmin + alpha_Falling_1*(Freq_motor-Freq_Min)
Ki = Ki_Fmin + alpha_Ki_1*(Freq_motor-Freq_Min)
Kp = Kp_Fmin + alpha_Kp_1*(Freq_motor-Freq_Min)

		                                                                
*********************************************************************************/
// See 'Mtc_Settings_Sensorless.h' for Freq_Min & Freq_Max values
//Fmin
#define Rising_Fmin      120	// Frequency min coefficient settings
#define Falling_Fmin     200
#define Ki_Fmin        	 40
#define Kp_Fmin          30

//F_1
#define F_1		 		1890    // 189 Hz  
#define Rising_F_1       98		// Intermediate frequency 1 coefficient settings
#define Falling_F_1      106
#define Ki_F_1           40
#define Kp_F_1           30

//F_2
#define F_2		 		1920   	// 192 Hz
#define Rising_F_2       86    	// Intermediate frequency 2 coefficient settings
#define Falling_F_2      98
#define Ki_F_2           40
#define Kp_F_2           30
                                                            
//F_3
#define F_3		 		2250    // 225 Hz
#define Rising_F_3       0    	// Intermediate frequency 2 coefficient settings
#define Falling_F_3      25
#define Ki_F_3           40
#define Kp_F_3           30                                                            
                                                                                          
//Fmax  
#define Rising_Fmax      0     // Frequency max coefficient settings
#define Falling_Fmax     0      
#define Ki_Fmax          40
#define Kp_Fmax          30
      
                                                                             
/********************************************************************************/      
/* linear coefficients */                                                                             
#define alpha_Rising_1  	(s32)( ((s32)((s16)Rising_F_1-(s16)Rising_Fmin)*1024) / (s32)(F_1-Freq_Min)  )   // *1024 to keep good accuracy
#define alpha_Falling_1		(s32)( ((s32)((s16)Falling_F_1-(s16)Falling_Fmin)*1024) / (s32)(F_1-Freq_Min) )
#define alpha_Ki_1		(s32)( ((s32)((s16)Ki_F_1-(s16)Ki_Fmin)*1024) / (s32)(F_1-Freq_Min) )
#define alpha_Kp_1		(s32)( ((s32)((s16)Kp_F_1-(s16)Kp_Fmin)*1024) / (s32)(F_1-Freq_Min) )

#define alpha_Rising_2  	(s32)( ((s32)((s16)Rising_F_2-(s16)Rising_F_1)*1024) / (s32)(F_2-F_1) )
#define alpha_Falling_2		(s32)( ((s32)((s16)Falling_F_2-(s16)Falling_F_1)*1024) / (s32)(F_2-F_1) )
#define alpha_Ki_2		(s32)( ((s32)((s16)Ki_F_2-(s16)Ki_F_1)*1024) / (s32)(F_2-F_1) )
#define alpha_Kp_2		(s32)( ((s32)((s16)Kp_F_2-(s16)Kp_F_1)*1024) / (s32)(F_2-F_1) )

#define alpha_Rising_3  	(s32)( ((s32)((s16)Rising_F_3-(s16)Rising_F_2)*1024) / (s32)(F_3-F_2) )
#define alpha_Falling_3		(s32)( ((s32)((s16)Falling_F_3-(s16)Falling_F_2)*1024) / (s32)(F_3-F_2) )
#define alpha_Ki_3		(s32)( ((s32)((s16)Ki_F_3-(s16)Ki_F_2)*1024) / (s32)(F_3-F_2) )
#define alpha_Kp_3		(s32)( ((s32)((s16)Kp_F_3-(s16)Kp_F_2)*1024) / (s32)(F_3-F_2) )

#define alpha_Rising_4  	(s32)( ((s32)((s16)Rising_Fmax-(s16)Rising_F_3)*1024) / (s32)(Freq_Max-F_3) )
#define alpha_Falling_4		(s32)( ((s32)((s16)Falling_Fmax-(s16)Falling_F_3)*1024) / (s32)(Freq_Max-F_3) )
#define alpha_Ki_4		(s32)( ((s32)((s16)Ki_Fmax-(s16)Ki_F_3)*1024) / (s32)(Freq_Max-F_3) )
#define alpha_Kp_4		(s32)( ((s32)((s16)Kp_Fmax-(s16)Kp_F_3)*1024) / (s32)(Freq_Max-F_3) )



/* Public Variables -------------------------------------------------------- */   

typedef struct {
		u8 Ratio;
		u8 StepTime;
		} Step_s;


extern u8 Flag_MTC;	// MTC Flag   
#define SWITCH_TO_VOLTAGE_PWMON	0
#define SAMP_EVT	        	1     

extern u8 MotorCmd;
#define STOP_CMD     0x00
#define START_CMD    0xff       

extern u8 Power_Motor_Status;
#define OverHeat         0
#define OverCurrent      1
#define OverVoltage      2
#define StartUpFailed    3
#define MotorStalled     5
#define EmergencyStop     6

                                 
#define Heat_Voltage_Failure 0x05
#define Hard_Failure_MSK     0x07

extern u16 DutyCycle;
extern u16 CurrentReference;
extern u16 Target_Freq;
extern u16 Freq_Motor;
extern u8 Ki;
extern u8 Kp;
extern u8 Rising_bemf;
extern u8 Falling_bemf;     
extern volatile u16 timer_after_start;
extern @tiny volatile u8  MotorStatus;

/* Public  macros ---------------------------------------------------------- */

/* Public Functions prototypes --------------------------------------------- */
void MTC_InitPeripheral(void);
BOOL MTC_StartMotor(void);
void MTC_StopMotor(void);
void Set_Duty(u16);
void Set_Target_Electrical_Frequency(u16);
BOOL active_brake(u16,u16);
u8 GetMotorStatus(void);
void SetMotorStatus(u8);
void Chk_Motor_Stalled(void);
	
#endif
/*** (c) 2004  STMicroelectronics ****************** END OF FILE ***/

⌨️ 快捷键说明

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