motor_control.c 33 KB

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