|
|
@@ -12,6 +12,7 @@
|
|
|
#include "foc/commands.h"
|
|
|
#include "libs/logger.h"
|
|
|
#include "bsp/sched_timer.h"
|
|
|
+#include "foc/motor/hall.h"
|
|
|
|
|
|
static bool _motor_started = false;
|
|
|
static float _motor_throttle = 0;
|
|
|
@@ -20,6 +21,7 @@ void mc_init(void) {
|
|
|
adc_init();
|
|
|
pwm_3phase_init();
|
|
|
samples_init();
|
|
|
+ hall_sensor_init();
|
|
|
foc_command_init();
|
|
|
PMSM_FOC_CoreInit();
|
|
|
sched_timer_enable(SPD_CTRL_MS);
|
|
|
@@ -41,12 +43,13 @@ bool mc_start(u8 mode) {
|
|
|
PMSM_FOC_SetErrCode(FOC_Throttle_Err);
|
|
|
return false;
|
|
|
}
|
|
|
+ PMSM_FOC_Start(mode);
|
|
|
pwm_turn_on_low_side();
|
|
|
task_udelay(500);
|
|
|
phase_current_start_cali();
|
|
|
pwm_start();
|
|
|
adc_start_convert();
|
|
|
- PMSM_FOC_Start(mode);
|
|
|
+ phase_current_wait_cali();
|
|
|
_motor_throttle = 0;
|
|
|
_motor_started = true;
|
|
|
gpio_led2_enable(true);
|
|
|
@@ -72,7 +75,7 @@ bool mc_stop(void) {
|
|
|
gpio_led2_enable(false);
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
+s16 _g_hall_angle = 0;
|
|
|
void mc_hall_calibrate(s16 vd) {
|
|
|
if (PMSM_FOC_Is_Start()) {
|
|
|
return;
|
|
|
@@ -80,22 +83,25 @@ void mc_hall_calibrate(s16 vd) {
|
|
|
pwm_turn_on_low_side();
|
|
|
task_udelay(500);
|
|
|
PMSM_FOC_Start(OPEN_MODE);
|
|
|
+ phase_current_start_cali();
|
|
|
pwm_start();
|
|
|
adc_start_convert();
|
|
|
+ phase_current_wait_cali();
|
|
|
PMSM_FOC_SetOpenVdq(vd, 0);
|
|
|
delay_ms(1000);
|
|
|
|
|
|
- for (int i = 0; i < 5; i++) {
|
|
|
+ for (int i = 0; i < 50; i++) {
|
|
|
for (s16 angle = 0; angle < 360; angle++) {
|
|
|
PMSM_FOC_Set_Angle(angle);
|
|
|
+ _g_hall_angle = angle;
|
|
|
+ delay_ms(1);
|
|
|
}
|
|
|
}
|
|
|
- delay_ms(1000);
|
|
|
-
|
|
|
+ delay_ms(500);
|
|
|
+ PMSM_FOC_SetOpenVdq(0, 0);
|
|
|
+ delay_ms(500);
|
|
|
adc_stop_convert();
|
|
|
-
|
|
|
pwm_stop();
|
|
|
-
|
|
|
PMSM_FOC_Stop();
|
|
|
}
|
|
|
|
|
|
@@ -191,16 +197,24 @@ void ADC_IRQHandler(void) {
|
|
|
TIME_MEATURE_END();
|
|
|
}
|
|
|
|
|
|
-/*FOC 的部分处理,比如速度环,状态机,转把采集等*/
|
|
|
+//#define ANGLE_TEST
|
|
|
+#ifdef ANGLE_TEST
|
|
|
static s16 _g_test_angle = 0;
|
|
|
-void Sched_MC_mTask(void) {
|
|
|
- u8 runMode = PMSM_FOC_CtrlMode();
|
|
|
+static void _debug_angle(void) {
|
|
|
if (_motor_started) {
|
|
|
PMSM_FOC_Set_Angle(_g_test_angle);
|
|
|
if (++_g_test_angle >= 360) {
|
|
|
_g_test_angle = 0;
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
+#endif
|
|
|
+/*FOC 的部分处理,比如速度环,状态机,转把采集等*/
|
|
|
+void Sched_MC_mTask(void) {
|
|
|
+ u8 runMode = PMSM_FOC_CtrlMode();
|
|
|
+#if ANGLE_TEST
|
|
|
+ _debug_angle();
|
|
|
+#endif
|
|
|
if (runMode != OPEN_MODE) {
|
|
|
if (get_throttle_float() != _motor_throttle) {
|
|
|
_motor_throttle = get_throttle_float();
|