📄 mtc.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 + -