motor_control.c 69 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976
  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. default:
  1487. {
  1488. TorqueAccStep = 0;
  1489. TorqueDecStep = 0;
  1490. Torque_Temp = 0;
  1491. break;
  1492. }
  1493. }
  1494. }
  1495. //随车速调节助力比
  1496. 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);
  1497. //助力输出
  1498. MC_TorqueProcess_Param.TorqueRef = Torque_Temp;
  1499. if(MC_TorqueProcess_Param.TorqueRef <= 0)
  1500. {
  1501. MC_TorqueProcess_Param.TorqueRef = 0;
  1502. }
  1503. //升降速曲线计算
  1504. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10) ) //限速处理
  1505. {
  1506. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1507. {
  1508. MC_TorqueProcess_Param.TorqueRefEnd += 1;
  1509. }
  1510. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1511. {
  1512. MC_TorqueProcess_Param.TorqueRefEnd -= 10;
  1513. }
  1514. }
  1515. else if( (Bike_Attitude.UpWardSlope_flag == TRUE)&&(MC_SpeedSensorData.Speed_Data < 100)) //上坡处理
  1516. {
  1517. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1518. {
  1519. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1520. }
  1521. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1522. {
  1523. TorqueRefEndUpdateCount++;
  1524. if(TorqueRefEndUpdateCount >=3)
  1525. {
  1526. TorqueRefEndUpdateCount = 0;
  1527. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1528. }
  1529. }
  1530. }
  1531. #if SOFT_SATRT
  1532. else if(SoftStartFlag == SET) //启动处理
  1533. {
  1534. if(MC_ConfigParam1.StarModel == MC_StarMode_DYNAMIC) //强劲模式,无延迟
  1535. {
  1536. SoftStartDelayTimeCount = 0;
  1537. SoftStartFlag = RESET;
  1538. }
  1539. else
  1540. {
  1541. if(MC_ConfigParam1.StarModel == MC_StarMode_SOFT) //柔和模式,延迟300ms
  1542. {
  1543. SoftStartDelayTime = 300; //启动处理延时300ms
  1544. SoftStartAcc = 30; //30ms递增0.1倍
  1545. }
  1546. else //正常模式,延迟100ms
  1547. {
  1548. SoftStartDelayTime = 100; //启动处理延时100ms
  1549. SoftStartAcc = 10; //10ms递增0.1倍
  1550. }
  1551. SoftStartDelayTimeCount++;
  1552. if(SoftStartDelayTimeCount <= SoftStartDelayTime) // 缓启动过程,按照0.1倍率逐步增加加减速斜率
  1553. {
  1554. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1555. {
  1556. if((SoftStartDelayTimeCount % (10 - SoftStartDelayTimeCount / SoftStartAcc)) == 0)
  1557. {
  1558. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1559. }
  1560. }
  1561. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1562. {
  1563. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1564. }
  1565. }
  1566. else
  1567. {
  1568. SoftStartDelayTimeCount = 0;
  1569. SoftStartFlag = RESET;
  1570. }
  1571. }
  1572. }
  1573. #endif
  1574. else //正常骑行
  1575. {
  1576. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  1577. {
  1578. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  1579. }
  1580. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  1581. {
  1582. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  1583. }
  1584. }
  1585. MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
  1586. //限速点处理
  1587. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10 + 22) ) //限速值 + 2.2
  1588. {
  1589. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  1590. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  1591. //停机处理
  1592. MC_MotorStop(&MC_StarFlag);
  1593. }
  1594. #if 0 //低于限速点启动电机
  1595. else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam1.SpeedLimit) * 10))
  1596. {
  1597. MC_MotorStar(&MC_StarFlag);
  1598. }
  1599. #elif 1 //低于断电点即启动电机
  1600. else
  1601. {
  1602. MC_MotorStar(&MC_StarFlag);
  1603. }
  1604. #endif
  1605. }
  1606. #if 1
  1607. static uint16_t K_ByVoltage_Set_Old = 1024;
  1608. uint16_t K_ByVoltage_Set;
  1609. static uint16_t K_ByVoltage_Result;
  1610. uint16_t K_ByTemperature_Set;
  1611. static uint16_t K_ByTemperature_Result;
  1612. //根据电压调节输出
  1613. K_ByVoltage_Set = MC_Cal_K_ByVoltage(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, K_ByVoltage_Set_Old);//根据母线电压计算衰减比例,递减
  1614. K_ByVoltage_Set_Old = K_ByVoltage_Set;
  1615. K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
  1616. //根据温度调节输出
  1617. K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
  1618. K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
  1619. #else
  1620. uint16_t K_ByVoltage_Result = 1024;
  1621. uint16_t K_ByTemperature_Result = 1024;
  1622. #endif
  1623. //限流计算
  1624. IqRefByInPower = PID_Regulator(CurrentLimitPresent * (MC_RunInfo.SOC <= 5 ? 5 : (MC_RunInfo.SOC >= 10 ? 10 : MC_RunInfo.SOC)) / 1000, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
  1625. Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
  1626. Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
  1627. Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
  1628. p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
  1629. p_MC_CalParam.Foc_Flag = SET;
  1630. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_TORQUE;
  1631. return (p_MC_CalParam);
  1632. }
  1633. /******************************全局函数定义*****************************/
  1634. //传感器初始化
  1635. void MC_SensorInit(void)
  1636. {
  1637. //霍尔传感器IO设置
  1638. HallSensor_GPIO_Init();
  1639. //霍尔电角度初始化
  1640. HallSensorAngle_Init();
  1641. //踏频传感器IO设置
  1642. CadenceSensor_GPIO_Init();
  1643. //速度传感器IO设置
  1644. SpeedSensor_GPIO_Init();
  1645. //刹车信号和Gear信号检测IO设置
  1646. KeyInitial();
  1647. //力矩传感器零点初值
  1648. TorqueOffSetDefaultData_Init(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);
  1649. //指拨零点初值
  1650. GasSensorOffSet_Init(&GasSensor_OffSet, ADC1_Result[ADC1_RANK_GAS]);
  1651. //ICM20600初始化
  1652. ICM20600_initialize();
  1653. if(ICM20600_OK_Flag == TRUE)
  1654. {
  1655. ICM20600_coefficientinitialize(RANGE_250_DPS, RANGE_2G, &ICM20600Sensor);
  1656. }
  1657. }
  1658. //MC控制初始化
  1659. void MC_Init(void)
  1660. {
  1661. //PID参数初始化
  1662. PID_Init(MC_ConfigParam1.SerialNum);
  1663. //助力参数初始化
  1664. UpdateGearParam(MC_ConfigParam1.SerialNum);
  1665. //三相电流零点校准
  1666. SVPWM_3ShuntCurrentReadingCalibration(&MC_ErrorCode);
  1667. //母线电流零点校准
  1668. CurrentReadingCalibration(&MC_ErrorCode);
  1669. //力矩传感器零点值处理
  1670. TorqueOffSetData_Process(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);//145ms
  1671. //智能档位初始化处理
  1672. if(MC_ConfigParam1.NoPBU_Flag == MC_SUPPORT_ENABLE)
  1673. {
  1674. MC_ControlCode.GearSt = MC_GearSt_SMART;
  1675. Update_MC_ControlCode_Back();
  1676. }
  1677. //12V驱动电源初始化
  1678. Power12V_Driver_Init();
  1679. //打开12V驱动电源
  1680. Power12V_Driver_Process(SET);
  1681. }
  1682. //MC控制参数初始化
  1683. void MC_ControlParam_Init(void)
  1684. {
  1685. //清除推行模式初始变量
  1686. MC_WalkProcess_Param.IsEnterFlag = FALSE;
  1687. MC_WalkProcess_Param.MotorSpeedSetBegin = 0;
  1688. //清除力矩模式初始变量
  1689. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  1690. MC_TorqueProcess_Param.TorqueApp = 0;
  1691. MC_TorqueProcess_Param.TorqueRef = 0;
  1692. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  1693. //清除踏频模式初始变量
  1694. MC_CadenceProcess_Param.MotorStopLock_Flag = SET;
  1695. MC_CadenceProcess_Param.CadenceInput = 0;
  1696. MC_CadenceProcess_Param.IsEnterFlag = FALSE;
  1697. MC_CadenceProcess_Param.MotorSpeedSetBegin = 0;
  1698. //全局运算变量归零
  1699. IqFdbFlt =0;
  1700. IdFdbFlt = 0;
  1701. VoltSquareFlt = 0;
  1702. UqVoltFlt = 0;
  1703. UdVoltFlt = 0;
  1704. //PDI积分清零
  1705. PID_Flux_InitStructure.wIntegral = 0;
  1706. PID_Torque_InitStructure.wIntegral = 0;
  1707. PID_Weak_InitStructure.wIntegral = 0;
  1708. PID_IMax.wIntegral = 0;
  1709. PID_MotorSpd.wIntegral = 0;
  1710. PID_ConstantPower.wIntegral = 0;
  1711. }
  1712. //控制参数输入值计算
  1713. void MC_CalParam_Cal(MC_WorkMode_Struct_t p_MC_WorkMode, \
  1714. ADC_SensorData_Struct_t p_ADC_SensorData, \
  1715. MC_GearSt_Struct_t GearSt, \
  1716. TrueOrFalse_Flag_Struct_t Break_Flag, \
  1717. TrueOrFalse_Flag_Struct_t GearSensor_Flag, \
  1718. MC_CalParam_Struct_t* p_MC_CalParam)
  1719. {
  1720. MC_AssistRunMode_Struct_t MC_AssistRunMode_Temp;
  1721. static FlagStatus MC_AssistRunMode_ShiftFlag = RESET; //电机助力模式切换标志
  1722. //根据指拨信号、助力档位指令、刹车信号判断助力模式
  1723. 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
  1724. //发生助力模式切换时,清空变量
  1725. if(MC_AssistRunMode_Temp != p_MC_CalParam->AssistRunMode)
  1726. {
  1727. if(MC_AssistRunMode_ShiftFlag == RESET)
  1728. {
  1729. MC_AssistRunMode_Temp = MC_AssistRunMode_INVALID;
  1730. MC_AssistRunMode_ShiftFlag = SET;
  1731. }
  1732. }
  1733. //助力模式处理
  1734. switch(MC_AssistRunMode_Temp)
  1735. {
  1736. //指拨模式
  1737. case MC_AssistRunMode_GAS:
  1738. {
  1739. //计算FOC控制输入
  1740. *p_MC_CalParam = MC_AssistRunMode_Gas_Process(p_ADC_SensorData.GasSensor, MC_CadenceResult.torqueByCadence, (MC_GearSt_Struct_t)(GearSt & 0x0F));
  1741. //助力模式切换标志复位
  1742. MC_AssistRunMode_ShiftFlag = RESET;
  1743. break;
  1744. }
  1745. //推行模式
  1746. case MC_AssistRunMode_WALK:
  1747. {
  1748. //计算FOC控制输入
  1749. if(MC_WalkProcess_Param.IsEnterFlag == FALSE)
  1750. {
  1751. MC_WalkProcess_Param.MotorSpeedSetBegin = (uint32_t)MC_RunInfo.MotorSpeed << 5;
  1752. MC_WalkProcess_Param.IsEnterFlag = TRUE;
  1753. }
  1754. *p_MC_CalParam = MC_AssistRunMode_Walk_Process(p_MC_WorkMode);
  1755. //助力模式切换标志复位
  1756. MC_AssistRunMode_ShiftFlag = RESET;
  1757. break;
  1758. }
  1759. //踏频模式
  1760. case MC_AssistRunMode_CADENCE:
  1761. {
  1762. //计算FOC控制输入
  1763. if(MC_CadenceProcess_Param.IsEnterFlag == FALSE)
  1764. {
  1765. MC_CadenceProcess_Param.MotorSpeedSetBegin = (uint32_t)MC_RunInfo.MotorSpeed << 5;
  1766. MC_CadenceProcess_Param.IsEnterFlag = TRUE;
  1767. }
  1768. *p_MC_CalParam = MC_AssistRunMode_Cadence_Process(MC_CadenceResult, p_ADC_SensorData, GearSt, MC_ConfigParam1.GasCtrlMode_Flag);
  1769. //助力模式切换标志复位
  1770. MC_AssistRunMode_ShiftFlag = RESET;
  1771. break;
  1772. }
  1773. //力矩模式
  1774. case MC_AssistRunMode_TORQUE:
  1775. {
  1776. //计算FOC控制输入
  1777. *p_MC_CalParam = MC_AssistRunMode_Torque_Process(MC_CadenceResult, p_ADC_SensorData, GearSt, MC_ConfigParam1.GasCtrlMode_Flag);
  1778. //助力模式切换标志复位
  1779. MC_AssistRunMode_ShiftFlag = RESET;
  1780. break;
  1781. }
  1782. //空闲模式或存在故障
  1783. case MC_AssistRunMode_INVALID: default:
  1784. {
  1785. //停机处理
  1786. MC_MotorStop(&MC_StarFlag);
  1787. //更新母线电流零点值
  1788. CurrentReadingCalibration(&MC_ErrorCode);
  1789. //控制计算值初始化为默认值
  1790. p_MC_CalParam->AssistRunMode = MC_AssistRunMode_INVALID;
  1791. p_MC_CalParam->Foc_Flag = RESET;
  1792. p_MC_CalParam->Ref_Torque = 0;
  1793. p_MC_CalParam->Ref_Speed = 0;
  1794. break;
  1795. }
  1796. }
  1797. }
  1798. void MC_MotorStop(FlagStatus* StarFlag)
  1799. {
  1800. //关闭PWM输出
  1801. Pwm_Timer_Stop();
  1802. //FOC运算停止
  1803. FOC_Disable();
  1804. //控制参数归零
  1805. MC_ControlParam_Init();
  1806. //电机启动标志复位
  1807. *StarFlag = RESET;
  1808. }
  1809. void MC_MotorStar(FlagStatus* StarFlag)
  1810. {
  1811. if(*StarFlag == RESET)
  1812. {
  1813. //开启PWM输出
  1814. Enable_Pwm_Output();
  1815. //霍尔电角度初始化
  1816. HallSensorAngle_Init();
  1817. //FOC运算启动
  1818. FOC_Enable();
  1819. //电机启动标志置位
  1820. *StarFlag = SET;
  1821. }
  1822. }