motor_control.c 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011
  1. #include "motor_control.h"
  2. #include "MC_FOC_driver.h"
  3. #include "MC_PID_regulators.h"
  4. #include "MC_Globals.h"
  5. #include "stm32f10x_svpwm_3shunt.h"
  6. #include "hall_sensor.h"
  7. #include "cadence_sensor.h"
  8. #include "speed_sensor.h"
  9. #include "torque_sensor.h"
  10. #include "gas_sensor.h"
  11. #include "key_driver.h"
  12. #include "pwm_driver.h"
  13. #include "math_tools.h"
  14. #include "power12V_driver.h"
  15. #include "ICM20600.h"
  16. /************************全局变量定义************************/
  17. //工作模式
  18. MC_WorkMode_Struct_t MC_WorkMode = MC_WorkMode_Run;
  19. MC_WorkMode_Struct_t MC_WorkMode_Back = ~MC_WorkMode_Run;
  20. //MC_CTL控制指令
  21. MC_ControlCode_Struct_t MC_ControlCode= {MC_GearSt_OFF, MC_LightSwitch_OFF};
  22. MC_ControlCode_Struct_t MC_ControlCode_Back = {(MC_GearSt_Struct_t)~MC_GearSt_OFF, (MC_LightSwitch_Struct_t)~MC_LightSwitch_OFF};
  23. //电机控制计算参数
  24. MC_CalParam_Struct_t MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  25. MC_CalParam_Struct_t MC_CalParam_Back = {(MC_AssistRunMode_Struct_t)~MC_AssistRunMode_INVALID, ~0, ~0, (FlagStatus)~RESET};
  26. //踏频限流系数
  27. uint8_t MC_CadenceLimit_K = 100;
  28. //力矩助力控制参数
  29. MC_TorqueProcess_Param_Struct_t MC_TorqueProcess_Param = {SET, 0, 0, 0};
  30. //推行助力控制参数
  31. MC_WalkProcess_Param_Struct_t MC_WalkProcess_Param = {FALSE, 0};
  32. //踏频助力控制参数
  33. MC_CadenceProcess_Param_Struct_t MC_CadenceProcess_Param = {SET, 0, FALSE, 0};
  34. //电机启动标志
  35. FlagStatus MC_StarFlag = RESET;
  36. /*************************局部函数定义***********************/
  37. //设定值线性变化处理
  38. uint16_t MC_DataSet_Linear_Process(uint16_t SetData, uint16_t PresentData, uint16_t AddCnt, uint16_t DecCnt)
  39. {
  40. int16_t ErrorData;
  41. uint16_t Result;
  42. ErrorData = SetData - PresentData;
  43. if(ErrorData > 0) //升速
  44. {
  45. if(ErrorData >= AddCnt)
  46. {
  47. Result = PresentData + AddCnt;
  48. }
  49. else
  50. {
  51. Result = SetData;
  52. }
  53. }
  54. else if(ErrorData < 0) //降速
  55. {
  56. if((-ErrorData) >= DecCnt)
  57. {
  58. Result = PresentData - DecCnt;
  59. }
  60. else
  61. {
  62. Result = SetData;
  63. }
  64. }
  65. else
  66. {
  67. Result = SetData;
  68. }
  69. return Result;
  70. }
  71. //随电压计算助力衰减系数
  72. uint16_t MC_Cal_K_ByVoltage(uint16_t Voltage, uint16_t DesignVol, uint16_t K_Voltage_Old)
  73. {
  74. uint32_t Cal_Temp;
  75. uint16_t SetVol_Th = 0;
  76. uint16_t ResetVol_Th = 0;
  77. uint16_t Result = 1024;
  78. //根据马达额定电压设定衰减点、衰减系数和恢复点
  79. switch(DesignVol)
  80. {
  81. case 24:
  82. {
  83. SetVol_Th = 33 * 7;
  84. ResetVol_Th = 36 * 7;
  85. Cal_Temp = (Voltage > (SetVol_Th * 100)) ? 1024 : (uint16_t)((uint32_t)(Voltage) / SetVol_Th);//Voltage单位0.001V, SetVol_Th单位0.1V, 系数放大100倍
  86. break;
  87. }
  88. case 36:
  89. {
  90. SetVol_Th = 33 * 10;
  91. ResetVol_Th = 36 * 10;
  92. Cal_Temp = (Voltage > SetVol_Th * 100) ? 1024 : (uint16_t)((uint32_t)(Voltage) / SetVol_Th);//Voltage单位0.001V, SetVol_Th单位0.1V, 系数放大100倍
  93. break;
  94. }
  95. case 48:
  96. {
  97. SetVol_Th = 33 * 13;
  98. ResetVol_Th = 36 * 13;
  99. Cal_Temp = (Voltage > SetVol_Th * 100) ? 1024 : (uint16_t)((uint32_t)(Voltage) / SetVol_Th);//Voltage单位0.001V, SetVol_Th单位0.1V, 系数放大100倍
  100. break;
  101. }
  102. default:
  103. {
  104. Cal_Temp = 100;
  105. break;
  106. }
  107. }
  108. Cal_Temp = Cal_Temp * Cal_Temp / 100 * Cal_Temp / 100 * Cal_Temp * 1024 / 10000; //f(x) = x^4
  109. Cal_Temp = (Cal_Temp < 820) ? 820 : Cal_Temp;
  110. //系数仅衰减
  111. if(Cal_Temp < K_Voltage_Old)
  112. {
  113. Result = Cal_Temp;
  114. }
  115. else
  116. {
  117. Result = K_Voltage_Old;
  118. }
  119. //高于设定恢复电压后,恢复系数
  120. if(Voltage > (ResetVol_Th * 100))
  121. {
  122. Result = 1024;
  123. }
  124. return(Result);
  125. }
  126. //随温度计算助力衰减系数
  127. uint16_t MC_Cal_K_ByTemperature(uint16_t CoilTemp, uint16_t AlarmTempTH)
  128. {
  129. uint32_t CalTemp;
  130. uint16_t Result = 1024;
  131. if(CoilTemp > AlarmTempTH)
  132. {
  133. CalTemp = (uint32_t)AlarmTempTH * AlarmTempTH * 1024;
  134. Result = (uint16_t)(CalTemp / CoilTemp / CoilTemp);
  135. }
  136. else
  137. {
  138. Result = 1024;
  139. }
  140. return(Result);
  141. }
  142. //助力模式判断处理
  143. MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(MC_GearSt_Struct_t GearSt, TrueOrFalse_Flag_Struct_t StopFlag, uint8_t Cadence, ADC_SensorData_Struct_t AdcSenorData)
  144. {
  145. MC_AssistRunMode_Struct_t MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
  146. if(MC_ErrorCode.Code == 0) // 无故障
  147. {
  148. if((GearSt != MC_GearSt_OFF) && (StopFlag == FALSE))
  149. {
  150. //进入推行模式
  151. if(GearSt == MC_GearSt_WALK)
  152. {
  153. MC_AssistRunMode_Result = MC_AssistRunMode_WALK;
  154. }
  155. //进入踏频模式
  156. else if((GearSt & 0xF0) == 0x10)
  157. {
  158. #if CADENCE_MODE_ENABLE
  159. MC_AssistRunMode_Result = MC_AssistRunMode_CADENCE;
  160. #endif
  161. }
  162. else
  163. {
  164. #if 1
  165. static MC_AssistRunMode_Struct_t MC_AssistRunMode_Result_Old = MC_AssistRunMode_INVALID;
  166. //进入力矩模式
  167. MC_AssistRunMode_Result = MC_AssistRunMode_TORQUE;
  168. //判断是否进入转把推行模式
  169. if((Cadence < 15) && (AdcSenorData.TorqueSensor < 100) && (AdcSenorData.GasSensor > 50))
  170. {
  171. if(((MC_AssistRunMode_Result_Old == MC_AssistRunMode_TORQUE) && (MC_HallSensorData.IsStopFlag == TRUE)) //上一次处于力矩模式,需电机停止才能进入转把推行
  172. ||(MC_AssistRunMode_Result_Old == MC_AssistRunMode_WALK)) //上一次处于转把推行模式,继续维持
  173. {
  174. MC_AssistRunMode_Result = MC_AssistRunMode_WALK;
  175. }
  176. }
  177. MC_AssistRunMode_Result_Old = MC_AssistRunMode_Result;
  178. #else
  179. //进入力矩模式
  180. MC_AssistRunMode_Result = MC_AssistRunMode_TORQUE;
  181. #endif
  182. }
  183. }
  184. else
  185. {
  186. MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
  187. }
  188. Power12V_Driver_Process(SET);
  189. }
  190. else //存在故障
  191. {
  192. MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
  193. MC_ControlCode.GearSt = MC_GearSt_OFF;
  194. MC_ControlCode_Back.GearSt = (MC_GearSt_Struct_t)~MC_ControlCode.GearSt;
  195. #if 0
  196. Power12V_Driver_Process(RESET);
  197. #endif
  198. }
  199. return MC_AssistRunMode_Result;
  200. }
  201. //指拨模式处理
  202. MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t GasSensorData, uint16_t TorqueSensorData, MC_GearSt_Struct_t GearSt)
  203. {
  204. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  205. uint8_t TorqueAccStep = 0;//力矩上升斜率
  206. uint8_t TorqueDecStep = 0;//力矩下降斜率
  207. int16_t Torque_Temp;
  208. int32_t Torque_Ref_Temp;
  209. static int16_t IqRefByInPower; //限流计算结果
  210. static uint16_t CurrentLimitPresent; //限流实际值,做升降速处理
  211. uint16_t CurrentLimitSet; //限流设置值,不同助力档位更新
  212. static uint8_t TorqueRefEndUpdateCount = 0;
  213. //踩踏力矩输入
  214. MC_TorqueProcess_Param.TorqueApp = (GasSensorData < TorqueSensorData) ? TorqueSensorData : GasSensorData;
  215. MC_TorqueProcess_Param.TorqueApp = (MC_TorqueProcess_Param.TorqueApp > 2048) ? 2048 : MC_TorqueProcess_Param.TorqueApp;
  216. //按照助力档位调节力矩输入值
  217. switch(GearSt)
  218. {
  219. case MC_GearSt_Torque_ECO:
  220. {
  221. //控制输入给定加速斜率
  222. if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN <= 80)
  223. {
  224. TorqueAccStep = 2;
  225. }
  226. else if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN >= 120)
  227. {
  228. TorqueAccStep = 4;
  229. }
  230. else
  231. {
  232. TorqueAccStep = 3;
  233. }
  234. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  235. //控制输入给定减速斜率
  236. TorqueDecStep = 7;
  237. //根据输入调节力矩环给定
  238. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_AssisParam.Gear_ECO.Upper_Iq) >> 11;
  239. //给定上限
  240. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_ECO.Upper_Iq) ? MC_AssisParam.Gear_ECO.Upper_Iq : Torque_Temp;
  241. //限流参数设置
  242. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  243. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  244. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_ECO.Upper_Iq); //Lower Limit for Output limitation
  245. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  246. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_ECO.Upper_Iq << 10); // 放大1024
  247. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  248. break;
  249. }
  250. case MC_GearSt_Torque_NORM:
  251. {
  252. //控制输入给定加速斜率
  253. if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN <= 80)
  254. {
  255. TorqueAccStep = 2;
  256. }
  257. else if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN >= 120)
  258. {
  259. TorqueAccStep = 4;
  260. }
  261. else
  262. {
  263. TorqueAccStep = 3;
  264. }
  265. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  266. //控制输入给定减速斜率
  267. TorqueDecStep = 7;
  268. //根据输入调节力矩环给定
  269. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_AssisParam.Gear_NORM.Upper_Iq) >> 11;
  270. //给定上限
  271. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_NORM.Upper_Iq) ? MC_AssisParam.Gear_NORM.Upper_Iq : Torque_Temp;
  272. //限流参数设置
  273. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  274. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  275. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_NORM.Upper_Iq); //Lower Limit for Output limitation
  276. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  277. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_NORM.Upper_Iq << 10); // 放大1024
  278. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  279. break;
  280. }
  281. case MC_GearSt_Torque_SPORT:
  282. {
  283. //控制输入给定加速斜率
  284. if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN <= 80)
  285. {
  286. TorqueAccStep = 2;
  287. }
  288. else if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN >= 120)
  289. {
  290. TorqueAccStep = 4;
  291. }
  292. else
  293. {
  294. TorqueAccStep = 3;
  295. }
  296. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  297. //控制输入给定减速斜率
  298. TorqueDecStep = 7;
  299. //根据输入调节力矩环给定
  300. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_AssisParam.Gear_SPORT.Upper_Iq) >> 11;
  301. //给定上限
  302. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SPORT.Upper_Iq) ? MC_AssisParam.Gear_SPORT.Upper_Iq : Torque_Temp;
  303. //限流参数设置
  304. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  305. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  306. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SPORT.Upper_Iq); //Lower Limit for Output limitation
  307. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  308. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SPORT.Upper_Iq << 10); // 放大1024
  309. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  310. break;
  311. }
  312. case MC_GearSt_Torque_TURBO:
  313. {
  314. //控制输入给定加速斜率
  315. if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN <= 80)
  316. {
  317. TorqueAccStep = 2;
  318. }
  319. else if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN >= 120)
  320. {
  321. TorqueAccStep = 4;
  322. }
  323. else
  324. {
  325. TorqueAccStep = 3;
  326. }
  327. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  328. //控制输入给定减速斜率
  329. TorqueDecStep = 7;
  330. //根据输入调节力矩环给定
  331. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_AssisParam.Gear_TURBO.Upper_Iq) >> 11;
  332. //给定上限
  333. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
  334. //限流参数设置
  335. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  336. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  337. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq); //Lower Limit for Output limitation
  338. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  339. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
  340. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  341. break;
  342. }
  343. default:
  344. {
  345. TorqueAccStep = 0;
  346. TorqueDecStep = 0;
  347. Torque_Temp = 0;
  348. break;
  349. }
  350. }
  351. //随车速调节助力比
  352. Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(MC_ConfigParam1.SpeedLimit * 10, 0, MC_ConfigParam1.SpeedLimit * 10, 52, MC_SpeedSensorData.Speed_Data)) >> 10);
  353. //助力输出
  354. MC_TorqueProcess_Param.TorqueRef = Torque_Temp;
  355. if(MC_TorqueProcess_Param.TorqueRef <= 0)
  356. {
  357. MC_TorqueProcess_Param.TorqueRef = 0;
  358. }
  359. //升降速曲线计算
  360. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10) ) //限速处理
  361. {
  362. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  363. {
  364. MC_TorqueProcess_Param.TorqueRefEnd += 1;
  365. }
  366. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  367. {
  368. MC_TorqueProcess_Param.TorqueRefEnd -= 10;
  369. }
  370. }
  371. else if( (Bike_Attitude.UpWardSlope_flag == TRUE)&&(MC_SpeedSensorData.Speed_Data < 100)) //上坡处理
  372. {
  373. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  374. {
  375. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  376. }
  377. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  378. {
  379. TorqueRefEndUpdateCount++;
  380. if(TorqueRefEndUpdateCount >= 3)
  381. {
  382. TorqueRefEndUpdateCount = 0;
  383. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  384. }
  385. }
  386. }
  387. else //正常骑行
  388. {
  389. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  390. {
  391. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  392. }
  393. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  394. {
  395. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  396. }
  397. }
  398. MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
  399. //限速点处理
  400. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10 + 22) ) //限速值+2.2
  401. {
  402. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  403. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  404. //停机处理
  405. MC_MotorStop(&MC_StarFlag);
  406. }
  407. #if 0 //低于限速点启动电机
  408. else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam1.SpeedLimit) * 10))
  409. {
  410. MC_MotorStar(&MC_StarFlag);
  411. }
  412. #elif 1 //低于断电点即启动电机
  413. else
  414. {
  415. MC_MotorStar(&MC_StarFlag);
  416. }
  417. #endif
  418. #if 1
  419. static uint16_t K_ByVoltage_Set_Old = 1024;
  420. uint16_t K_ByVoltage_Set;
  421. static uint16_t K_ByVoltage_Result;
  422. uint16_t K_ByTemperature_Set;
  423. static uint16_t K_ByTemperature_Result;
  424. //根据电压调节输出
  425. K_ByVoltage_Set = MC_Cal_K_ByVoltage(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, K_ByVoltage_Set_Old);//根据母线电压计算衰减比例,递减
  426. K_ByVoltage_Set_Old = K_ByVoltage_Set;
  427. K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
  428. //根据温度调节输出
  429. K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
  430. K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
  431. #else
  432. uint16_t K_ByVoltage_Result = 1024;
  433. uint16_t K_ByTemperature_Result = 1024;
  434. #endif
  435. //限流计算
  436. IqRefByInPower = PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
  437. Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
  438. Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
  439. Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
  440. p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
  441. p_MC_CalParam.Foc_Flag = SET;
  442. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
  443. return (p_MC_CalParam);
  444. }
  445. //推行模式处理
  446. MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_WorkMode)
  447. {
  448. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  449. int16_t TorQueBySpd = 0;
  450. int32_t Ref_Speed_Temp;
  451. int16_t SpdMotorByIdc = 0;
  452. uint8_t StepData = 0;
  453. //配置模式,设定转速 = 最高转速
  454. if(p_MC_WorkMode == MC_WorkMode_Config)
  455. {
  456. StepData = (MC_MotorParam.Rate_Speed << 5) / 5000;//设计5s加速到最大值
  457. StepData = (StepData < 1) ? 1 : StepData;
  458. if(MC_WalkProcess_Param.MotorSpeedSetBegin < (MC_MotorParam.Rate_Speed << 5) * MC_WalkMode_Persent / 100 - 10)
  459. {
  460. MC_WalkProcess_Param.MotorSpeedSetBegin += StepData;
  461. }
  462. else if(MC_WalkProcess_Param.MotorSpeedSetBegin > (MC_MotorParam.Rate_Speed << 5) * MC_WalkMode_Persent / 100 + 10)
  463. {
  464. if(MC_WalkProcess_Param.MotorSpeedSetBegin > StepData)
  465. {
  466. MC_WalkProcess_Param.MotorSpeedSetBegin -= StepData;
  467. }
  468. else
  469. {
  470. MC_WalkProcess_Param.MotorSpeedSetBegin = 0;
  471. }
  472. }
  473. else
  474. {
  475. MC_WalkProcess_Param.MotorSpeedSetBegin = (MC_MotorParam.Rate_Speed << 5 ) * MC_WalkMode_Persent / 100;
  476. }
  477. SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
  478. }
  479. //运行模式,设定转速 = 设置值
  480. else
  481. {
  482. uint8_t WalkMode_MotorSpeedSet = 0;
  483. //新增配置项,兼容旧电机
  484. WalkMode_MotorSpeedSet = (MC_ConfigParam1.WalkMode_MotorSpeedSet == 0) ? 135 : MC_ConfigParam1.WalkMode_MotorSpeedSet;
  485. if(MC_WalkProcess_Param.MotorSpeedSetBegin < (WalkMode_MotorSpeedSet << 5) - 10)
  486. {
  487. MC_WalkProcess_Param.MotorSpeedSetBegin += 1;
  488. }
  489. else if(MC_WalkProcess_Param.MotorSpeedSetBegin > (WalkMode_MotorSpeedSet << 5) + 10)
  490. {
  491. MC_WalkProcess_Param.MotorSpeedSetBegin -= 1;
  492. }
  493. else
  494. {
  495. MC_WalkProcess_Param.MotorSpeedSetBegin = WalkMode_MotorSpeedSet << 5;
  496. }
  497. SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
  498. }
  499. //速度环
  500. TorQueBySpd = PID_Regulator((MC_WalkProcess_Param.MotorSpeedSetBegin >> 5), MC_RunInfo.MotorSpeed, &PID_MotorSpd); // 电机速度闭环输出
  501. TorQueBySpd += SpdMotorByIdc;
  502. //限制车速低于设置值
  503. if(p_MC_WorkMode != MC_WorkMode_Config) //运行模式,推行限速
  504. {
  505. uint8_t WalkMode_SpeedLimit = 0;
  506. //新增配置项,兼容旧电机
  507. WalkMode_SpeedLimit = (MC_ConfigParam1.WalkMode_SpeedLimit == 0) ? 60 : MC_ConfigParam1.WalkMode_SpeedLimit;
  508. TorQueBySpd = (uint16_t)((uint32_t)(TorQueBySpd * Function_Linear_3Stage((WalkMode_SpeedLimit - 5), 0, (WalkMode_SpeedLimit - 5), 128, MC_RunInfo.BikeSpeed)) >> 10);
  509. if(MC_RunInfo.BikeSpeed > WalkMode_SpeedLimit)
  510. {
  511. MC_WalkProcess_Param.MotorSpeedSetBegin = 0;
  512. MC_MotorStop(&MC_StarFlag);
  513. }
  514. else
  515. {
  516. //电机启动
  517. MC_MotorStar(&MC_StarFlag);
  518. }
  519. }
  520. else //配置模式不限速
  521. {
  522. //电机启动
  523. MC_MotorStar(&MC_StarFlag);
  524. }
  525. #if 1
  526. static uint16_t K_ByVoltage_Set_Old = 1024;
  527. uint16_t K_ByVoltage_Set;
  528. static uint16_t K_ByVoltage_Result;
  529. uint16_t K_ByTemperature_Set;
  530. static uint16_t K_ByTemperature_Result;
  531. //根据电压调节输出
  532. K_ByVoltage_Set = MC_Cal_K_ByVoltage(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, K_ByVoltage_Set_Old);//根据母线电压计算衰减比例,递减
  533. K_ByVoltage_Set_Old = K_ByVoltage_Set;
  534. K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
  535. //根据温度调节输出
  536. K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
  537. K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
  538. #else
  539. uint16_t K_ByVoltage_Result = 1024;
  540. uint16_t K_ByTemperature_Result = 1024;
  541. #endif
  542. #if 0
  543. //限制最大输出功率为250W
  544. static uint16_t IqsMax;
  545. if(MC_RunInfo.MotorSpeed < 10)
  546. {
  547. IqsMax = 1050;
  548. }
  549. else
  550. {
  551. IqsMax = 235000 / MC_RunInfo.MotorSpeed;
  552. }
  553. IqsMax = (IqsMax > 1050) ? 1050 : IqsMax;
  554. if(TorQueBySpd > IqsMax)
  555. {
  556. TorQueBySpd = IqsMax;
  557. }
  558. #elif 0
  559. if(TorQueBySpd > 450)
  560. {
  561. TorQueBySpd = 450;
  562. }
  563. #endif
  564. Ref_Speed_Temp = ((int32_t)TorQueBySpd * K_ByVoltage_Result) >> 10;
  565. Ref_Speed_Temp = ((int32_t)Ref_Speed_Temp * K_ByTemperature_Result) >> 10;
  566. p_MC_CalParam.Ref_Speed = (int16_t)(Ref_Speed_Temp);
  567. p_MC_CalParam.Foc_Flag = SET;
  568. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_WALK;
  569. return (p_MC_CalParam);
  570. }
  571. //踏频模式处理
  572. MC_CalParam_Struct_t MC_AssistRunMode_Cadence_Process(MC_CadenceResult_Struct_t CadenceData, ADC_SensorData_Struct_t AdcSenorData, MC_GearSt_Struct_t GearSt, MC_SupportFlag_Struct_t GasCtrlMode)
  573. {
  574. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  575. uint8_t TorqueAccStep = 0;//力矩上升斜率
  576. uint8_t TorqueDecStep = 0;//力矩下降斜率
  577. uint16_t TorqueStartData, TorqueStopData;//力矩启动值,力矩停机值
  578. int16_t Torque_Temp;
  579. int32_t Torque_Ref_Temp;
  580. static uint32_t TorqueStopDelayTimeCnt = 0; //低力矩停机计时
  581. uint16_t TorqueStopDelayTime;
  582. static int16_t IqRefByInPower; //限流计算结果
  583. static uint16_t CurrentLimitPresent; //限流实际值,做升降速处理
  584. uint16_t CurrentLimitSet; //限流设置值,不同助力档位更新
  585. static FlagStatus IsEnterGasMode = RESET;
  586. static uint8_t TorqueRefEndUpdateCount = 0;
  587. #define SOFT_SATRT 1
  588. #if SOFT_SATRT
  589. static FlagStatus SoftStartFlag = SET;
  590. static uint16_t SoftStartDelayTimeCount = 0;
  591. uint16_t SoftStartDelayTime = 0;
  592. uint16_t SoftStartAcc = 0;
  593. #endif
  594. //根据指拨控制
  595. if((GasCtrlMode == MC_SUPPORT_ENABLE) && (AdcSenorData.GasSensor > 50))
  596. {
  597. MC_TorqueProcess_Param.MotorStopLock_Flag = RESET;
  598. //停止判断
  599. if(AdcSenorData.GasSensor < 30)
  600. {
  601. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  602. }
  603. //设定马达输出力矩
  604. MC_TorqueProcess_Param.TorqueApp = (AdcSenorData.GasSensor * MC_AssisParam.Gear_TURBO.Upper_Iq) >> 11;
  605. if(MC_TorqueProcess_Param.TorqueApp < CadenceData.torqueByCadence)
  606. {
  607. MC_TorqueProcess_Param.TorqueApp = CadenceData.torqueByCadence;
  608. }
  609. //进入指拨模式标志
  610. IsEnterGasMode = SET;
  611. }
  612. //根据踩踏力矩控制
  613. else
  614. {
  615. #if 1
  616. //踩踏力矩输入
  617. MC_TorqueProcess_Param.TorqueApp = AdcSenorData.TorqueSensor;
  618. #elif 1
  619. //输入阶跃
  620. MC_TorqueProcess_Param.TorqueApp = 1000;
  621. //踏频设为启动
  622. CadenceData.Cadence_Dir = MC_Cadence_Forward;
  623. CadenceData.IsStopFlag = FALSE;
  624. #endif
  625. //低力矩停机
  626. TorqueStopData = (MC_TorqueCorrectParam.StarData < 400) ? 100 : (MC_TorqueCorrectParam.StarData >> 2);
  627. if(MC_TorqueProcess_Param.TorqueApp >= (TorqueStopData))
  628. {
  629. TorqueStopDelayTimeCnt = HAL_GetTick();
  630. }
  631. else
  632. {
  633. // if(MC_RunInfo.MotorSpeed > 200)
  634. // {
  635. // TorqueStopDelayTime = 218400 / MC_RunInfo.MotorSpeed; //60s / (电机转速 / 4.55 / 2.4) / 3,曲柄1/3圈
  636. // }
  637. // else
  638. // {
  639. // TorqueStopDelayTime = 1200;
  640. // }
  641. // TorqueStopDelayTime= (TorqueStopDelayTime < 500) ? 500 : TorqueStopDelayTime;
  642. TorqueStopDelayTime = 2000;
  643. if((HAL_GetTick() - TorqueStopDelayTimeCnt) > TorqueStopDelayTime)//超时1200ms
  644. {
  645. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  646. }
  647. }
  648. //启动值判断
  649. if(MC_RunInfo.BikeSpeed > 60)
  650. {
  651. TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
  652. : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
  653. : (MC_TorqueCorrectParam.StarData * 3 >> 2)));
  654. }
  655. else
  656. {
  657. TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
  658. : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
  659. : MC_TorqueCorrectParam.StarData));
  660. }
  661. if(MC_TorqueProcess_Param.TorqueApp >= TorqueStartData)
  662. {
  663. MC_TorqueProcess_Param.MotorStopLock_Flag = RESET;
  664. }
  665. //踏频反向或踏频停止停机
  666. if((CadenceData.Cadence_Dir == MC_Cadence_Backward) ||
  667. (CadenceData.IsStopFlag == TRUE)
  668. )
  669. {
  670. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  671. }
  672. //设定输入力矩
  673. MC_TorqueProcess_Param.TorqueApp = CadenceData.torqueByCadence;
  674. //进入指拨模式标志
  675. IsEnterGasMode = RESET;
  676. }
  677. //停机状态,延时处理
  678. if(MC_TorqueProcess_Param.MotorStopLock_Flag == SET)
  679. {
  680. if(MC_TorqueProcess_Param.TorqueRefEnd <= 7)
  681. {
  682. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  683. //停机处理
  684. MC_MotorStop(&MC_StarFlag);
  685. #if SOFT_SATRT
  686. //缓启动标志置位
  687. SoftStartFlag = SET;
  688. SoftStartDelayTimeCount = 0;
  689. #endif
  690. }
  691. else
  692. {
  693. MC_TorqueProcess_Param.TorqueRefEnd -= 7; //这里影响到停止踩踏后的断电时间
  694. MC_MotorStar(&MC_StarFlag);
  695. }
  696. }
  697. //力矩给定升降速处理
  698. else
  699. {
  700. //指拨模式限流值
  701. if(IsEnterGasMode == SET)
  702. {
  703. Torque_Temp = MC_TorqueProcess_Param.TorqueApp;
  704. TorqueAccStep = 3;
  705. TorqueDecStep = 7;
  706. //给定上限
  707. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
  708. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  709. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  710. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq); //Lower Limit for Output limitation
  711. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  712. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
  713. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  714. }
  715. else
  716. {
  717. //按照助力档位调节力矩输入值
  718. switch(GearSt)
  719. {
  720. case MC_GearSt_Cadence_ECO:
  721. {
  722. //控制输入给定加速斜率
  723. if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN <= 90)
  724. {
  725. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt - 1;
  726. }
  727. else if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN >= 110)
  728. {
  729. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt + 1;
  730. }
  731. else
  732. {
  733. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt;
  734. }
  735. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  736. //控制输入给定减速斜率
  737. TorqueDecStep = MC_AssisParam.Gear_ECO.DecCnt;
  738. //调节电机输出功率
  739. if(CadenceData.Cadence_Data < 50)//输出功率与输入力矩成正比,等效于踏频采用固定值50rpm
  740. {
  741. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_ECO.Gain_K >> 1, MC_AssisParam.Gear_ECO.Gain_K, MC_AssisParam.Gear_ECO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  742. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_ECO.Upper_Iq
  743. : Torque_Temp * 120 / (MC_RunInfo.MotorSpeed * 20 / 91);
  744. }
  745. else if((CadenceData.Cadence_Data >= 50) && (CadenceData.Cadence_Data < 90))//输出功率与输入力矩成正比
  746. {
  747. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_ECO.Gain_K >> 1, MC_AssisParam.Gear_ECO.Gain_K, MC_AssisParam.Gear_ECO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  748. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_ECO.Upper_Iq
  749. : ((MC_RunInfo.MotorSpeed < 983) ? Torque_Temp * 216 / (MC_RunInfo.MotorSpeed * 20 / 91)
  750. : Torque_Temp * CadenceData.Cadence_Data * 24 / 10 / (MC_RunInfo.MotorSpeed * 20 / 91));
  751. }
  752. else//全功率输出
  753. {
  754. Torque_Temp = MC_AssisParam.Gear_ECO.Upper_Iq;
  755. }
  756. //根据助力增益调节助力比
  757. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_ECO.Assist_K_GAIN / 100;
  758. //给定下限
  759. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_ECO.Lower_Iq) ? MC_AssisParam.Gear_ECO.Lower_Iq : Torque_Temp;
  760. //给定上限
  761. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_ECO.Upper_Iq) ? MC_AssisParam.Gear_ECO.Upper_Iq : Torque_Temp;
  762. //限流参数设置
  763. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  764. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  765. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_ECO.Upper_Iq); //Lower Limit for Output limitation
  766. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  767. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_ECO.Upper_Iq << 10); // 放大1024
  768. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  769. break;
  770. }
  771. case MC_GearSt_Cadence_NORM:
  772. {
  773. //控制输入给定加速斜率
  774. if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN <= 90)
  775. {
  776. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt - 1;
  777. }
  778. else if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN >= 110)
  779. {
  780. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt + 1;
  781. }
  782. else
  783. {
  784. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt;
  785. }
  786. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  787. //控制输入给定减速斜率
  788. TorqueDecStep = MC_AssisParam.Gear_NORM.DecCnt;
  789. //调节电机输出功率
  790. if(CadenceData.Cadence_Data < 50)//输出功率与输入力矩成正比,等效于踏频采用固定值50rpm
  791. {
  792. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_NORM.Gain_K >> 1, MC_AssisParam.Gear_NORM.Gain_K, MC_AssisParam.Gear_NORM.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  793. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_NORM.Upper_Iq
  794. : Torque_Temp * 120 / (MC_RunInfo.MotorSpeed * 20 / 91);
  795. }
  796. else if((CadenceData.Cadence_Data >= 50) && (CadenceData.Cadence_Data < 90))//输出功率与输入力矩成正比
  797. {
  798. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_NORM.Gain_K >> 1, MC_AssisParam.Gear_NORM.Gain_K, MC_AssisParam.Gear_NORM.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  799. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_NORM.Upper_Iq
  800. : ((MC_RunInfo.MotorSpeed < 983) ? Torque_Temp * 216 / (MC_RunInfo.MotorSpeed * 20 / 91)
  801. : Torque_Temp * CadenceData.Cadence_Data * 24 / 10 / (MC_RunInfo.MotorSpeed * 20 / 91));
  802. }
  803. else//全功率输出
  804. {
  805. Torque_Temp = MC_AssisParam.Gear_NORM.Upper_Iq;
  806. }
  807. //根据助力增益调节助力比
  808. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_NORM.Assist_K_GAIN / 100;
  809. //给定下限
  810. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_NORM.Lower_Iq) ? MC_AssisParam.Gear_NORM.Lower_Iq : Torque_Temp;
  811. //给定上限
  812. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_NORM.Upper_Iq) ? MC_AssisParam.Gear_NORM.Upper_Iq : Torque_Temp;
  813. //限流参数设置
  814. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  815. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  816. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_NORM.Upper_Iq); //Lower Limit for Output limitation
  817. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  818. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_NORM.Upper_Iq << 10); // 放大1024
  819. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  820. break;
  821. }
  822. case MC_GearSt_Cadence_SPORT:
  823. {
  824. //控制输入给定加速斜率
  825. if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN <= 90)
  826. {
  827. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt - 1;
  828. }
  829. else if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN >= 110)
  830. {
  831. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt + 1;
  832. }
  833. else
  834. {
  835. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt;
  836. }
  837. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  838. //控制输入给定减速斜率
  839. TorqueDecStep = MC_AssisParam.Gear_SPORT.DecCnt;
  840. //调节电机输出功率
  841. if(CadenceData.Cadence_Data < 50)//输出功率与输入力矩成正比,等效于踏频采用固定值50rpm
  842. {
  843. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_SPORT.Gain_K >> 1, MC_AssisParam.Gear_SPORT.Gain_K, MC_AssisParam.Gear_SPORT.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  844. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_SPORT.Upper_Iq
  845. : Torque_Temp * 120 / (MC_RunInfo.MotorSpeed * 20 / 91);
  846. }
  847. else if((CadenceData.Cadence_Data >= 50) && (CadenceData.Cadence_Data < 90))//输出功率与输入力矩成正比
  848. {
  849. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_SPORT.Gain_K >> 1, MC_AssisParam.Gear_SPORT.Gain_K, MC_AssisParam.Gear_SPORT.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  850. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_SPORT.Upper_Iq
  851. : ((MC_RunInfo.MotorSpeed < 983) ? Torque_Temp * 216 / (MC_RunInfo.MotorSpeed * 20 / 91)
  852. : Torque_Temp * CadenceData.Cadence_Data * 24 / 10 / (MC_RunInfo.MotorSpeed * 20 / 91));
  853. }
  854. else//全功率输出
  855. {
  856. Torque_Temp = MC_AssisParam.Gear_SPORT.Upper_Iq;
  857. }
  858. //根据助力增益调节助力比
  859. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SPORT.Assist_K_GAIN / 100;
  860. //给定下限
  861. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SPORT.Lower_Iq) ? MC_AssisParam.Gear_SPORT.Lower_Iq : Torque_Temp;
  862. //给定上限
  863. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SPORT.Upper_Iq) ? MC_AssisParam.Gear_SPORT.Upper_Iq : Torque_Temp;
  864. //限流参数设置
  865. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  866. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  867. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SPORT.Upper_Iq); //Lower Limit for Output limitation
  868. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  869. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SPORT.Upper_Iq << 10); // 放大1024
  870. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  871. break;
  872. }
  873. case MC_GearSt_Cadence_TURBO:
  874. {
  875. //控制输入给定加速斜率
  876. if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN <= 90)
  877. {
  878. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt - 1;
  879. }
  880. else if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN >= 110)
  881. {
  882. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt + 1;
  883. }
  884. else
  885. {
  886. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt;
  887. }
  888. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  889. //控制输入给定减速斜率
  890. TorqueDecStep = MC_AssisParam.Gear_TURBO.DecCnt;
  891. //调节电机输出功率
  892. if(CadenceData.Cadence_Data < 50)//输出功率与输入力矩成正比,等效于踏频采用固定值50rpm
  893. {
  894. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_TURBO.Gain_K >> 1, MC_AssisParam.Gear_TURBO.Gain_K, MC_AssisParam.Gear_TURBO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  895. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_TURBO.Upper_Iq
  896. : Torque_Temp * 120 / (MC_RunInfo.MotorSpeed * 20 / 91);
  897. }
  898. else if((CadenceData.Cadence_Data >= 50) && (CadenceData.Cadence_Data < 90))//输出功率与输入力矩成正比
  899. {
  900. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_TURBO.Gain_K >> 1, MC_AssisParam.Gear_TURBO.Gain_K, MC_AssisParam.Gear_TURBO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  901. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_TURBO.Upper_Iq
  902. : ((MC_RunInfo.MotorSpeed < 983) ? Torque_Temp * 216 / (MC_RunInfo.MotorSpeed * 20 / 91)
  903. : Torque_Temp * CadenceData.Cadence_Data * 24 / 10 / (MC_RunInfo.MotorSpeed * 20 / 91));
  904. }
  905. else//全功率输出
  906. {
  907. Torque_Temp = MC_AssisParam.Gear_TURBO.Upper_Iq;
  908. }
  909. //根据助力增益调节助力比
  910. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_TURBO.Assist_K_GAIN / 100;
  911. //给定下限
  912. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_TURBO.Lower_Iq) ? MC_AssisParam.Gear_TURBO.Lower_Iq : Torque_Temp;
  913. //给定上限
  914. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
  915. //限流参数设置
  916. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  917. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  918. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq); //Lower Limit for Output limitation
  919. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  920. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
  921. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  922. break;
  923. }
  924. case MC_GearSt_SMART:
  925. {
  926. //控制输入给定加速斜率
  927. if(MC_ConfigParam1.UserAdjParam_SMART.StarModel_GAIN <= 90)
  928. {
  929. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt - 1;
  930. }
  931. else if(MC_ConfigParam1.UserAdjParam_SMART.StarModel_GAIN >= 110)
  932. {
  933. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt + 1;
  934. }
  935. else
  936. {
  937. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt;
  938. }
  939. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  940. //控制输入给定减速斜率
  941. TorqueDecStep = MC_AssisParam.Gear_SMART.DecCnt;
  942. //调节电机输出功率
  943. if(CadenceData.Cadence_Data < 50)//输出功率与输入力矩成正比,等效于踏频采用固定值50rpm
  944. {
  945. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / (MC_AssisParam.Gear_SMART.TorqueApp_TH);
  946. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_SMART.Upper_Iq
  947. : Torque_Temp * 120 / (MC_RunInfo.MotorSpeed * 20 / 91);
  948. }
  949. else if((CadenceData.Cadence_Data >= 50) && (CadenceData.Cadence_Data < 90))//输出功率与输入力矩成正比
  950. {
  951. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / (MC_AssisParam.Gear_SMART.TorqueApp_TH);
  952. Torque_Temp = (MC_RunInfo.MotorSpeed < 546) ? MC_AssisParam.Gear_SMART.Upper_Iq
  953. : ((MC_RunInfo.MotorSpeed < 983) ? Torque_Temp * 216 / (MC_RunInfo.MotorSpeed * 20 / 91)
  954. : Torque_Temp * CadenceData.Cadence_Data * 24 / 10 / (MC_RunInfo.MotorSpeed * 20 / 91));
  955. }
  956. else//全功率输出
  957. {
  958. Torque_Temp = MC_AssisParam.Gear_SMART.Upper_Iq;
  959. }
  960. //根据助力增益调节助力比
  961. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SMART.Assist_K_GAIN / 100;
  962. //给定下限
  963. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SMART.Lower_Iq) ? MC_AssisParam.Gear_SMART.Lower_Iq : Torque_Temp;
  964. //给定上限
  965. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SMART.Upper_Iq) ? MC_AssisParam.Gear_SMART.Upper_Iq : Torque_Temp;
  966. //限流参数设置
  967. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  968. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  969. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SMART.Upper_Iq); //Lower Limit for Output limitation
  970. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  971. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SMART.Upper_Iq << 10); // 放大1024
  972. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  973. break;
  974. }
  975. default:
  976. {
  977. TorqueAccStep = 0;
  978. TorqueDecStep = 0;
  979. Torque_Temp = 0;
  980. break;
  981. }
  982. }
  983. }
  984. //随车速调节助力比
  985. Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(MC_ConfigParam1.SpeedLimit * 10, 0, MC_ConfigParam1.SpeedLimit * 10, 52, MC_SpeedSensorData.Speed_Data)) >> 10);
  986. //助力输出
  987. MC_TorqueProcess_Param.TorqueRef = Torque_Temp;
  988. if(MC_TorqueProcess_Param.TorqueRef <= 0)
  989. {
  990. MC_TorqueProcess_Param.TorqueRef = 0;
  991. }
  992. //升降速曲线计算
  993. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10) ) //限速处理
  994. {
  995. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  996. {
  997. MC_TorqueProcess_Param.TorqueRefEnd += 1;
  998. }
  999. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1000. {
  1001. MC_TorqueProcess_Param.TorqueRefEnd -= 10;
  1002. }
  1003. }
  1004. else if( (Bike_Attitude.UpWardSlope_flag == TRUE)&&(MC_SpeedSensorData.Speed_Data < 100)) //上坡处理
  1005. {
  1006. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1007. {
  1008. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1009. }
  1010. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1011. {
  1012. TorqueRefEndUpdateCount++;
  1013. if(TorqueRefEndUpdateCount >=3)
  1014. {
  1015. TorqueRefEndUpdateCount = 0;
  1016. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1017. }
  1018. }
  1019. }
  1020. #if SOFT_SATRT
  1021. else if(SoftStartFlag == SET) //启动处理
  1022. {
  1023. if(MC_ConfigParam1.StarModel == MC_StarMode_DYNAMIC) //强劲模式,无延迟
  1024. {
  1025. SoftStartDelayTimeCount = 0;
  1026. SoftStartFlag = RESET;
  1027. }
  1028. else
  1029. {
  1030. if(MC_ConfigParam1.StarModel == MC_StarMode_SOFT) //柔和模式,延迟300ms
  1031. {
  1032. SoftStartDelayTime = 300; //启动处理延时300ms
  1033. SoftStartAcc = 30; //30ms递增0.1倍
  1034. }
  1035. else //正常模式,延迟100ms
  1036. {
  1037. SoftStartDelayTime = 100; //启动处理延时100ms
  1038. SoftStartAcc = 10; //10ms递增0.1倍
  1039. }
  1040. SoftStartDelayTimeCount++;
  1041. if(SoftStartDelayTimeCount <= SoftStartDelayTime) // 缓启动过程,按照0.1倍率逐步增加加减速斜率
  1042. {
  1043. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1044. {
  1045. if((SoftStartDelayTimeCount % (10 - SoftStartDelayTimeCount / SoftStartAcc)) == 0)
  1046. {
  1047. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1048. }
  1049. }
  1050. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1051. {
  1052. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1053. }
  1054. }
  1055. else
  1056. {
  1057. SoftStartDelayTimeCount = 0;
  1058. SoftStartFlag = RESET;
  1059. }
  1060. }
  1061. }
  1062. #endif
  1063. else //正常骑行
  1064. {
  1065. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1066. {
  1067. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1068. }
  1069. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1070. {
  1071. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1072. }
  1073. }
  1074. MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
  1075. //限速点处理
  1076. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10 + 22) ) //限速值 + 2.2
  1077. {
  1078. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  1079. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  1080. //停机处理
  1081. MC_MotorStop(&MC_StarFlag);
  1082. }
  1083. #if 0 //低于限速点启动电机
  1084. else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam1.SpeedLimit) * 10))
  1085. {
  1086. MC_MotorStar(&MC_StarFlag);
  1087. }
  1088. #elif 1 //低于断电点即启动电机
  1089. else
  1090. {
  1091. MC_MotorStar(&MC_StarFlag);
  1092. }
  1093. #endif
  1094. }
  1095. #if 1
  1096. static uint16_t K_ByVoltage_Set_Old = 1024;
  1097. uint16_t K_ByVoltage_Set;
  1098. static uint16_t K_ByVoltage_Result;
  1099. uint16_t K_ByTemperature_Set;
  1100. static uint16_t K_ByTemperature_Result;
  1101. //根据电压调节输出
  1102. K_ByVoltage_Set = MC_Cal_K_ByVoltage(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, K_ByVoltage_Set_Old);//根据母线电压计算衰减比例,递减
  1103. K_ByVoltage_Set_Old = K_ByVoltage_Set;
  1104. K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
  1105. //根据温度调节输出
  1106. K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
  1107. K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
  1108. #else
  1109. uint16_t K_ByVoltage_Result = 1024;
  1110. uint16_t K_ByTemperature_Result = 1024;
  1111. #endif
  1112. //限流计算
  1113. IqRefByInPower = PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
  1114. Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
  1115. Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
  1116. Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
  1117. p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
  1118. p_MC_CalParam.Foc_Flag = SET;
  1119. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_CADENCE;
  1120. return (p_MC_CalParam);
  1121. }
  1122. //力矩模式处理
  1123. MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(MC_CadenceResult_Struct_t CadenceData, ADC_SensorData_Struct_t AdcSenorData, MC_GearSt_Struct_t GearSt, MC_SupportFlag_Struct_t GasCtrlMode)
  1124. {
  1125. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  1126. uint8_t TorqueAccStep = 0;//力矩上升斜率
  1127. uint8_t TorqueDecStep = 0;//力矩下降斜率
  1128. uint16_t TorqueStartData, TorqueStopData;//力矩启动值,力矩停机值
  1129. int16_t Torque_Temp;
  1130. int32_t Torque_Ref_Temp;
  1131. static uint32_t TorqueStopDelayTimeCnt = 0; //低力矩停机计时
  1132. uint16_t TorqueStopDelayTime;
  1133. static int16_t IqRefByInPower; //限流计算结果
  1134. static uint16_t CurrentLimitPresent; //限流实际值,做升降速处理
  1135. uint16_t CurrentLimitSet; //限流设置值,不同助力档位更新
  1136. static FlagStatus IsEnterGasMode = RESET;
  1137. static uint8_t TorqueRefEndUpdateCount = 0;
  1138. #define SOFT_SATRT 1
  1139. #if SOFT_SATRT
  1140. static FlagStatus SoftStartFlag = SET;
  1141. static uint16_t SoftStartDelayTimeCount = 0;
  1142. uint16_t SoftStartDelayTime = 0;
  1143. uint16_t SoftStartAcc = 0;
  1144. #endif
  1145. //根据指拨控制
  1146. if((GasCtrlMode == MC_SUPPORT_ENABLE) && (AdcSenorData.GasSensor > 50))
  1147. {
  1148. MC_TorqueProcess_Param.MotorStopLock_Flag = RESET;
  1149. //停止判断
  1150. if((AdcSenorData.GasSensor < 30) ||
  1151. (CadenceData.Cadence_Dir == MC_Cadence_Backward) ||
  1152. (CadenceData.IsStopFlag == TRUE))
  1153. {
  1154. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  1155. }
  1156. //设定马达输出力矩
  1157. MC_TorqueProcess_Param.TorqueApp = (AdcSenorData.GasSensor * MC_AssisParam.Gear_TURBO.Upper_Iq) >> 11;
  1158. if(MC_TorqueProcess_Param.TorqueApp < CadenceData.torqueByCadence)
  1159. {
  1160. MC_TorqueProcess_Param.TorqueApp = CadenceData.torqueByCadence;
  1161. }
  1162. //进入指拨模式标志
  1163. IsEnterGasMode = SET;
  1164. }
  1165. //根据踩踏力矩控制
  1166. else
  1167. {
  1168. #if 1
  1169. //踩踏力矩输入
  1170. MC_TorqueProcess_Param.TorqueApp = AdcSenorData.TorqueSensor;
  1171. #elif 1
  1172. //输入阶跃
  1173. MC_TorqueProcess_Param.TorqueApp = 1000;
  1174. //踏频设为启动
  1175. CadenceData.Cadence_Dir = MC_Cadence_Forward;
  1176. CadenceData.IsStopFlag = FALSE;
  1177. #elif 1
  1178. //输入斜坡
  1179. static uint32_t WaveTime_Zero = 0;
  1180. static uint32_t Time_Enter = 0;
  1181. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  1182. {
  1183. WaveTime_Zero = HAL_GetTick();
  1184. }
  1185. Time_Enter = HAL_GetTick();
  1186. MC_TorqueProcess_Param.TorqueApp = RampWaveGenerate(WaveTime_Zero, 6000, 2100);
  1187. //踏频设为启动
  1188. CadenceData.Cadence_Dir = MC_Cadence_Forward;
  1189. CadenceData.IsStopFlag = FALSE;
  1190. #elif 1
  1191. //输入三角波,测试输出响应
  1192. static uint32_t WaveTime_Zero = 0;
  1193. static uint32_t Time_Enter = 0;
  1194. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  1195. {
  1196. WaveTime_Zero = HAL_GetTick();
  1197. }
  1198. Time_Enter = HAL_GetTick();
  1199. MC_TorqueProcess_Param.TorqueApp = TriangleWaveGenerate(WaveTime_Zero, 500, 1000 ,1500);
  1200. //踏频设为启动
  1201. CadenceData.Cadence_Dir = MC_Cadence_Forward;
  1202. CadenceData.IsStopFlag = FALSE;
  1203. #elif 1
  1204. //输入方波,测试输出响应
  1205. static uint32_t WaveTime_Zero = 0;
  1206. static uint32_t Time_Enter = 0;
  1207. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  1208. {
  1209. WaveTime_Zero = HAL_GetTick();
  1210. }
  1211. Time_Enter = HAL_GetTick();
  1212. MC_TorqueProcess_Param.TorqueApp = SquareWaveGenerate(WaveTime_Zero, 5000, 8000, 1500);
  1213. //踏频设为启动
  1214. CadenceData.Cadence_Dir = MC_Cadence_Forward;
  1215. CadenceData.IsStopFlag = FALSE;
  1216. #endif
  1217. //低力矩停机
  1218. TorqueStopData = (MC_TorqueCorrectParam.StarData < 200) ? 100 : (MC_TorqueCorrectParam.StarData >> 1);
  1219. if(MC_TorqueProcess_Param.TorqueApp >= (TorqueStopData))
  1220. {
  1221. TorqueStopDelayTimeCnt = HAL_GetTick();
  1222. }
  1223. else
  1224. {
  1225. if(MC_RunInfo.MotorSpeed > 200)
  1226. {
  1227. TorqueStopDelayTime = 218400 / MC_RunInfo.MotorSpeed; //60s / (电机转速 / 4.55 / 2.4) / 3,曲柄1/3圈
  1228. }
  1229. else
  1230. {
  1231. TorqueStopDelayTime = 1200;
  1232. }
  1233. TorqueStopDelayTime= (TorqueStopDelayTime < 500) ? 500 : TorqueStopDelayTime;
  1234. if((HAL_GetTick() - TorqueStopDelayTimeCnt) > TorqueStopDelayTime)//超时1200ms
  1235. {
  1236. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  1237. }
  1238. }
  1239. //启动值判断
  1240. if(MC_RunInfo.BikeSpeed > 60)
  1241. {
  1242. TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
  1243. : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
  1244. : (MC_TorqueCorrectParam.StarData * 3 >> 2)));
  1245. }
  1246. else
  1247. {
  1248. TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
  1249. : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
  1250. : MC_TorqueCorrectParam.StarData));
  1251. }
  1252. if(MC_TorqueProcess_Param.TorqueApp >= TorqueStartData)
  1253. {
  1254. MC_TorqueProcess_Param.MotorStopLock_Flag = RESET;
  1255. }
  1256. //踏频反向或踏频停止停机
  1257. if((CadenceData.Cadence_Dir == MC_Cadence_Backward) ||
  1258. (CadenceData.IsStopFlag == TRUE)
  1259. )
  1260. {
  1261. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  1262. }
  1263. //设定输入力矩
  1264. MC_TorqueProcess_Param.TorqueApp = CadenceData.torqueByCadence;
  1265. //进入指拨模式标志
  1266. IsEnterGasMode = RESET;
  1267. }
  1268. //停机状态,延时处理
  1269. if(MC_TorqueProcess_Param.MotorStopLock_Flag == SET)
  1270. {
  1271. if(MC_TorqueProcess_Param.TorqueRefEnd <= 7)
  1272. {
  1273. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  1274. //停机处理
  1275. MC_MotorStop(&MC_StarFlag);
  1276. #if SOFT_SATRT
  1277. //缓启动标志置位
  1278. SoftStartFlag = SET;
  1279. SoftStartDelayTimeCount = 0;
  1280. #endif
  1281. }
  1282. else
  1283. {
  1284. MC_TorqueProcess_Param.TorqueRefEnd -= 7; //这里影响到停止踩踏后的断电时间
  1285. MC_MotorStar(&MC_StarFlag);
  1286. }
  1287. }
  1288. //力矩给定升降速处理
  1289. else
  1290. {
  1291. //指拨模式按照限流值
  1292. if(IsEnterGasMode == SET)
  1293. {
  1294. Torque_Temp = MC_TorqueProcess_Param.TorqueApp;
  1295. TorqueAccStep = 3;
  1296. TorqueDecStep = 7;
  1297. //给定上限
  1298. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
  1299. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  1300. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  1301. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq); //Lower Limit for Output limitation
  1302. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  1303. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
  1304. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  1305. }
  1306. else
  1307. {
  1308. //按照助力档位调节力矩输入值
  1309. switch(GearSt)
  1310. {
  1311. case MC_GearSt_Torque_ECO:
  1312. {
  1313. //控制输入给定加速斜率
  1314. if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN <= 90)
  1315. {
  1316. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt - 1;
  1317. }
  1318. else if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN >= 110)
  1319. {
  1320. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt + 1;
  1321. }
  1322. else
  1323. {
  1324. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt;
  1325. }
  1326. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  1327. //控制输入给定减速斜率
  1328. TorqueDecStep = MC_AssisParam.Gear_ECO.DecCnt;
  1329. //随力矩输入调节助力比
  1330. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_ECO.Gain_K >> 1, MC_AssisParam.Gear_ECO.Gain_K, MC_AssisParam.Gear_ECO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  1331. //根据助力增益调节助力比
  1332. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_ECO.Assist_K_GAIN / 100;
  1333. //给定下限
  1334. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_ECO.Lower_Iq) ? MC_AssisParam.Gear_ECO.Lower_Iq : Torque_Temp;
  1335. //给定上限
  1336. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_ECO.Upper_Iq) ? MC_AssisParam.Gear_ECO.Upper_Iq : Torque_Temp;
  1337. //限流参数设置
  1338. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  1339. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  1340. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_ECO.Upper_Iq); //Lower Limit for Output limitation
  1341. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  1342. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_ECO.Upper_Iq << 10); // 放大1024
  1343. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  1344. break;
  1345. }
  1346. case MC_GearSt_Torque_NORM:
  1347. {
  1348. //控制输入给定加速斜率
  1349. if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN <= 90)
  1350. {
  1351. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt - 1;
  1352. }
  1353. else if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN >= 110)
  1354. {
  1355. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt + 1;
  1356. }
  1357. else
  1358. {
  1359. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt;
  1360. }
  1361. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  1362. //控制输入给定减速斜率
  1363. TorqueDecStep = MC_AssisParam.Gear_NORM.DecCnt;
  1364. //随力矩输入调节助力比
  1365. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_NORM.Gain_K >> 1, MC_AssisParam.Gear_NORM.Gain_K, MC_AssisParam.Gear_NORM.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  1366. //根据助力增益调节助力比
  1367. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_NORM.Assist_K_GAIN / 100;
  1368. //给定下限
  1369. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_NORM.Lower_Iq) ? MC_AssisParam.Gear_NORM.Lower_Iq : Torque_Temp;
  1370. //给定上限
  1371. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_NORM.Upper_Iq) ? MC_AssisParam.Gear_NORM.Upper_Iq : Torque_Temp;
  1372. //限流参数设置
  1373. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  1374. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  1375. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_NORM.Upper_Iq); //Lower Limit for Output limitation
  1376. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  1377. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_NORM.Upper_Iq << 10); // 放大1024
  1378. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  1379. break;
  1380. }
  1381. case MC_GearSt_Torque_SPORT:
  1382. {
  1383. //控制输入给定加速斜率
  1384. if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN <= 90)
  1385. {
  1386. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt - 1;
  1387. }
  1388. else if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN >= 110)
  1389. {
  1390. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt + 1;
  1391. }
  1392. else
  1393. {
  1394. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt;
  1395. }
  1396. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  1397. //控制输入给定减速斜率
  1398. TorqueDecStep = MC_AssisParam.Gear_SPORT.DecCnt;
  1399. //随力矩输入调节助力比
  1400. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_SPORT.Gain_K >> 1, MC_AssisParam.Gear_SPORT.Gain_K, MC_AssisParam.Gear_SPORT.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  1401. //根据助力增益调节助力比
  1402. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SPORT.Assist_K_GAIN / 100;
  1403. //给定下限
  1404. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SPORT.Lower_Iq) ? MC_AssisParam.Gear_SPORT.Lower_Iq : Torque_Temp;
  1405. //给定上限
  1406. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SPORT.Upper_Iq) ? MC_AssisParam.Gear_SPORT.Upper_Iq : Torque_Temp;
  1407. //限流参数设置
  1408. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  1409. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  1410. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SPORT.Upper_Iq); //Lower Limit for Output limitation
  1411. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  1412. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SPORT.Upper_Iq << 10); // 放大1024
  1413. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  1414. break;
  1415. }
  1416. case MC_GearSt_Torque_TURBO:
  1417. {
  1418. //控制输入给定加速斜率
  1419. if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN <= 90)
  1420. {
  1421. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt - 1;
  1422. }
  1423. else if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN >= 110)
  1424. {
  1425. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt + 1;
  1426. }
  1427. else
  1428. {
  1429. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt;
  1430. }
  1431. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  1432. //控制输入给定减速斜率
  1433. TorqueDecStep = MC_AssisParam.Gear_TURBO.DecCnt;
  1434. //随力矩输入调节助力比
  1435. Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_TURBO.Gain_K >> 1, MC_AssisParam.Gear_TURBO.Gain_K, MC_AssisParam.Gear_TURBO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
  1436. //根据助力增益调节助力比
  1437. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_TURBO.Assist_K_GAIN / 100;
  1438. //给定下限
  1439. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_TURBO.Lower_Iq) ? MC_AssisParam.Gear_TURBO.Lower_Iq : Torque_Temp;
  1440. //给定上限
  1441. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
  1442. //限流参数设置
  1443. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  1444. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  1445. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq); //Lower Limit for Output limitation
  1446. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  1447. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
  1448. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  1449. break;
  1450. }
  1451. case MC_GearSt_SMART:
  1452. {
  1453. //控制输入给定加速斜率
  1454. if(MC_ConfigParam1.UserAdjParam_SMART.StarModel_GAIN <= 90)
  1455. {
  1456. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt - 1;
  1457. }
  1458. else if(MC_ConfigParam1.UserAdjParam_SMART.StarModel_GAIN >= 110)
  1459. {
  1460. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt + 1;
  1461. }
  1462. else
  1463. {
  1464. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt;
  1465. }
  1466. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  1467. //控制输入给定减速斜率
  1468. TorqueDecStep = MC_AssisParam.Gear_SMART.DecCnt;
  1469. //助力比控制系数
  1470. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / (MC_AssisParam.Gear_SMART.TorqueApp_TH);
  1471. //根据助力增益调节助力比
  1472. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SMART.Assist_K_GAIN / 100;
  1473. //给定下限
  1474. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SMART.Lower_Iq) ? MC_AssisParam.Gear_SMART.Lower_Iq : Torque_Temp;
  1475. //给定上限
  1476. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SMART.Upper_Iq) ? MC_AssisParam.Gear_SMART.Upper_Iq : Torque_Temp;
  1477. //限流参数设置
  1478. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  1479. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  1480. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SMART.Upper_Iq); //Lower Limit for Output limitation
  1481. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  1482. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SMART.Upper_Iq << 10); // 放大1024
  1483. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  1484. break;
  1485. }
  1486. case MC_GearSt_SMART_T: //客户需求,新增长续航Smart模式,要求降低最大电流,与Smart区别是助力比曲线调整,限流降低为75%
  1487. {
  1488. //控制输入给定加速斜率
  1489. if(MC_ConfigParam1.UserAdjParam_SMART.StarModel_GAIN <= 90)
  1490. {
  1491. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt - 1;
  1492. }
  1493. else if(MC_ConfigParam1.UserAdjParam_SMART.StarModel_GAIN >= 110)
  1494. {
  1495. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt + 1;
  1496. }
  1497. else
  1498. {
  1499. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt;
  1500. }
  1501. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  1502. //控制输入给定减速斜率
  1503. TorqueDecStep = MC_AssisParam.Gear_SMART.DecCnt;
  1504. //助力比控制系数
  1505. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / ((MC_AssisParam.Gear_SMART.TorqueApp_TH * 6) >> 2);//助力比曲线调整
  1506. //根据助力增益调节助力比
  1507. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SMART.Assist_K_GAIN / 100;
  1508. //给定下限
  1509. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SMART.Lower_Iq) ? MC_AssisParam.Gear_SMART.Lower_Iq : Torque_Temp;
  1510. //给定上限
  1511. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SMART.Upper_Iq) ? MC_AssisParam.Gear_SMART.Upper_Iq : Torque_Temp;
  1512. //限流参数设置
  1513. CurrentLimitSet = (uint32_t)(((MC_AssisParam.Gear_SMART.CurrentMax_K * 3) >> 2) * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;//限流降低为75%
  1514. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  1515. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SMART.Upper_Iq); //Lower Limit for Output limitation
  1516. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  1517. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SMART.Upper_Iq << 10); // 放大1024
  1518. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  1519. break;
  1520. }
  1521. default:
  1522. {
  1523. TorqueAccStep = 0;
  1524. TorqueDecStep = 0;
  1525. Torque_Temp = 0;
  1526. break;
  1527. }
  1528. }
  1529. }
  1530. //随车速调节助力比
  1531. Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(MC_ConfigParam1.SpeedLimit * 10, 0, MC_ConfigParam1.SpeedLimit * 10, 52, MC_SpeedSensorData.Speed_Data)) >> 10);
  1532. //助力输出
  1533. MC_TorqueProcess_Param.TorqueRef = Torque_Temp;
  1534. if(MC_TorqueProcess_Param.TorqueRef <= 0)
  1535. {
  1536. MC_TorqueProcess_Param.TorqueRef = 0;
  1537. }
  1538. //升降速曲线计算
  1539. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10) ) //限速处理
  1540. {
  1541. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1542. {
  1543. MC_TorqueProcess_Param.TorqueRefEnd += 1;
  1544. }
  1545. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1546. {
  1547. MC_TorqueProcess_Param.TorqueRefEnd -= 10;
  1548. }
  1549. }
  1550. else if( (Bike_Attitude.UpWardSlope_flag == TRUE)&&(MC_SpeedSensorData.Speed_Data < 100)) //上坡处理
  1551. {
  1552. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1553. {
  1554. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1555. }
  1556. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1557. {
  1558. TorqueRefEndUpdateCount++;
  1559. if(TorqueRefEndUpdateCount >=3)
  1560. {
  1561. TorqueRefEndUpdateCount = 0;
  1562. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1563. }
  1564. }
  1565. }
  1566. #if SOFT_SATRT
  1567. else if(SoftStartFlag == SET) //启动处理
  1568. {
  1569. if(MC_ConfigParam1.StarModel == MC_StarMode_DYNAMIC) //强劲模式,无延迟
  1570. {
  1571. SoftStartDelayTimeCount = 0;
  1572. SoftStartFlag = RESET;
  1573. }
  1574. else
  1575. {
  1576. if(MC_ConfigParam1.StarModel == MC_StarMode_SOFT) //柔和模式,延迟300ms
  1577. {
  1578. SoftStartDelayTime = 300; //启动处理延时300ms
  1579. SoftStartAcc = 30; //30ms递增0.1倍
  1580. }
  1581. else //正常模式,延迟100ms
  1582. {
  1583. SoftStartDelayTime = 100; //启动处理延时100ms
  1584. SoftStartAcc = 10; //10ms递增0.1倍
  1585. }
  1586. SoftStartDelayTimeCount++;
  1587. if(SoftStartDelayTimeCount <= SoftStartDelayTime) // 缓启动过程,按照0.1倍率逐步增加加减速斜率
  1588. {
  1589. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1590. {
  1591. if((SoftStartDelayTimeCount % (10 - SoftStartDelayTimeCount / SoftStartAcc)) == 0)
  1592. {
  1593. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1594. }
  1595. }
  1596. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1597. {
  1598. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1599. }
  1600. }
  1601. else
  1602. {
  1603. SoftStartDelayTimeCount = 0;
  1604. SoftStartFlag = RESET;
  1605. }
  1606. }
  1607. }
  1608. #endif
  1609. else //正常骑行
  1610. {
  1611. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1612. {
  1613. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1614. }
  1615. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1616. {
  1617. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1618. }
  1619. }
  1620. MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
  1621. //限速点处理
  1622. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10 + 22) ) //限速值 + 2.2
  1623. {
  1624. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  1625. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  1626. //停机处理
  1627. MC_MotorStop(&MC_StarFlag);
  1628. }
  1629. #if 0 //低于限速点启动电机
  1630. else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam1.SpeedLimit) * 10))
  1631. {
  1632. MC_MotorStar(&MC_StarFlag);
  1633. }
  1634. #elif 1 //低于断电点即启动电机
  1635. else
  1636. {
  1637. MC_MotorStar(&MC_StarFlag);
  1638. }
  1639. #endif
  1640. }
  1641. #if 1
  1642. static uint16_t K_ByVoltage_Set_Old = 1024;
  1643. uint16_t K_ByVoltage_Set;
  1644. static uint16_t K_ByVoltage_Result;
  1645. uint16_t K_ByTemperature_Set;
  1646. static uint16_t K_ByTemperature_Result;
  1647. //根据电压调节输出
  1648. K_ByVoltage_Set = MC_Cal_K_ByVoltage(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, K_ByVoltage_Set_Old);//根据母线电压计算衰减比例,递减
  1649. K_ByVoltage_Set_Old = K_ByVoltage_Set;
  1650. K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
  1651. //根据温度调节输出
  1652. K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
  1653. K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
  1654. #else
  1655. uint16_t K_ByVoltage_Result = 1024;
  1656. uint16_t K_ByTemperature_Result = 1024;
  1657. #endif
  1658. //限流计算
  1659. IqRefByInPower = PID_Regulator(CurrentLimitPresent * (MC_RunInfo.SOC <= 5 ? 5 : (MC_RunInfo.SOC >= 10 ? 10 : MC_RunInfo.SOC)) / 1000, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
  1660. Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
  1661. Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
  1662. Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
  1663. p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
  1664. p_MC_CalParam.Foc_Flag = SET;
  1665. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_TORQUE;
  1666. return (p_MC_CalParam);
  1667. }
  1668. /******************************全局函数定义*****************************/
  1669. //传感器初始化
  1670. void MC_SensorInit(void)
  1671. {
  1672. //霍尔传感器IO设置
  1673. HallSensor_GPIO_Init();
  1674. //霍尔电角度初始化
  1675. HallSensorAngle_Init();
  1676. //踏频传感器IO设置
  1677. CadenceSensor_GPIO_Init();
  1678. //速度传感器IO设置
  1679. SpeedSensor_GPIO_Init();
  1680. //刹车信号和Gear信号检测IO设置
  1681. KeyInitial();
  1682. //力矩传感器零点初值
  1683. TorqueOffSetDefaultData_Init(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);
  1684. //指拨零点初值
  1685. GasSensorOffSet_Init(&GasSensor_OffSet, ADC1_Result[ADC1_RANK_GAS]);
  1686. //ICM20600初始化
  1687. ICM20600_initialize();
  1688. if(ICM20600_OK_Flag == TRUE)
  1689. {
  1690. ICM20600_coefficientinitialize(RANGE_250_DPS, RANGE_2G, &ICM20600Sensor);
  1691. }
  1692. }
  1693. //MC控制初始化
  1694. void MC_Init(void)
  1695. {
  1696. //PID参数初始化
  1697. PID_Init(MC_ConfigParam1.SerialNum);
  1698. //助力参数初始化
  1699. UpdateGearParam(MC_ConfigParam1.SerialNum);
  1700. //三相电流零点校准
  1701. SVPWM_3ShuntCurrentReadingCalibration(&MC_ErrorCode);
  1702. //母线电流零点校准
  1703. CurrentReadingCalibration(&MC_ErrorCode);
  1704. //力矩传感器零点值处理
  1705. TorqueOffSetData_Process(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);//145ms
  1706. //智能档位初始化处理
  1707. if(MC_ConfigParam1.NoPBU_Flag == MC_SUPPORT_ENABLE)
  1708. {
  1709. MC_ControlCode.GearSt = MC_GearSt_SMART;
  1710. Update_MC_ControlCode_Back();
  1711. }
  1712. //12V驱动电源初始化
  1713. Power12V_Driver_Init();
  1714. //打开12V驱动电源
  1715. Power12V_Driver_Process(SET);
  1716. }
  1717. //MC控制参数初始化
  1718. void MC_ControlParam_Init(void)
  1719. {
  1720. //清除推行模式初始变量
  1721. MC_WalkProcess_Param.IsEnterFlag = FALSE;
  1722. MC_WalkProcess_Param.MotorSpeedSetBegin = 0;
  1723. //清除力矩模式初始变量
  1724. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  1725. MC_TorqueProcess_Param.TorqueApp = 0;
  1726. MC_TorqueProcess_Param.TorqueRef = 0;
  1727. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  1728. //清除踏频模式初始变量
  1729. MC_CadenceProcess_Param.MotorStopLock_Flag = SET;
  1730. MC_CadenceProcess_Param.CadenceInput = 0;
  1731. MC_CadenceProcess_Param.IsEnterFlag = FALSE;
  1732. MC_CadenceProcess_Param.MotorSpeedSetBegin = 0;
  1733. //全局运算变量归零
  1734. IqFdbFlt =0;
  1735. IdFdbFlt = 0;
  1736. VoltSquareFlt = 0;
  1737. UqVoltFlt = 0;
  1738. UdVoltFlt = 0;
  1739. //PDI积分清零
  1740. PID_Flux_InitStructure.wIntegral = 0;
  1741. PID_Torque_InitStructure.wIntegral = 0;
  1742. PID_Weak_InitStructure.wIntegral = 0;
  1743. PID_IMax.wIntegral = 0;
  1744. PID_MotorSpd.wIntegral = 0;
  1745. PID_ConstantPower.wIntegral = 0;
  1746. }
  1747. //控制参数输入值计算
  1748. void MC_CalParam_Cal(MC_WorkMode_Struct_t p_MC_WorkMode, \
  1749. ADC_SensorData_Struct_t p_ADC_SensorData, \
  1750. MC_GearSt_Struct_t GearSt, \
  1751. TrueOrFalse_Flag_Struct_t Break_Flag, \
  1752. TrueOrFalse_Flag_Struct_t GearSensor_Flag, \
  1753. MC_CalParam_Struct_t* p_MC_CalParam)
  1754. {
  1755. MC_AssistRunMode_Struct_t MC_AssistRunMode_Temp;
  1756. static FlagStatus MC_AssistRunMode_ShiftFlag = RESET; //电机助力模式切换标志
  1757. //根据指拨信号、助力档位指令、刹车信号判断助力模式
  1758. MC_AssistRunMode_Temp = MC_JudgeAsistRunMode_Process(GearSt, (TrueOrFalse_Flag_Struct_t)(Break_Flag & GearSensor_Flag & Bike_Attitude.FellDown_flag), MC_RunInfo.Cadence, p_ADC_SensorData);//TRUE 0, FALSE 1
  1759. //发生助力模式切换时,清空变量
  1760. if(MC_AssistRunMode_Temp != p_MC_CalParam->AssistRunMode)
  1761. {
  1762. if(MC_AssistRunMode_ShiftFlag == RESET)
  1763. {
  1764. MC_AssistRunMode_Temp = MC_AssistRunMode_INVALID;
  1765. MC_AssistRunMode_ShiftFlag = SET;
  1766. }
  1767. }
  1768. //助力模式处理
  1769. switch(MC_AssistRunMode_Temp)
  1770. {
  1771. //指拨模式
  1772. case MC_AssistRunMode_GAS:
  1773. {
  1774. //计算FOC控制输入
  1775. *p_MC_CalParam = MC_AssistRunMode_Gas_Process(p_ADC_SensorData.GasSensor, MC_CadenceResult.torqueByCadence, (MC_GearSt_Struct_t)(GearSt & 0x0F));
  1776. //助力模式切换标志复位
  1777. MC_AssistRunMode_ShiftFlag = RESET;
  1778. break;
  1779. }
  1780. //推行模式
  1781. case MC_AssistRunMode_WALK:
  1782. {
  1783. //计算FOC控制输入
  1784. if(MC_WalkProcess_Param.IsEnterFlag == FALSE)
  1785. {
  1786. MC_WalkProcess_Param.MotorSpeedSetBegin = (uint32_t)MC_RunInfo.MotorSpeed << 5;
  1787. MC_WalkProcess_Param.IsEnterFlag = TRUE;
  1788. }
  1789. *p_MC_CalParam = MC_AssistRunMode_Walk_Process(p_MC_WorkMode);
  1790. //助力模式切换标志复位
  1791. MC_AssistRunMode_ShiftFlag = RESET;
  1792. break;
  1793. }
  1794. //踏频模式
  1795. case MC_AssistRunMode_CADENCE:
  1796. {
  1797. //计算FOC控制输入
  1798. if(MC_CadenceProcess_Param.IsEnterFlag == FALSE)
  1799. {
  1800. MC_CadenceProcess_Param.MotorSpeedSetBegin = (uint32_t)MC_RunInfo.MotorSpeed << 5;
  1801. MC_CadenceProcess_Param.IsEnterFlag = TRUE;
  1802. }
  1803. *p_MC_CalParam = MC_AssistRunMode_Cadence_Process(MC_CadenceResult, p_ADC_SensorData, GearSt, MC_ConfigParam1.GasCtrlMode_Flag);
  1804. //助力模式切换标志复位
  1805. MC_AssistRunMode_ShiftFlag = RESET;
  1806. break;
  1807. }
  1808. //力矩模式
  1809. case MC_AssistRunMode_TORQUE:
  1810. {
  1811. //计算FOC控制输入
  1812. *p_MC_CalParam = MC_AssistRunMode_Torque_Process(MC_CadenceResult, p_ADC_SensorData, GearSt, MC_ConfigParam1.GasCtrlMode_Flag);
  1813. //助力模式切换标志复位
  1814. MC_AssistRunMode_ShiftFlag = RESET;
  1815. break;
  1816. }
  1817. //空闲模式或存在故障
  1818. case MC_AssistRunMode_INVALID: default:
  1819. {
  1820. //停机处理
  1821. MC_MotorStop(&MC_StarFlag);
  1822. //更新母线电流零点值
  1823. CurrentReadingCalibration(&MC_ErrorCode);
  1824. //控制计算值初始化为默认值
  1825. p_MC_CalParam->AssistRunMode = MC_AssistRunMode_INVALID;
  1826. p_MC_CalParam->Foc_Flag = RESET;
  1827. p_MC_CalParam->Ref_Torque = 0;
  1828. p_MC_CalParam->Ref_Speed = 0;
  1829. break;
  1830. }
  1831. }
  1832. }
  1833. void MC_MotorStop(FlagStatus* StarFlag)
  1834. {
  1835. //关闭PWM输出
  1836. Pwm_Timer_Stop();
  1837. //FOC运算停止
  1838. FOC_Disable();
  1839. //控制参数归零
  1840. MC_ControlParam_Init();
  1841. //电机启动标志复位
  1842. *StarFlag = RESET;
  1843. }
  1844. void MC_MotorStar(FlagStatus* StarFlag)
  1845. {
  1846. if(*StarFlag == RESET)
  1847. {
  1848. //开启PWM输出
  1849. Enable_Pwm_Output();
  1850. //霍尔电角度初始化
  1851. HallSensorAngle_Init();
  1852. //FOC运算启动
  1853. FOC_Enable();
  1854. //电机启动标志置位
  1855. *StarFlag = SET;
  1856. }
  1857. }