|
@@ -16,13 +16,16 @@ static void foc_defulat_value(void);
|
|
|
static motor_foc_t mFOC;
|
|
static motor_foc_t mFOC;
|
|
|
|
|
|
|
|
void foc_init(void) {
|
|
void foc_init(void) {
|
|
|
- foc_defulat_value();
|
|
|
|
|
- hall_sensor_init();
|
|
|
|
|
|
|
+ foc_defulat_value();
|
|
|
HAL_ADC1_Enable();
|
|
HAL_ADC1_Enable();
|
|
|
/* init pwm hardware timer */
|
|
/* init pwm hardware timer */
|
|
|
PWM_TimerEnable();
|
|
PWM_TimerEnable();
|
|
|
/* enable tim4 to run the foc normal task */
|
|
/* enable tim4 to run the foc normal task */
|
|
|
TIM4_Enable();
|
|
TIM4_Enable();
|
|
|
|
|
+
|
|
|
|
|
+ hall_sensor_init();
|
|
|
|
|
+ vbus_sensor_init();
|
|
|
|
|
+ ntc_sensor_init();
|
|
|
|
|
|
|
|
task_start(foc_measure_task, 0);
|
|
task_start(foc_measure_task, 0);
|
|
|
}
|
|
}
|
|
@@ -71,12 +74,12 @@ FError FOC_STM_NextState(FOCState state) {
|
|
|
if (mFOC.state == CURRENT_CALIBRATE) {
|
|
if (mFOC.state == CURRENT_CALIBRATE) {
|
|
|
changed = true;
|
|
changed = true;
|
|
|
}
|
|
}
|
|
|
- }else if (state == RAMPINT_START) {
|
|
|
|
|
|
|
+ }else if (state == RAMPING_START) {
|
|
|
if (mFOC.state == READY_TO_RUN) {
|
|
if (mFOC.state == READY_TO_RUN) {
|
|
|
changed = true;
|
|
changed = true;
|
|
|
}
|
|
}
|
|
|
}else if (state == RUNNING) {
|
|
}else if (state == RUNNING) {
|
|
|
- if (mFOC.state == RAMPINT_START) {
|
|
|
|
|
|
|
+ if (mFOC.state == RAMPING_START) {
|
|
|
changed = true;
|
|
changed = true;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -100,15 +103,42 @@ FError foc_stop_motor(void) {
|
|
|
return FOC_STM_NextState(ANY_STOP);
|
|
return FOC_STM_NextState(ANY_STOP);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void foc_current_calibrate(void){
|
|
|
|
|
+ mFOC.current_samp.adc_offset_a = 0;
|
|
|
|
|
+ mFOC.current_samp.adc_offset_b = 0;
|
|
|
|
|
+ mFOC.current_samp.adc_offset_c = 0;
|
|
|
|
|
+ PWM_Disable_Channels();
|
|
|
|
|
+ foc_pwm_start(false);
|
|
|
|
|
+
|
|
|
|
|
+ task_udelay(10);
|
|
|
|
|
+
|
|
|
|
|
+ phase_current_init(&mFOC.current_samp);
|
|
|
|
|
+ mFOC.current_samp.is_calibrating = true;
|
|
|
|
|
+ mFOC.current_samp.sector = SECTOR_5;
|
|
|
|
|
+ foc_pwm_start(true);
|
|
|
|
|
+ while(mFOC.current_samp.offset_sample_count == 0){};
|
|
|
|
|
+
|
|
|
|
|
+ foc_pwm_start(false);
|
|
|
|
|
+ phase_current_init(&mFOC.current_samp);
|
|
|
|
|
+ mFOC.current_samp.sector = SECTOR_1;
|
|
|
|
|
+ foc_pwm_start(true);
|
|
|
|
|
+ while(mFOC.current_samp.offset_sample_count == 0){};
|
|
|
|
|
+ foc_pwm_start(false);
|
|
|
|
|
+ PWM_Enable_Channels();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void foc_overide_theta(bool enable){
|
|
void foc_overide_theta(bool enable){
|
|
|
mFOC.override.is_theta = enable;
|
|
mFOC.override.is_theta = enable;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
void foc_overide_vdq(bool enable){
|
|
void foc_overide_vdq(bool enable){
|
|
|
mFOC.override.is_vdq = enable;
|
|
mFOC.override.is_vdq = enable;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
void foc_overide_set_theta(float theta){
|
|
void foc_overide_set_theta(float theta){
|
|
|
mFOC.override.theta = theta;
|
|
mFOC.override.theta = theta;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
void foc_overide_set_vdq(float d, float q){
|
|
void foc_overide_set_vdq(float d, float q){
|
|
|
mFOC.override.vdq.d = d;
|
|
mFOC.override.vdq.d = d;
|
|
|
mFOC.override.vdq.q = q;
|
|
mFOC.override.vdq.q = q;
|
|
@@ -131,7 +161,11 @@ void foc_pwm_up_handler(void){
|
|
|
|
|
|
|
|
|
|
|
|
|
void current_sample_handler(void) {
|
|
void current_sample_handler(void) {
|
|
|
- FOC_Fast_Task(&mFOC);
|
|
|
|
|
|
|
+ if (mFOC.current_samp.is_calibrating) {
|
|
|
|
|
+ phase_current_offset(&mFOC.current_samp);
|
|
|
|
|
+ }else {
|
|
|
|
|
+ FOC_Fast_Task(&mFOC);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void foc_slow_task_handler(void) {
|
|
void foc_slow_task_handler(void) {
|