@@ -115,18 +115,6 @@ static inline void esp_foc_torque_control_loop(esp_foc_axis_t *axis)
115115 esp_foc_low_pass_filter_update (
116116 & axis -> current_filters [1 ], axis -> i_d .raw )) +
117117 axis -> target_u_d .raw ;
118-
119- if (axis -> u_q .raw > (axis -> dc_link_voltage * 0.4 )) {
120- axis -> u_q .raw = (axis -> dc_link_voltage * 0.4 );
121- } else if (axis -> u_q .raw < - (axis -> dc_link_voltage * 0.4 )){
122- axis -> u_q .raw = - (axis -> dc_link_voltage * 0.4 );
123- }
124-
125- if (axis -> u_d .raw > (axis -> dc_link_voltage * 0.4 )) {
126- axis -> u_d .raw = (axis -> dc_link_voltage * 0.4 );
127- } else if (axis -> u_d .raw < - (axis -> dc_link_voltage * 0.4 )){
128- axis -> u_d .raw = - (axis -> dc_link_voltage * 0.4 );
129- }
130118}
131119
132120IRAM_ATTR static void esp_foc_control_loop (void * arg )
@@ -142,7 +130,9 @@ IRAM_ATTR static void esp_foc_control_loop(void *arg)
142130 axis -> u_q .raw ,
143131 & axis -> u_u .raw ,
144132 & axis -> u_v .raw ,
145- & axis -> u_w .raw );
133+ & axis -> u_w .raw ,
134+ axis -> biased_dc_link_voltage ,
135+ axis -> dc_link_to_normalized );
146136
147137 axis -> inverter_driver -> set_voltages (axis -> inverter_driver ,
148138 axis -> u_u .raw ,
@@ -211,14 +201,30 @@ esp_foc_err_t esp_foc_initialize_axis(esp_foc_axis_t *axis,
211201 return ESP_FOC_ERR_INVALID_ARG ;
212202 }
213203
204+ #ifdef CONFIG_ESP_FOC_CUSTOM_MATH
205+ extern void esp_foc_fast_init_sqrt_table (void );
206+ esp_foc_fast_init_sqrt_table ();
207+ #endif
208+
214209 axis -> inverter_driver = inverter ;
215210 axis -> rotor_sensor_driver = rotor ;
216211 axis -> isensor_driver = isensor ;
217212
218213 axis -> dc_link_voltage =
219214 axis -> inverter_driver -> get_dc_link_voltage (axis -> inverter_driver );
215+
216+ #ifdef CONFIG_ESP_FOC_USE_SINE_PWM
217+ axis -> biased_dc_link_voltage = axis -> dc_link_voltage / 4.0f ;
218+ axis -> dc_link_to_normalized = 1.0f / axis -> dc_link_voltage ;
219+ #else
220+ axis -> biased_dc_link_voltage = (axis -> dc_link_voltage * ESP_FOC_SQRT3_TWO ) / 2.0f ;
221+ axis -> dc_link_to_normalized = 1.0f / (axis -> dc_link_voltage * ESP_FOC_SQRT3_TWO );
222+ #endif
220223 axis -> inverter_driver -> set_voltages (axis -> inverter_driver , 0.0 , 0.0 , 0.0 );
224+
221225 ESP_LOGI (tag ,"inverter dc-link voltage: %f[V]" , axis -> dc_link_voltage );
226+ ESP_LOGI (tag , "FoC max voltage: %f" , axis -> biased_dc_link_voltage );
227+ ESP_LOGI (tag , "FoC normalizer scale: %f" , axis -> dc_link_to_normalized );
222228
223229 axis -> dt = 0.0 ;
224230 axis -> last_timestamp = 0.0 ;
@@ -341,10 +347,10 @@ esp_foc_err_t esp_foc_align_axis(esp_foc_axis_t *axis)
341347 0.0f );
342348
343349 axis -> inverter_driver -> enable (axis -> inverter_driver );
344- esp_foc_sleep_ms (2000 );
350+ esp_foc_sleep_ms (100 );
345351
346352 axis -> inverter_driver -> set_voltages (axis -> inverter_driver ,
347- 0.1 * ( axis -> dc_link_voltage / 2.0f ) ,
353+ 0.1 ,
348354 0.0f ,
349355 0.0f );
350356
@@ -379,16 +385,16 @@ IRAM_ATTR esp_foc_err_t esp_foc_set_target_voltage(esp_foc_axis_t *axis,
379385 return ESP_FOC_ERR_AXIS_INVALID_STATE ;
380386 }
381387
382- if (uq .raw > (axis -> dc_link_voltage * 0.4 )) {
383- uq .raw = (axis -> dc_link_voltage * 0.4 );
384- } else if (uq .raw < - (axis -> dc_link_voltage * 0.4 )){
385- uq .raw = - (axis -> dc_link_voltage * 0.4 );
388+ if (uq .raw > (axis -> biased_dc_link_voltage )) {
389+ uq .raw = (axis -> biased_dc_link_voltage );
390+ } else if (uq .raw < - (axis -> biased_dc_link_voltage )){
391+ uq .raw = - (axis -> biased_dc_link_voltage );
386392 }
387393
388- if (ud .raw > (axis -> dc_link_voltage * 0.4 )) {
389- ud .raw = (axis -> dc_link_voltage * 0.4 );
390- } else if (ud .raw < - (axis -> dc_link_voltage * 0.4 )){
391- ud .raw = - (axis -> dc_link_voltage * 0.4 );
394+ if (ud .raw > (axis -> biased_dc_link_voltage )) {
395+ ud .raw = (axis -> biased_dc_link_voltage );
396+ } else if (ud .raw < - (axis -> biased_dc_link_voltage )){
397+ ud .raw = - (axis -> biased_dc_link_voltage );
392398 }
393399
394400 esp_foc_critical_enter ();
@@ -464,6 +470,8 @@ esp_foc_err_t esp_foc_test_motor(esp_foc_inverter_t *inverter,
464470 esp_foc_rotor_sensor_t * rotor ,
465471 esp_foc_motor_control_settings_t settings )
466472{
473+ float norm , bias ;
474+
467475 if (inverter == NULL ) {
468476 ESP_LOGE (tag , "invalid inverter driver!" );
469477 return ESP_FOC_ERR_INVALID_ARG ;
@@ -488,6 +496,14 @@ esp_foc_err_t esp_foc_test_motor(esp_foc_inverter_t *inverter,
488496 0.0f );
489497 esp_foc_sleep_ms (250 );
490498
499+ #ifdef CONFIG_ESP_FOC_USE_SINE_PWM
500+ bias = inverter -> get_dc_link_voltage (inverter ) / 2.0f ;
501+ norm = 1.0f / inverter -> get_dc_link_voltage (inverter );
502+ #else
503+ bias = (inverter -> get_dc_link_voltage (inverter ) * ESP_FOC_SQRT3_TWO ) / 2.0f ;
504+ norm = 1.0f / (inverter -> get_dc_link_voltage (inverter ) * ESP_FOC_SQRT3_TWO );
505+ #endif
506+
491507 /* Turn motor in one direction */
492508 for (float i = 0.0f ; i < 2 * M_PI * settings .motor_pole_pairs ; i += 0.05 ) {
493509 esp_foc_u_voltage u ;
@@ -503,7 +519,9 @@ esp_foc_err_t esp_foc_test_motor(esp_foc_inverter_t *inverter,
503519 0.2f ,
504520 & u .raw ,
505521 & v .raw ,
506- & w .raw );
522+ & w .raw ,
523+ bias ,
524+ norm );
507525
508526 inverter -> set_voltages (inverter ,
509527 u .raw ,
@@ -528,7 +546,9 @@ esp_foc_err_t esp_foc_test_motor(esp_foc_inverter_t *inverter,
528546 0.2f ,
529547 & u .raw ,
530548 & v .raw ,
531- & w .raw );
549+ & w .raw ,
550+ bias ,
551+ norm );
532552
533553 inverter -> set_voltages (inverter ,
534554 u .raw ,
0 commit comments