closed loop test passed
This commit is contained in:
@@ -3,5 +3,5 @@
|
|||||||
|
|
||||||
#define DEBUG_ENABLED true
|
#define DEBUG_ENABLED true
|
||||||
#define DEBUG_MT_ENABLED false
|
#define DEBUG_MT_ENABLED false
|
||||||
#define DEBUG_DFOC true
|
#define DEBUG_DFOC false
|
||||||
#endif /* ti_msp_dl_config_h */
|
#endif /* ti_msp_dl_config_h */
|
||||||
67
3rd/dfoc.c
67
3rd/dfoc.c
@@ -15,10 +15,10 @@
|
|||||||
#define _1_SQRT3 0.57735026919f
|
#define _1_SQRT3 0.57735026919f
|
||||||
#define _2_SQRT3 1.15470053838f
|
#define _2_SQRT3 1.15470053838f
|
||||||
|
|
||||||
float Ua = 0, Ub = 0, Uc = 0, Ualpha, Ubeta = 0, dc_a = 0, dc_b = 0, dc_c = 0;
|
volatile float Ua = 0, Ub = 0, Uc = 0, Ualpha, Ubeta = 0, dc_a = 0, dc_b = 0, dc_c = 0;
|
||||||
float voltage_limit = 8;
|
const float voltage_limit = 12;
|
||||||
float voltage_power_supply = 0;
|
const float voltage_power_supply = 12.0f;
|
||||||
float zero_electric_Angle = 0.0;
|
volatile float zero_electric_Angle = 0.0;
|
||||||
|
|
||||||
extern int pp;
|
extern int pp;
|
||||||
extern int Dir;
|
extern int Dir;
|
||||||
@@ -48,7 +48,7 @@ float constrain(float amt, float low, float high)
|
|||||||
//将角度归化到0-2PI
|
//将角度归化到0-2PI
|
||||||
float normalizeAngle(float angle)
|
float normalizeAngle(float angle)
|
||||||
{
|
{
|
||||||
float a = fmod(angle, 2 * PI);
|
volatile float a = fmod(angle, 2 * PI);
|
||||||
return ((a >= 0) ? a : (a + 2 * PI));
|
return ((a >= 0) ? a : (a + 2 * PI));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,14 +59,14 @@ float electricAngle(void)
|
|||||||
|
|
||||||
void SetPwm(float Ua, float Ub, float Uc)
|
void SetPwm(float Ua, float Ub, float Uc)
|
||||||
{
|
{
|
||||||
float U_a = 0.0;
|
volatile float U_a = 0.0;
|
||||||
float U_b = 0.0;
|
volatile float U_b = 0.0;
|
||||||
float U_c = 0.0;
|
volatile float U_c = 0.0;
|
||||||
|
|
||||||
U_a = constrain(Ua, 0.0f, voltage_limit);
|
U_a = constrain(Ua, 0.0f, voltage_limit);
|
||||||
U_b = constrain(Ub, 0.0f, voltage_limit);
|
U_b = constrain(Ub, 0.0f, voltage_limit);
|
||||||
U_c = constrain(Uc, 0.0f, voltage_limit);
|
U_c = constrain(Uc, 0.0f, voltage_limit);
|
||||||
|
//printf("Ua : %f -- Ub : %f -- Uc : %f -- U_a : %f -- U_b : %f -- U_c : %f \n",Ua,Ub,Uc,U_a,U_b,U_c);
|
||||||
dc_a = constrain(U_a / voltage_power_supply, 0.0f, 1.0f);
|
dc_a = constrain(U_a / voltage_power_supply, 0.0f, 1.0f);
|
||||||
dc_b = constrain(U_b / voltage_power_supply, 0.0f, 1.0f);
|
dc_b = constrain(U_b / voltage_power_supply, 0.0f, 1.0f);
|
||||||
dc_c = constrain(U_c / voltage_power_supply, 0.0f, 1.0f);
|
dc_c = constrain(U_c / voltage_power_supply, 0.0f, 1.0f);
|
||||||
@@ -74,19 +74,14 @@ void SetPwm(float Ua, float Ub, float Uc)
|
|||||||
PWM_Channel1(dc_a * 1000.0f); // 频率15k
|
PWM_Channel1(dc_a * 1000.0f); // 频率15k
|
||||||
PWM_Channel2(dc_b * 1000.0f);
|
PWM_Channel2(dc_b * 1000.0f);
|
||||||
PWM_Channel3(dc_c * 1000.0f);
|
PWM_Channel3(dc_c * 1000.0f);
|
||||||
if(DEBUG_ENABLED & DEBUG_DFOC)
|
|
||||||
{
|
|
||||||
printf("dc_a %f \n", dc_a);
|
|
||||||
printf("dc_b %f \n", dc_b);
|
|
||||||
printf("dc_c %f \n", dc_c);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//FOC核心算法,克拉克逆变换/帕克逆变换
|
//FOC核心算法,克拉克逆变换/帕克逆变换
|
||||||
float test_angle = 0.0;
|
volatile float test_angle = 0.0;
|
||||||
float last_test_angle = 0.0;
|
volatile float last_test_angle = 0.0;
|
||||||
void SetPhaseVoltage(float Uq, float Ud, float angle_el)
|
void SetPhaseVoltage(float Uq, float Ud, float angle_el)
|
||||||
{
|
{
|
||||||
// angle_el = normalizeAngle(angle_el);
|
// angle_el = normalizeAngle(angle_el);
|
||||||
@@ -101,21 +96,23 @@ void SetPhaseVoltage(float Uq, float Ud, float angle_el)
|
|||||||
|
|
||||||
SetPwm(Ua, Ub, Uc);
|
SetPwm(Ua, Ub, Uc);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
last_test_angle = angle_el;
|
last_test_angle = angle_el;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Check_Sensor(void)
|
void Check_Sensor(void)
|
||||||
{
|
{
|
||||||
SetPhaseVoltage(3, 0, _3PI_2);
|
//SetPhaseVoltage(3, 0, _3PI_2);
|
||||||
delay_ms(3000);
|
//delay_ms(3000);
|
||||||
zero_electric_Angle = electricAngle();
|
zero_electric_Angle = electricAngle();
|
||||||
SetPhaseVoltage(0, 0, _3PI_2);
|
// SetPhaseVoltage(0, 0, _3PI_2);
|
||||||
delay_ms(500);
|
//delay_ms(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FOC_Init(float power)
|
void FOC_Init(float power)
|
||||||
{
|
{
|
||||||
voltage_power_supply = power;
|
//voltage_power_supply = power;
|
||||||
//PWM_Init();
|
//PWM_Init();
|
||||||
//CurrSense_Init();
|
//CurrSense_Init();
|
||||||
//AS5600_Init();
|
//AS5600_Init();
|
||||||
@@ -127,28 +124,28 @@ void FOC_Init(float power)
|
|||||||
// 单角度环
|
// 单角度环
|
||||||
void Set_Angle(float Target)
|
void Set_Angle(float Target)
|
||||||
{
|
{
|
||||||
float angle = GetAngle();
|
volatile float angle = GetAngle();
|
||||||
float Uq = PID_Controller(0.133, 0.01, 0, (Target - Dir * angle) * 180 / PI);
|
volatile float Uq = PID_Controller(0.133, 0.01, 0, (Target - Dir * angle) * 180 / PI);
|
||||||
SetPhaseVoltage(Uq, 0, electricAngle());
|
SetPhaseVoltage(Uq, 0, electricAngle());
|
||||||
}
|
}
|
||||||
|
|
||||||
double shaft_angle;
|
volatile double openloop_timestamp;
|
||||||
double openloop_timestamp;
|
|
||||||
float velocityopenloop(float target)
|
float velocityopenloop(float target)
|
||||||
{
|
{
|
||||||
float Uq = 0.0;
|
volatile float Uq = 0.0;
|
||||||
double Ts = 0.0;
|
volatile double Ts = 0.0;
|
||||||
|
volatile double shaft_angle;
|
||||||
|
|
||||||
uint32_t now_ts = DL_SYSTICK_getValue();
|
volatile uint32_t now_ts = DL_SYSTICK_getValue();
|
||||||
|
|
||||||
|
|
||||||
if(now_ts < openloop_timestamp)
|
if(now_ts < openloop_timestamp)
|
||||||
{
|
{
|
||||||
Ts = (openloop_timestamp - now_ts) / 32.0f * 1e-6f;
|
Ts = (openloop_timestamp - now_ts) / 80.0f * 1e-6f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Ts = (0xFFFFFF - now_ts + openloop_timestamp) / 32.0f * 1e-6f;
|
Ts = (0xFFFFFF - now_ts + openloop_timestamp) / 80.0f * 1e-6f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Ts < 0 || Ts >= 0.005)
|
if(Ts < 0 || Ts >= 0.005)
|
||||||
@@ -158,10 +155,16 @@ float velocityopenloop(float target)
|
|||||||
|
|
||||||
shaft_angle = normalizeAngle(shaft_angle + pp * target * Ts);
|
shaft_angle = normalizeAngle(shaft_angle + pp * target * Ts);
|
||||||
|
|
||||||
|
if(DEBUG_ENABLED)
|
||||||
|
{
|
||||||
|
//printf("shaft_angle : %f -- target : %f -- Ts : %f",shaft_angle,target,Ts);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Uq = voltage_limit;
|
Uq = voltage_limit;
|
||||||
|
|
||||||
SetPhaseVoltage(Uq, 0, shaft_angle);
|
SetPhaseVoltage(Uq, 0, shaft_angle);
|
||||||
|
printf("shaft_angle : %f \n",shaft_angle);
|
||||||
openloop_timestamp = now_ts;
|
openloop_timestamp = now_ts;
|
||||||
|
|
||||||
return Uq;
|
return Uq;
|
||||||
|
|||||||
33
empty.c
33
empty.c
@@ -47,32 +47,39 @@ extern bool gIsI2cError;
|
|||||||
const float num_f = 0.123456f;
|
const float num_f = 0.123456f;
|
||||||
|
|
||||||
volatile uint16_t count = 0 ;
|
volatile uint16_t count = 0 ;
|
||||||
const float Target = 10.0; //串口目标值
|
const float Target = 10; //串口目标值
|
||||||
|
|
||||||
|
|
||||||
int pp = 7; //电机极对数
|
const int pp = 7; //电机极对数
|
||||||
int Dir = 1; //电机编码器方向
|
const int Dir = -1; //电机编码器方向
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SYSCFG_DL_init();
|
SYSCFG_DL_init();
|
||||||
NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
|
NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
|
||||||
DL_TimerA_startCounter(PWM_0_INST);
|
DL_TimerA_startCounter(PWM_0_INST);
|
||||||
FOC_Init(12);
|
FOC_Init(12.6);
|
||||||
|
DL_SYSTICK_resetValue();
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
DL_GPIO_togglePins(LED_PORT, LED_PA0_PIN);
|
DL_GPIO_togglePins(LED_PORT, LED_PA0_PIN);
|
||||||
//delay_ms(10);
|
//delay_ms(10);
|
||||||
volatile float angle_rad = GetAngle();
|
|
||||||
if(DEBUG_ENABLED)
|
|
||||||
{
|
|
||||||
printf("angle %.5f \n", angle_rad);
|
|
||||||
}
|
|
||||||
|
|
||||||
// volatile uint32_t tick = DL_SYSTICK_getValue();
|
|
||||||
// printf("systick is %x \n",tick);
|
|
||||||
velocityopenloop(Target);
|
|
||||||
|
|
||||||
|
if(DEBUG_ENABLED)
|
||||||
|
{
|
||||||
|
//volatile float angle_rad = GetAngle();
|
||||||
|
//printf("angle %.5f \n", angle_rad);
|
||||||
|
}
|
||||||
|
if(DEBUG_ENABLED)
|
||||||
|
{
|
||||||
|
volatile uint32_t tick = DL_SYSTICK_getValue();
|
||||||
|
//printf("systick is %x \n",tick);
|
||||||
|
}
|
||||||
|
//开环
|
||||||
|
//velocityopenloop(Target);
|
||||||
|
//闭环
|
||||||
|
Set_Angle(Target);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user