init_model.m 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % This file is part of the hoverboard-new-firmware-hack-FOC project
  3. % Compared to previouse commutation method, this project implements
  4. % FOC (Field Oriented Control) for BLDC motors with Hall sensors.
  5. % The new control methods offers superior performanace
  6. % compared to previous method featuring:
  7. % >> reduced noise and vibrations
  8. % >> smooth torque output
  9. % >> improved motor efficiency -> lower energy consumption
  10. %
  11. % Author: Emanuel FERU
  12. % Copyright � 2019-2021 Emanuel FERU <aerdronix@gmail.com>
  13. %
  14. % This program is free software: you can redistribute it and/or modify
  15. % it under the terms of the GNU General Public License as published by
  16. % the Free Software Foundation, either version 3 of the License, or
  17. % (at your option) any later version.
  18. %
  19. % This program is distributed in the hope that it will be useful,
  20. % but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22. % GNU General Public License for more details.
  23. %
  24. % You should have received a copy of the GNU General Public License
  25. % along with this program. If not, see <http://www.gnu.org/licenses/>.
  26. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  27. % Clear workspace
  28. close all
  29. clear
  30. clc
  31. % Load model parameters
  32. Ts = 6.2e-6; % [s] Model sampling time (1 MHz)
  33. Ts_ctrl = 62e-6; % [s] Controller sampling time (~16 kHz)
  34. f_ctrl = 16e3; % [Hz] Controller frequency = 1/Ts_ctrl (16 kHz)
  35. Ts_speed = Ts_ctrl * 50;
  36. i_pwm_count = 4000;
  37. i_dead = 10;
  38. i_adc = 10;
  39. i_sample_before = 10;
  40. i_Udc = 300;
  41. i_half_pwm_count = i_pwm_count;
  42. i_sample_min = (i_dead + i_adc + i_sample_before);
  43. i_hall_count_max = 1/Ts;
  44. % Motor Paramaters
  45. Rs = 0.0918;
  46. Ld = 0.0009262;
  47. Lq = 0.001024;
  48. band_current = 3.14 * 2 * 4000;
  49. % Kp = 0.0009262 * 3.14 * 8000 = 26
  50. % Ki = 0.0918/0.0009262 = 99.11
  51. % Kserial = 99.11 / 0.5816 = 170.42
  52. % Current sample parameters
  53. n_adc_max = 4096;
  54. n_resistance = 0.0005;
  55. n_ref_vol = 3.3;
  56. n_gain = 17.1;
  57. %VBUS sample parameters
  58. b_start_with_commutation = 0;
  59. % Sine/Cosine wave look-up table
  60. res_elecAngle = 1;
  61. a_elecAngle_XA = 0:res_elecAngle:360; % [deg] Electrical angle grid
  62. r_sin_M1 = sin((a_elecAngle_XA)*(pi/180));
  63. r_cos_M1 = cos((a_elecAngle_XA)*(pi/180));
  64. % Speed limitations
  65. n_max = 5000; % [rpm] Maximum motor speed: [-5000, 5000]
  66. % open loop speed -> voltage lookup table
  67. res_rpm_openloop = 100;
  68. delta_rpm_openloop = 100; % delta rpm that when speed decreased, enter open loop
  69. min_start_voltage_openloop = 100;
  70. a_rpm_step = i_Udc / (n_max / res_rpm_openloop);
  71. % Motor parameters
  72. n_polePairs = 4; % [-] Number of motor pole pairs
  73. a_elecPeriod = 360; % [deg] Electrical angle period
  74. a_elecDeltaAngle = 60; % [deg] Electrical angle between two Hall sensor changing events
  75. a_mechAngle = a_elecDeltaAngle / n_polePairs; % [deg] Mechanical angle between two Hall sensor changing events
  76. r_whl = 6.5 * 2.54 * 1e-2 / 2; % [m] Wheel radius. Diameter = 6.5 inch (1 inch = 2.54 cm): Speed[kph] = rpm*(pi/30)*r_whl*3.6
  77. f_lpf_coeff = 0.12;
  78. %hall, [4,6,2,3,1,5,4] [ 3,2,6,4,5,1]
  79. vec_hallToPos = [7 5 1 0 3 4 2 7]; % [-] Mapping Hall signal to position
  80. i_hall_offset = -30;
  81. % Speed Calculation Parameters
  82. cf_speedCoef = (i_hall_count_max * a_mechAngle * (pi/180) * (30/pi)); % [-] Speed calculation coefficient (factors are due to conversions rpm <-> rad/s)
  83. z_maxCntRst = i_hall_count_max; % [-] Maximum counter value for reset (works also as time-out to detect standing still)
  84. n_commDeacvHi = 30; % [rpm] Commutation method deactivation speed high
  85. n_commAcvLo = 15; % [rpm] Commutation method activation speed low
  86. dz_cntTrnsDetHi = 140; % [-] Counter gradient High for transient behavior detection (used for speed estimation)
  87. dz_cntTrnsDetLo = 100; % [-] Counter gradient Low for steady state detection (used for speed estimation)
  88. n_stdStillDet = 3; % [rpm] Speed threshold for Stand still detection
  89. % Motor Angle Measurement (e.g. using an encoder)
  90. b_angleMeasEna = 0; % [-] Enable flag for external mechanical motor angle sensor: 0 = estimated (default), 1 = measured
  91. % Control model request
  92. OPEN_MODE = 0; % [-] Open mode
  93. SPD_MODE = 1; % [-] Speed mode
  94. TRQ_MODE = 2; % [-] Torque mode
  95. z_ctrlModReq = TRQ_MODE; % [-] Control Mode Request (default)
  96. % Cruise control
  97. b_cruiseCtrlEna = 0; % [-] Cruise control enable flag: 0 = disable (default), 1 = enable
  98. n_cruiseMotTgt = 0; % [-] Cruise control motor speed target
  99. %% F04_Field_Weakening
  100. b_fieldWeakEna = 0; % [-] Field weakening enable flag: 0 = disable (default), 1 = enable
  101. r_fieldWeakHi = 1000; % [1000, 1500] Input target High threshold for reaching maximum Field Weakening / Phase Advance
  102. r_fieldWeakLo = 750; % [ 500, 1000] Input target Low threshold for starting Field Weakening / Phase Advance
  103. n_fieldWeakAuthHi = 400; % [rpm] Motor speed High for field weakening authorization
  104. n_fieldWeakAuthLo = 300; % [rpm] Motor speed Low for field weakening authorization
  105. % FOC method
  106. id_fieldWeakMax = 5; % [A] Field weakening maximum current
  107. %% F05_Field_Oriented_Control
  108. z_selPhaCurMeasABC = 0; % [-] Select measured current phases: {iA,iB} = 0; {iB,iC} = 1; {iA,iC} = 2
  109. % Motor Limitations Calibratables
  110. speed_pi_time = 1e-3;
  111. speed_pi_count = speed_pi_time/Ts_ctrl;
  112. cf_iqKiLimProt = 60 / (f_ctrl/3); % [-] Current limit protection integral gain (only used in VLT_MODE and SPD_MODE)
  113. cf_nKiLimProt = 20 / (f_ctrl/3); % [-] Speed limit protection integral gain (only used in VLT_MODE and TRQ_MODE)
  114. cf_KbLimProt = 1000 / (f_ctrl/3);% [-] Back calculation gain for integral anti-windup
  115. % Voltage Limitations
  116. V_margin = 0.95; % [-] Voltage margin to make sure that there is a sufficiently wide pulse for a good phase current measurement
  117. Vd_max = i_Udc * V_margin;
  118. Vq_max_XA = 0:1:Vd_max;
  119. Vq_max_M1 = sqrt(Vd_max^2 - Vq_max_XA.^2); % Circle limitations look-up table
  120. i_sca = 1; % [-] [not tunable] Scalling factor A to int16 (50 = 1/0.02)
  121. % Current Limitations
  122. i_max = 45; % [A] Maximum allowed motor current (continuous)
  123. i_max = i_max * i_sca;
  124. iq_maxSca_XA = 0:0.02:0.99;
  125. iq_maxSca_XA = fixpt_evenspace_cleanup(iq_maxSca_XA, ufix(16), 2^-16); % Make sure the data is evely spaced up to the last bit
  126. iq_maxSca_M1 = sqrt(1 - iq_maxSca_XA.^2); % Current circle limitations map
  127. %% F06_Control_Type_Management
  128. % Commutation method
  129. z_commutMap_M1 = [1 0 -1 -1 0 1; % Phase A
  130. 0 1 1 0 -1 -1; % Phase B
  131. -1 -1 0 1 1 0]; % Phase C [-] Commutation method map
  132. % Q axis control gains
  133. cf_iqKp = 0.3; % [-] P gain
  134. cf_iqKi = 100 / (f_ctrl/3); % [-] I gain
  135. % D axis control gains
  136. cf_idKp = 0.9; % [-] P gain
  137. cf_idKi = 1.071; % [-] I gain
  138. % Speed control gains
  139. cf_nKp = 1.18; % [-] P gain
  140. cf_nKi = 20.4 / (f_ctrl/3);% [-] I gain