motor_control.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214
  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. FlagStatus MC_StarFlag = RESET;
  34. /*************************局部函数定义***********************/
  35. //设定值线性变化处理
  36. uint16_t MC_DataSet_Linear_Process(uint16_t SetData, uint16_t PresentData, uint16_t AddCnt, uint16_t DecCnt)
  37. {
  38. int16_t ErrorData;
  39. uint16_t Result;
  40. ErrorData = SetData - PresentData;
  41. if(ErrorData > 0) //升速
  42. {
  43. if(ErrorData >= AddCnt)
  44. {
  45. Result = PresentData + AddCnt;
  46. }
  47. else
  48. {
  49. Result = SetData;
  50. }
  51. }
  52. else if(ErrorData < 0) //降速
  53. {
  54. if((-ErrorData) >= DecCnt)
  55. {
  56. Result = PresentData - DecCnt;
  57. }
  58. else
  59. {
  60. Result = SetData;
  61. }
  62. }
  63. else
  64. {
  65. Result = SetData;
  66. }
  67. return Result;
  68. }
  69. //随电压计算助力衰减系数
  70. uint16_t MC_Cal_K_ByVoltage(uint16_t Voltage, uint16_t DesignVol, uint16_t K_Voltage_Old)
  71. {
  72. uint32_t Cal_Temp;
  73. uint16_t SetVol_Th = 0;
  74. uint16_t ResetVol_Th = 0;
  75. uint16_t Result = 1024;
  76. //根据马达额定电压设定衰减点、衰减系数和恢复点
  77. switch(DesignVol)
  78. {
  79. case 24:
  80. {
  81. SetVol_Th = 33 * 7;
  82. ResetVol_Th = 36 * 7;
  83. Cal_Temp = (Voltage > (SetVol_Th * 100)) ? 1024 : (uint16_t)((uint32_t)(Voltage) / SetVol_Th);//Voltage单位0.001V, SetVol_Th单位0.1V, 系数放大100倍
  84. break;
  85. }
  86. case 36:
  87. {
  88. SetVol_Th = 33 * 10;
  89. ResetVol_Th = 36 * 10;
  90. Cal_Temp = (Voltage > SetVol_Th * 100) ? 1024 : (uint16_t)((uint32_t)(Voltage) / SetVol_Th);//Voltage单位0.001V, SetVol_Th单位0.1V, 系数放大100倍
  91. break;
  92. }
  93. case 48:
  94. {
  95. SetVol_Th = 33 * 13;
  96. ResetVol_Th = 36 * 13;
  97. Cal_Temp = (Voltage > SetVol_Th * 100) ? 1024 : (uint16_t)((uint32_t)(Voltage) / SetVol_Th);//Voltage单位0.001V, SetVol_Th单位0.1V, 系数放大100倍
  98. break;
  99. }
  100. default:
  101. {
  102. Cal_Temp = 100;
  103. break;
  104. }
  105. }
  106. Cal_Temp = Cal_Temp * Cal_Temp / 100 * Cal_Temp / 100 * Cal_Temp * 1024 / 10000; //f(x) = x^4
  107. Cal_Temp = (Cal_Temp < 820) ? 820 : Cal_Temp;
  108. //系数仅衰减
  109. if(Cal_Temp < K_Voltage_Old)
  110. {
  111. Result = Cal_Temp;
  112. }
  113. else
  114. {
  115. Result = K_Voltage_Old;
  116. }
  117. //高于设定恢复电压后,恢复系数
  118. if(Voltage > (ResetVol_Th * 100))
  119. {
  120. Result = 1024;
  121. }
  122. return(Result);
  123. }
  124. //随温度计算助力衰减系数
  125. uint16_t MC_Cal_K_ByTemperature(uint16_t CoilTemp, uint16_t AlarmTempTH)
  126. {
  127. uint32_t CalTemp;
  128. uint16_t Result = 1024;
  129. if(CoilTemp > AlarmTempTH)
  130. {
  131. CalTemp = (uint32_t)AlarmTempTH * AlarmTempTH * 1024;
  132. Result = (uint16_t)(CalTemp / CoilTemp / CoilTemp);
  133. }
  134. else
  135. {
  136. Result = 1024;
  137. }
  138. return(Result);
  139. }
  140. //助力模式判断处理
  141. MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(MC_SupportFlag_Struct_t GasCtrlMode, uint16_t GasSensorData, MC_GearSt_Struct_t GearSt, TrueOrFalse_Flag_Struct_t StopFlag)
  142. {
  143. MC_AssistRunMode_Struct_t MC_AssistRunMode_Result;
  144. if(MC_ErrorCode.Code == 0) // 无故障
  145. {
  146. if((GearSt != MC_GearSt_OFF) && (StopFlag == FALSE))
  147. {
  148. //进入指拨模式
  149. if((GasSensorData > 100) && (GasCtrlMode == MC_SUPPORT_ENABLE))
  150. {
  151. MC_AssistRunMode_Result = MC_AssistRunMode_GAS;
  152. }
  153. //退出指拨模式
  154. else if(GasSensorData < 50)
  155. {
  156. //进入推行模式
  157. if(GearSt == MC_GearSt_WALK)
  158. {
  159. MC_AssistRunMode_Result = MC_AssistRunMode_WALK;
  160. }
  161. else
  162. {
  163. //进入踏频模式
  164. if(((GearSt & 0xF0) != 0) && (GearSt != MC_GearSt_SMART))
  165. {
  166. MC_AssistRunMode_Result = MC_AssistRunMode_CADENCE;
  167. }
  168. //进入力矩模式
  169. else
  170. {
  171. MC_AssistRunMode_Result = MC_AssistRunMode_TORQUE;
  172. }
  173. }
  174. }
  175. }
  176. else
  177. {
  178. MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
  179. }
  180. Power12V_Driver_Process(SET);
  181. }
  182. else //存在故障
  183. {
  184. MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
  185. MC_ControlCode.GearSt = MC_GearSt_OFF;
  186. MC_ControlCode_Back.GearSt = (MC_GearSt_Struct_t)~MC_ControlCode.GearSt;
  187. #if 0
  188. Power12V_Driver_Process(RESET);
  189. #endif
  190. }
  191. return MC_AssistRunMode_Result;
  192. }
  193. /*指拨模式相关变量*/
  194. int32_t SpeedSetMiddle=0;
  195. int16_t SpeedSet = 0; // 速度设定值
  196. uint32_t accStep = 0; // 加速时间步进
  197. uint32_t decStep = 0; // 减速时间步进
  198. int16_t SpeedSetReal = 0; // 速度设定真实值
  199. /*指拨模式相关变量*/
  200. //指拨模式处理
  201. MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t SensorData, MC_GearSt_Struct_t GearSt)
  202. {
  203. int32_t Tmp;
  204. int16_t TorQueBySpd = 0;
  205. int32_t Ref_Speed_Temp;
  206. int16_t SpdMotorByIdc = 0;
  207. uint16_t SpeedMax = 235;
  208. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  209. Tmp = SensorData + 50 ; //加50偏移量,确保能达到最大值2048
  210. Tmp = Tmp > 2048 ? 2048 : Tmp;
  211. /*电机转速设定,根据指拨大小、车轮限速值和速比,换算*/
  212. SpeedSet = (Tmp * SpeedMax >> 11);//马达最高转速200rpm
  213. //超过限速值,设定电机转速为0
  214. if(MC_RunInfo.BikeSpeed > (8 * 10))
  215. {
  216. SpeedSet = 0;
  217. }
  218. SpeedSet = (SpeedSet > 0) ? SpeedSet : 0;
  219. SpeedSet = (SpeedSet < SpeedMax) ? SpeedSet : SpeedMax;
  220. //根据档位调整加速度
  221. switch (GearSt & 0x0F)
  222. {
  223. case 0x01:
  224. accStep = StepCalc(SpeedMax, 1, 6912);
  225. break;
  226. case 0x02:
  227. accStep = StepCalc(SpeedMax, 1, 5760);
  228. break;
  229. case 0x03:
  230. accStep = StepCalc(SpeedMax, 1, 4800);
  231. break;
  232. case 0x04:
  233. accStep = StepCalc(SpeedMax, 1, 4000);
  234. break;
  235. default:
  236. /*计算周期1ms, 加减速时间为 5.00s 加减速步进计算*/
  237. accStep = StepCalc(SpeedMax, 1, 5000);
  238. break;
  239. }
  240. /*减速步进*/
  241. decStep = StepCalc(SpeedMax, 1, 1000);
  242. /* 跟踪启动 */
  243. if(MC_CalParam.Foc_Flag == RESET)
  244. {
  245. if(MC_RunInfo.MotorSpeed > 100)
  246. {
  247. SpeedSetReal = MC_RunInfo.MotorSpeed;
  248. SpeedSetMiddle = SpeedSetReal << 16;
  249. }
  250. }
  251. //速度指令的加减速处理
  252. SpeedSetReal = accDecProcess(SpeedSet, accStep, decStep, &SpeedSetMiddle);
  253. //限制母线电流
  254. SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
  255. //电机速度闭环
  256. PID_MotorSpd.hLower_Limit_Output= -(MC_AssisParam.Gear_TURBO.Upper_Iq / 2);
  257. PID_MotorSpd.hUpper_Limit_Output= (MC_AssisParam.Gear_TURBO.Upper_Iq / 2);
  258. TorQueBySpd = PID_Regulator(SpeedSetReal, MC_RunInfo.MotorSpeed, &PID_MotorSpd);
  259. TorQueBySpd += SpdMotorByIdc;
  260. #if 1
  261. static uint16_t K_ByVoltage_Set_Old = 1024;
  262. uint16_t K_ByVoltage_Set;
  263. static uint16_t K_ByVoltage_Result;
  264. uint16_t K_ByTemperature_Set;
  265. static uint16_t K_ByTemperature_Result;
  266. //根据电压调节输出
  267. K_ByVoltage_Set = MC_Cal_K_ByVoltage(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, K_ByVoltage_Set_Old);//根据母线电压计算衰减比例,递减
  268. K_ByVoltage_Set_Old = K_ByVoltage_Set;
  269. K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
  270. //根据温度调节输出
  271. K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
  272. K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
  273. #else
  274. uint16_t K_ByVoltage_Result = 1024;
  275. uint16_t K_ByTemperature_Result = 1024;
  276. #endif
  277. //速度环控制量为0时停机,防止电机出现异响
  278. if(SpeedSetReal == 0)
  279. {
  280. MC_MotorStop(&MC_StarFlag);
  281. }
  282. else
  283. {
  284. //电机启动
  285. MC_MotorStar(&MC_StarFlag);
  286. }
  287. Ref_Speed_Temp = ((int32_t)TorQueBySpd * K_ByVoltage_Result) >> 10;
  288. Ref_Speed_Temp = ((int32_t)Ref_Speed_Temp * K_ByTemperature_Result) >> 10;
  289. p_MC_CalParam.Ref_Speed = (int16_t)(Ref_Speed_Temp);
  290. p_MC_CalParam.Foc_Flag = SET;
  291. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
  292. return (p_MC_CalParam);
  293. }
  294. //推行模式处理
  295. MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_WorkMode)
  296. {
  297. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  298. int16_t TorQueBySpd = 0;
  299. int32_t Ref_Speed_Temp;
  300. int16_t SpdMotorByIdc = 0;
  301. uint8_t StepData = 0;
  302. //配置模式,设定转速 = 最高转速
  303. if(p_MC_WorkMode == MC_WorkMode_Config)
  304. {
  305. StepData = (MC_MotorParam.Rate_Speed << 5) / 5000;//设计5s加速到最大值
  306. StepData = (StepData < 1) ? 1 : StepData;
  307. if(MC_WalkProcess_Param.MotorSpeedSetBigin < (MC_MotorParam.Rate_Speed << 5) * MC_WalkMode_Persent / 100 - 10)
  308. {
  309. MC_WalkProcess_Param.MotorSpeedSetBigin += StepData;
  310. }
  311. else if(MC_WalkProcess_Param.MotorSpeedSetBigin > (MC_MotorParam.Rate_Speed << 5) * MC_WalkMode_Persent / 100 + 10)
  312. {
  313. if(MC_WalkProcess_Param.MotorSpeedSetBigin > StepData)
  314. {
  315. MC_WalkProcess_Param.MotorSpeedSetBigin -= StepData;
  316. }
  317. else
  318. {
  319. MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
  320. }
  321. }
  322. else
  323. {
  324. MC_WalkProcess_Param.MotorSpeedSetBigin = (MC_MotorParam.Rate_Speed << 5 ) * MC_WalkMode_Persent / 100;
  325. }
  326. SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
  327. }
  328. //运行模式,设定转速 = 设置值
  329. else
  330. {
  331. uint8_t WalkMode_MotorSpeedSet = 0;
  332. //新增配置项,兼容旧电机
  333. WalkMode_MotorSpeedSet = (MC_ConfigParam1.WalkMode_MotorSpeedSet == 0) ? 135 : MC_ConfigParam1.WalkMode_MotorSpeedSet;
  334. if(MC_WalkProcess_Param.MotorSpeedSetBigin < (WalkMode_MotorSpeedSet << 5) - 10)
  335. {
  336. MC_WalkProcess_Param.MotorSpeedSetBigin += 1;
  337. }
  338. else if(MC_WalkProcess_Param.MotorSpeedSetBigin > (WalkMode_MotorSpeedSet << 5) + 10)
  339. {
  340. MC_WalkProcess_Param.MotorSpeedSetBigin -= 1;
  341. }
  342. else
  343. {
  344. MC_WalkProcess_Param.MotorSpeedSetBigin = WalkMode_MotorSpeedSet << 5;
  345. }
  346. SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
  347. }
  348. //速度环
  349. TorQueBySpd = PID_Regulator((MC_WalkProcess_Param.MotorSpeedSetBigin >> 5), MC_RunInfo.MotorSpeed, &PID_MotorSpd); // 电机速度闭环输出
  350. TorQueBySpd += SpdMotorByIdc;
  351. //限制车速低于设置值
  352. if(p_MC_WorkMode != MC_WorkMode_Config) //运行模式,推行限速
  353. {
  354. uint8_t WalkMode_SpeedLimit = 0;
  355. //新增配置项,兼容旧电机
  356. WalkMode_SpeedLimit = (MC_ConfigParam1.WalkMode_SpeedLimit == 0) ? 60 : MC_ConfigParam1.WalkMode_SpeedLimit;
  357. TorQueBySpd = (uint16_t)((uint32_t)(TorQueBySpd * Function_Linear_3Stage((WalkMode_SpeedLimit - 5), 0, (WalkMode_SpeedLimit - 5), 128, MC_RunInfo.BikeSpeed)) >> 10);
  358. if(MC_RunInfo.BikeSpeed > WalkMode_SpeedLimit)
  359. {
  360. MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
  361. MC_MotorStop(&MC_StarFlag);
  362. }
  363. else
  364. {
  365. //电机启动
  366. MC_MotorStar(&MC_StarFlag);
  367. }
  368. }
  369. else //配置模式不限速
  370. {
  371. //电机启动
  372. MC_MotorStar(&MC_StarFlag);
  373. }
  374. #if 1
  375. static uint16_t K_ByVoltage_Set_Old = 1024;
  376. uint16_t K_ByVoltage_Set;
  377. static uint16_t K_ByVoltage_Result;
  378. uint16_t K_ByTemperature_Set;
  379. static uint16_t K_ByTemperature_Result;
  380. //根据电压调节输出
  381. K_ByVoltage_Set = MC_Cal_K_ByVoltage(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, K_ByVoltage_Set_Old);//根据母线电压计算衰减比例,递减
  382. K_ByVoltage_Set_Old = K_ByVoltage_Set;
  383. K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
  384. //根据温度调节输出
  385. K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
  386. K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
  387. #else
  388. uint16_t K_ByVoltage_Result = 1024;
  389. uint16_t K_ByTemperature_Result = 1024;
  390. #endif
  391. #if 0
  392. //限制最大输出功率为250W
  393. static uint16_t IqsMax;
  394. if(MC_RunInfo.MotorSpeed < 10)
  395. {
  396. IqsMax = 1050;
  397. }
  398. else
  399. {
  400. IqsMax = 235000 / MC_RunInfo.MotorSpeed;
  401. }
  402. IqsMax = (IqsMax > 1050) ? 1050 : IqsMax;
  403. if(TorQueBySpd > IqsMax)
  404. {
  405. TorQueBySpd = IqsMax;
  406. }
  407. #elif 0
  408. if(TorQueBySpd > 450)
  409. {
  410. TorQueBySpd = 450;
  411. }
  412. #endif
  413. Ref_Speed_Temp = ((int32_t)TorQueBySpd * K_ByVoltage_Result) >> 10;
  414. Ref_Speed_Temp = ((int32_t)Ref_Speed_Temp * K_ByTemperature_Result) >> 10;
  415. p_MC_CalParam.Ref_Speed = (int16_t)(Ref_Speed_Temp);
  416. p_MC_CalParam.Foc_Flag = SET;
  417. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_WALK;
  418. return (p_MC_CalParam);
  419. }
  420. //踏频模式处理
  421. MC_CalParam_Struct_t MC_AssistRunMode_Cadence_Process(MC_GearSt_Struct_t GearSt)
  422. {
  423. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  424. //...插入踏频处理
  425. //电机启动
  426. MC_MotorStar(&MC_StarFlag);
  427. p_MC_CalParam.Foc_Flag = SET;
  428. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_CADENCE;
  429. return (p_MC_CalParam);
  430. }
  431. //力矩模式处理
  432. MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_GearSt_Struct_t GearSt, uint16_t SenorDataByCadence)
  433. {
  434. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  435. uint8_t TorqueAccStep = 0;//力矩上升斜率
  436. uint8_t TorqueDecStep = 0;//力矩下降斜率
  437. uint16_t TorqueStartData, TorqueStopData;//力矩启动值,力矩停机值
  438. int16_t Torque_Temp;
  439. int32_t Torque_Ref_Temp;
  440. static uint32_t TorqueStopDelayTimeCnt = 0; //低力矩停机计时
  441. uint16_t TorqueStopDelayTime;
  442. static int16_t IqRefByInPower; //限流计算结果
  443. static uint16_t CurrentLimitPresent; //限流实际值,做升降速处理
  444. uint16_t CurrentLimitSet; //限流设置值,不同助力档位更新
  445. static uint8_t TorqueRefEndUpdateCount = 0;
  446. #define SOFT_SATRT 1
  447. #if SOFT_SATRT
  448. static FlagStatus SoftStartFlag = SET;
  449. static uint16_t SoftStartDelayTimeCount = 0;
  450. uint16_t SoftStartDelayTime = 0;
  451. uint16_t SoftStartAcc = 0;
  452. #endif
  453. #if 1
  454. //踩踏力矩输入
  455. MC_TorqueProcess_Param.TorqueApp = SenorData;
  456. #elif 1
  457. //输入阶跃
  458. MC_TorqueProcess_Param.TorqueApp = 1000;
  459. //踏频设为启动
  460. MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
  461. MC_CadenceResult.IsStopFlag = FALSE;
  462. #elif 1
  463. //输入斜坡
  464. static uint32_t WaveTime_Zero = 0;
  465. static uint32_t Time_Enter = 0;
  466. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  467. {
  468. WaveTime_Zero = HAL_GetTick();
  469. }
  470. Time_Enter = HAL_GetTick();
  471. MC_TorqueProcess_Param.TorqueApp = RampWaveGenerate(WaveTime_Zero, 6000, 2100);
  472. //踏频设为启动
  473. MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
  474. MC_CadenceResult.IsStopFlag = FALSE;
  475. #elif 1
  476. //输入三角波,测试输出响应
  477. static uint32_t WaveTime_Zero = 0;
  478. static uint32_t Time_Enter = 0;
  479. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  480. {
  481. WaveTime_Zero = HAL_GetTick();
  482. }
  483. Time_Enter = HAL_GetTick();
  484. MC_TorqueProcess_Param.TorqueApp = TriangleWaveGenerate(WaveTime_Zero, 500, 1000 ,1500);
  485. //踏频设为启动
  486. MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
  487. MC_CadenceResult.IsStopFlag = FALSE;
  488. #elif 1
  489. //输入方波,测试输出响应
  490. static uint32_t WaveTime_Zero = 0;
  491. static uint32_t Time_Enter = 0;
  492. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  493. {
  494. WaveTime_Zero = HAL_GetTick();
  495. }
  496. Time_Enter = HAL_GetTick();
  497. MC_TorqueProcess_Param.TorqueApp = SquareWaveGenerate(WaveTime_Zero, 5000, 8000, 1500);
  498. //踏频设为启动
  499. MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
  500. MC_CadenceResult.IsStopFlag = FALSE;
  501. #endif
  502. //低力矩停机
  503. TorqueStopData = (MC_TorqueCorrectParam.StarData < 200) ? 100 : (MC_TorqueCorrectParam.StarData >> 1);
  504. if(MC_TorqueProcess_Param.TorqueApp >= (TorqueStopData))
  505. {
  506. TorqueStopDelayTimeCnt = HAL_GetTick();
  507. }
  508. else
  509. {
  510. if(MC_RunInfo.MotorSpeed > 200)
  511. {
  512. TorqueStopDelayTime = 218400 / MC_RunInfo.MotorSpeed; //60s / (电机转速 / 4.55 / 2.4) / 3,曲柄1/3圈
  513. }
  514. else
  515. {
  516. TorqueStopDelayTime = 1200;
  517. }
  518. TorqueStopDelayTime= (TorqueStopDelayTime < 500) ? 500 : TorqueStopDelayTime;
  519. if((HAL_GetTick() - TorqueStopDelayTimeCnt) > TorqueStopDelayTime)//超时1200ms
  520. {
  521. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  522. }
  523. }
  524. //启动值判断
  525. if(MC_RunInfo.BikeSpeed > 60)
  526. {
  527. TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
  528. : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
  529. : (MC_TorqueCorrectParam.StarData * 3 >> 2)));
  530. }
  531. else
  532. {
  533. TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
  534. : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
  535. : MC_TorqueCorrectParam.StarData));
  536. }
  537. if(MC_TorqueProcess_Param.TorqueApp >= TorqueStartData)
  538. {
  539. MC_TorqueProcess_Param.MotorStopLock_Flag = RESET;
  540. }
  541. //踏频反向或踏频停止停机
  542. if((MC_CadenceResult.Cadence_Dir == MC_Cadence_Backward) ||
  543. (MC_CadenceResult.IsStopFlag == TRUE)
  544. )
  545. {
  546. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  547. }
  548. //停机状态,延时处理
  549. if(MC_TorqueProcess_Param.MotorStopLock_Flag == SET)
  550. {
  551. if(MC_TorqueProcess_Param.TorqueRefEnd <= 7)
  552. {
  553. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  554. //停机处理
  555. MC_MotorStop(&MC_StarFlag);
  556. #if SOFT_SATRT
  557. //缓启动标志置位
  558. SoftStartFlag = SET;
  559. SoftStartDelayTimeCount = 0;
  560. #endif
  561. }
  562. else
  563. {
  564. MC_TorqueProcess_Param.TorqueRefEnd -= 7; //这里影响到停止踩踏后的断电时间
  565. MC_MotorStar(&MC_StarFlag);
  566. }
  567. }
  568. //力矩给定升降速处理
  569. else
  570. {
  571. /*调节助力比,使用经过踏频信号滤波处理的力矩值*/
  572. MC_TorqueProcess_Param.TorqueApp = SenorDataByCadence;
  573. //按照助力档位调节力矩输入值
  574. switch(GearSt)
  575. {
  576. case MC_GearSt_Torque_ECO:
  577. {
  578. //控制输入给定加速斜率
  579. if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN <= 90)
  580. {
  581. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt - 1;
  582. }
  583. else if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN >= 110)
  584. {
  585. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt + 1;
  586. }
  587. else
  588. {
  589. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt;
  590. }
  591. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  592. //控制输入给定减速斜率
  593. TorqueDecStep = MC_AssisParam.Gear_ECO.DecCnt;
  594. //随力矩输入调节助力比
  595. 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);
  596. //根据助力增益调节助力比
  597. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_ECO.Assist_K_GAIN / 100;
  598. //给定下限
  599. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_ECO.Lower_Iq) ? MC_AssisParam.Gear_ECO.Lower_Iq : Torque_Temp;
  600. //给定上限
  601. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_ECO.Upper_Iq) ? MC_AssisParam.Gear_ECO.Upper_Iq : Torque_Temp;
  602. //限流参数设置
  603. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  604. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  605. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_ECO.Upper_Iq); //Lower Limit for Output limitation
  606. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  607. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_ECO.Upper_Iq << 10); // 放大1024
  608. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  609. break;
  610. }
  611. case MC_GearSt_Torque_NORM:
  612. {
  613. //控制输入给定加速斜率
  614. if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN <= 90)
  615. {
  616. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt - 1;
  617. }
  618. else if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN >= 110)
  619. {
  620. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt + 1;
  621. }
  622. else
  623. {
  624. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt;
  625. }
  626. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  627. //控制输入给定减速斜率
  628. TorqueDecStep = MC_AssisParam.Gear_NORM.DecCnt;
  629. //随力矩输入调节助力比
  630. 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);
  631. //根据助力增益调节助力比
  632. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_NORM.Assist_K_GAIN / 100;
  633. //给定下限
  634. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_NORM.Lower_Iq) ? MC_AssisParam.Gear_NORM.Lower_Iq : Torque_Temp;
  635. //给定上限
  636. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_NORM.Upper_Iq) ? MC_AssisParam.Gear_NORM.Upper_Iq : Torque_Temp;
  637. //限流参数设置
  638. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
  639. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  640. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_NORM.Upper_Iq); //Lower Limit for Output limitation
  641. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  642. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_NORM.Upper_Iq << 10); // 放大1024
  643. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  644. break;
  645. }
  646. case MC_GearSt_Torque_SPORT:
  647. {
  648. //控制输入给定加速斜率
  649. if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN <= 90)
  650. {
  651. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt - 1;
  652. }
  653. else if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN >= 110)
  654. {
  655. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt + 1;
  656. }
  657. else
  658. {
  659. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt;
  660. }
  661. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  662. //控制输入给定减速斜率
  663. TorqueDecStep = MC_AssisParam.Gear_SPORT.DecCnt;
  664. //随力矩输入调节助力比
  665. 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);
  666. //根据助力增益调节助力比
  667. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SPORT.Assist_K_GAIN / 100;
  668. //给定下限
  669. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SPORT.Lower_Iq) ? MC_AssisParam.Gear_SPORT.Lower_Iq : Torque_Temp;
  670. //给定上限
  671. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SPORT.Upper_Iq) ? MC_AssisParam.Gear_SPORT.Upper_Iq : Torque_Temp;
  672. //限流参数设置
  673. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  674. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  675. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SPORT.Upper_Iq); //Lower Limit for Output limitation
  676. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  677. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SPORT.Upper_Iq << 10); // 放大1024
  678. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  679. break;
  680. }
  681. case MC_GearSt_Torque_TURBO:
  682. {
  683. //控制输入给定加速斜率
  684. if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN <= 90)
  685. {
  686. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt - 1;
  687. }
  688. else if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN >= 110)
  689. {
  690. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt + 1;
  691. }
  692. else
  693. {
  694. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt;
  695. }
  696. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  697. //控制输入给定减速斜率
  698. TorqueDecStep = MC_AssisParam.Gear_TURBO.DecCnt;
  699. //随力矩输入调节助力比
  700. 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);
  701. //根据助力增益调节助力比
  702. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_TURBO.Assist_K_GAIN / 100;
  703. //给定下限
  704. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_TURBO.Lower_Iq) ? MC_AssisParam.Gear_TURBO.Lower_Iq : Torque_Temp;
  705. //给定上限
  706. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
  707. //限流参数设置
  708. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  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. break;
  715. }
  716. case MC_GearSt_SMART:
  717. {
  718. //控制输入给定加速斜率
  719. if(MC_ConfigParam1.UserAdjParam_SMART.StarModel_GAIN <= 90)
  720. {
  721. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt - 1;
  722. }
  723. else if(MC_ConfigParam1.UserAdjParam_SMART.StarModel_GAIN >= 110)
  724. {
  725. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt + 1;
  726. }
  727. else
  728. {
  729. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt;
  730. }
  731. TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
  732. //控制输入给定减速斜率
  733. TorqueDecStep = MC_AssisParam.Gear_SMART.DecCnt;
  734. //助力比控制系数
  735. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / (MC_AssisParam.Gear_SMART.TorqueApp_TH);
  736. //根据助力增益调节助力比
  737. Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SMART.Assist_K_GAIN / 100;
  738. //给定下限
  739. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SMART.Lower_Iq) ? MC_AssisParam.Gear_SMART.Lower_Iq : Torque_Temp;
  740. //给定上限
  741. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SMART.Upper_Iq) ? MC_AssisParam.Gear_SMART.Upper_Iq : Torque_Temp;
  742. //限流参数设置
  743. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  744. CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
  745. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SMART.Upper_Iq); //Lower Limit for Output limitation
  746. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  747. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SMART.Upper_Iq << 10); // 放大1024
  748. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  749. break;
  750. }
  751. default:
  752. {
  753. TorqueAccStep = 0;
  754. TorqueDecStep = 0;
  755. Torque_Temp = 0;
  756. break;
  757. }
  758. }
  759. //随车速调节助力比
  760. Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(0, 0, MC_ConfigParam1.SpeedLimit * 10, 52, MC_SpeedSensorData.Speed_Data)) >> 10);
  761. //助力输出
  762. MC_TorqueProcess_Param.TorqueRef = Torque_Temp;
  763. if(MC_TorqueProcess_Param.TorqueRef <= 0)
  764. {
  765. MC_TorqueProcess_Param.TorqueRef = 0;
  766. }
  767. //升降速曲线计算
  768. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10) ) //限速处理
  769. {
  770. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  771. {
  772. MC_TorqueProcess_Param.TorqueRefEnd += 1;
  773. }
  774. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  775. {
  776. MC_TorqueProcess_Param.TorqueRefEnd -= 1;
  777. }
  778. }
  779. else if( (Bike_Attitude.UpWardSlope_flag == TRUE)&&(MC_SpeedSensorData.Speed_Data < 100)) //上坡处理
  780. {
  781. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  782. {
  783. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  784. }
  785. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  786. {
  787. TorqueRefEndUpdateCount++;
  788. if(TorqueRefEndUpdateCount >=3)
  789. {
  790. TorqueRefEndUpdateCount = 0;
  791. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  792. }
  793. }
  794. }
  795. #if SOFT_SATRT
  796. else if(SoftStartFlag == SET) //启动处理
  797. {
  798. if(MC_ConfigParam1.StarModel == MC_StarMode_DYNAMIC) //强劲模式,无延迟
  799. {
  800. SoftStartDelayTimeCount = 0;
  801. SoftStartFlag = RESET;
  802. }
  803. else
  804. {
  805. if(MC_ConfigParam1.StarModel == MC_StarMode_SOFT) //柔和模式,延迟300ms
  806. {
  807. SoftStartDelayTime = 300; //启动处理延时300ms
  808. SoftStartAcc = 30; //30ms递增0.1倍
  809. }
  810. else //正常模式,延迟100ms
  811. {
  812. SoftStartDelayTime = 100; //启动处理延时100ms
  813. SoftStartAcc = 10; //10ms递增0.1倍
  814. }
  815. SoftStartDelayTimeCount++;
  816. if(SoftStartDelayTimeCount <= SoftStartDelayTime) // 缓启动过程,按照0.1倍率逐步增加加减速斜率
  817. {
  818. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  819. {
  820. if((SoftStartDelayTimeCount % (10 - SoftStartDelayTimeCount / SoftStartAcc)) == 0)
  821. {
  822. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  823. }
  824. }
  825. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  826. {
  827. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  828. }
  829. }
  830. else
  831. {
  832. SoftStartDelayTimeCount = 0;
  833. SoftStartFlag = RESET;
  834. }
  835. }
  836. }
  837. #endif
  838. else //正常骑行
  839. {
  840. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  841. {
  842. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  843. }
  844. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  845. {
  846. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  847. }
  848. }
  849. MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
  850. //限速点处理
  851. if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10 + 22) ) //限速值 + 2.2
  852. {
  853. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  854. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  855. //停机处理
  856. MC_MotorStop(&MC_StarFlag);
  857. }
  858. #if 0 //低于限速点启动电机
  859. else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam1.SpeedLimit) * 10))
  860. {
  861. MC_MotorStar(&MC_StarFlag);
  862. }
  863. #elif 1 //低于断电点即启动电机
  864. else
  865. {
  866. MC_MotorStar(&MC_StarFlag);
  867. }
  868. #endif
  869. }
  870. #if 1
  871. static uint16_t K_ByVoltage_Set_Old = 1024;
  872. uint16_t K_ByVoltage_Set;
  873. static uint16_t K_ByVoltage_Result;
  874. uint16_t K_ByTemperature_Set;
  875. static uint16_t K_ByTemperature_Result;
  876. //根据电压调节输出
  877. K_ByVoltage_Set = MC_Cal_K_ByVoltage(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, K_ByVoltage_Set_Old);//根据母线电压计算衰减比例,递减
  878. K_ByVoltage_Set_Old = K_ByVoltage_Set;
  879. K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
  880. //根据温度调节输出
  881. K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
  882. K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
  883. #else
  884. uint16_t K_ByVoltage_Result = 1024;
  885. uint16_t K_ByTemperature_Result = 1024;
  886. #endif
  887. //限流计算
  888. IqRefByInPower = PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
  889. Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
  890. Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
  891. Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
  892. p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
  893. p_MC_CalParam.Foc_Flag = SET;
  894. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_TORQUE;
  895. return (p_MC_CalParam);
  896. }
  897. /******************************全局函数定义*****************************/
  898. //传感器初始化
  899. void MC_SensorInit(void)
  900. {
  901. //霍尔传感器IO设置
  902. HallSensor_GPIO_Init();
  903. //霍尔电角度初始化
  904. HallSensorAngle_Init();
  905. //踏频传感器IO设置
  906. CadenceSensor_GPIO_Init();
  907. //速度传感器IO设置
  908. SpeedSensor_GPIO_Init();
  909. //刹车信号和Gear信号检测IO设置
  910. KeyInitial();
  911. //力矩传感器零点初值
  912. TorqueOffSetDefaultData_Init(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);
  913. //指拨零点初值
  914. GasSensorOffSet_Init(&GasSensor_OffSet, ADC1_Result[ADC1_RANK_GAS]);
  915. //ICM20600初始化
  916. ICM20600_initialize();
  917. if(ICM20600_OK_Flag == TRUE)
  918. {
  919. ICM20600_coefficientinitialize(RANGE_250_DPS, RANGE_2G, &ICM20600Sensor);
  920. }
  921. }
  922. //MC控制初始化
  923. void MC_Init(void)
  924. {
  925. //PID参数初始化
  926. PID_Init(MC_ConfigParam1.SerialNum);
  927. //助力参数初始化
  928. UpdateGearParam(MC_ConfigParam1.SerialNum);
  929. //三相电流零点校准
  930. SVPWM_3ShuntCurrentReadingCalibration(&MC_ErrorCode);
  931. //母线电流零点校准
  932. CurrentReadingCalibration(&MC_ErrorCode);
  933. //力矩传感器零点值处理
  934. TorqueOffSetData_Process(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);//145ms
  935. //智能档位初始化处理
  936. if(MC_ConfigParam1.NoPBU_Flag == MC_SUPPORT_ENABLE)
  937. {
  938. MC_ControlCode.GearSt = MC_GearSt_SMART;
  939. Update_MC_ControlCode_Back();
  940. }
  941. //12V驱动电源初始化
  942. Power12V_Driver_Init();
  943. //打开12V驱动电源
  944. Power12V_Driver_Process(SET);
  945. }
  946. //MC控制参数初始化
  947. void MC_ControlParam_Init(void)
  948. {
  949. //清除推行模式初始变量
  950. MC_WalkProcess_Param.IsEnterFlag = FALSE;
  951. MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
  952. //清除力矩模式初始变量
  953. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  954. MC_TorqueProcess_Param.TorqueApp = 0;
  955. MC_TorqueProcess_Param.TorqueRef = 0;
  956. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  957. //全局运算变量归零
  958. IqFdbFlt =0;
  959. IdFdbFlt = 0;
  960. VoltSquareFlt = 0;
  961. UqVoltFlt = 0;
  962. UdVoltFlt = 0;
  963. //PDI积分清零
  964. PID_Flux_InitStructure.wIntegral = 0;
  965. PID_Torque_InitStructure.wIntegral = 0;
  966. PID_Weak_InitStructure.wIntegral = 0;
  967. PID_IMax.wIntegral = 0;
  968. PID_MotorSpd.wIntegral = 0;
  969. PID_ConstantPower.wIntegral = 0;
  970. }
  971. //控制参数输入值计算
  972. void MC_CalParam_Cal(MC_WorkMode_Struct_t p_MC_WorkMode, \
  973. ADC_SensorData_Struct_t p_ADC_SensorData, \
  974. MC_GearSt_Struct_t GearSt, \
  975. TrueOrFalse_Flag_Struct_t Break_Flag, \
  976. TrueOrFalse_Flag_Struct_t GearSensor_Flag, \
  977. MC_CalParam_Struct_t* p_MC_CalParam)
  978. {
  979. MC_AssistRunMode_Struct_t MC_AssistRunMode_Temp;
  980. static FlagStatus MC_AssistRunMode_ShiftFlag = RESET; //电机助力模式切换标志
  981. //根据指拨信号、助力档位指令、刹车信号判断助力模式
  982. MC_AssistRunMode_Temp = MC_JudgeAsistRunMode_Process(MC_ConfigParam1.GasCtrlMode_Flag, p_ADC_SensorData.GasSensor, GearSt, (TrueOrFalse_Flag_Struct_t)(Break_Flag & GearSensor_Flag & Bike_Attitude.FellDown_flag));//TRUE 0, FALSE 1
  983. //发生助力模式切换时,清空变量
  984. if(MC_AssistRunMode_Temp != p_MC_CalParam->AssistRunMode)
  985. {
  986. if(MC_AssistRunMode_ShiftFlag == RESET)
  987. {
  988. MC_AssistRunMode_Temp = MC_AssistRunMode_INVALID;
  989. MC_AssistRunMode_ShiftFlag = SET;
  990. SpeedSetMiddle = 0; //指拨模式,清零速度中间量
  991. }
  992. }
  993. //助力模式处理
  994. switch(MC_AssistRunMode_Temp)
  995. {
  996. //指拨模式
  997. case MC_AssistRunMode_GAS:
  998. {
  999. //计算FOC控制输入
  1000. *p_MC_CalParam = MC_AssistRunMode_Gas_Process(p_ADC_SensorData.GasSensor, (MC_GearSt_Struct_t)(GearSt & 0x0F));
  1001. //助力模式切换标志复位
  1002. MC_AssistRunMode_ShiftFlag = RESET;
  1003. break;
  1004. }
  1005. //推行模式
  1006. case MC_AssistRunMode_WALK:
  1007. {
  1008. //计算FOC控制输入
  1009. if(MC_WalkProcess_Param.IsEnterFlag == FALSE)
  1010. {
  1011. MC_WalkProcess_Param.MotorSpeedSetBigin = (uint32_t)MC_RunInfo.MotorSpeed << 5;
  1012. MC_WalkProcess_Param.IsEnterFlag = TRUE;
  1013. }
  1014. *p_MC_CalParam = MC_AssistRunMode_Walk_Process(p_MC_WorkMode);
  1015. //助力模式切换标志复位
  1016. MC_AssistRunMode_ShiftFlag = RESET;
  1017. break;
  1018. }
  1019. //踏频模式
  1020. case MC_AssistRunMode_CADENCE:
  1021. {
  1022. //计算FOC控制输入
  1023. *p_MC_CalParam = MC_AssistRunMode_Cadence_Process(GearSt);
  1024. //助力模式切换标志复位
  1025. MC_AssistRunMode_ShiftFlag = RESET;
  1026. break;
  1027. }
  1028. //力矩模式
  1029. case MC_AssistRunMode_TORQUE:
  1030. {
  1031. //计算FOC控制输入
  1032. *p_MC_CalParam = MC_AssistRunMode_Torque_Process(p_ADC_SensorData.TorqueSensor, GearSt, MC_CadenceResult.torqueByCadence);
  1033. //助力模式切换标志复位
  1034. MC_AssistRunMode_ShiftFlag = RESET;
  1035. break;
  1036. }
  1037. //空闲模式或存在故障
  1038. case MC_AssistRunMode_INVALID: default:
  1039. {
  1040. //停机处理
  1041. MC_MotorStop(&MC_StarFlag);
  1042. //更新母线电流零点值
  1043. CurrentReadingCalibration(&MC_ErrorCode);
  1044. //控制计算值初始化为默认值
  1045. p_MC_CalParam->AssistRunMode = MC_AssistRunMode_INVALID;
  1046. p_MC_CalParam->Foc_Flag = RESET;
  1047. p_MC_CalParam->Ref_Torque = 0;
  1048. p_MC_CalParam->Ref_Speed = 0;
  1049. break;
  1050. }
  1051. }
  1052. }
  1053. void MC_MotorStop(FlagStatus* StarFlag)
  1054. {
  1055. //关闭PWM输出
  1056. Pwm_Timer_Stop();
  1057. //FOC运算停止
  1058. FOC_Disable();
  1059. //控制参数归零
  1060. MC_ControlParam_Init();
  1061. //电机启动标志复位
  1062. *StarFlag = RESET;
  1063. }
  1064. void MC_MotorStar(FlagStatus* StarFlag)
  1065. {
  1066. if(*StarFlag == RESET)
  1067. {
  1068. //开启PWM输出
  1069. Enable_Pwm_Output();
  1070. //霍尔电角度初始化
  1071. HallSensorAngle_Init();
  1072. //FOC运算启动
  1073. FOC_Enable();
  1074. //电机启动标志置位
  1075. *StarFlag = SET;
  1076. }
  1077. }