tasks.c 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061
  1. #include "tasks.h"
  2. #include "iwdg.h"
  3. #include "gpio.h"
  4. #include "tim.h"
  5. #include "can_process.h"
  6. #include "uart_process.h"
  7. #include "eeprom_24c02.h"
  8. #include "eeprom_flash.h"
  9. #include "adc.h"
  10. #include "hall_sensor.h"
  11. #include "torque_sensor.h"
  12. #include "gas_sensor.h"
  13. #include "math_tools.h"
  14. #include "remain_distance.h"
  15. #include "protect_check.h"
  16. #include "fault_check.h"
  17. #include "key_driver.h"
  18. #include "encrypt.h"
  19. #include "enviolo_can.h"
  20. #include "light_driver.h"
  21. #include "MC_Globals.h"
  22. #include "MC_FOC_Driver.h"
  23. /************************全局变量************************/
  24. TrueOrFalse_Flag_Struct_t IsInitFinish_Flag = FALSE;
  25. To_Te_SendStep IsSendDataToTE_Step = HANDSHAKE;
  26. /**************************局部函数定义*********************/
  27. /**************************全局函数定义*********************/
  28. //1ms任务处理函数
  29. void HAL_SYSTICK_Callback(void)
  30. {
  31. static uint16_t TimeCnt_5ms = 0;
  32. static uint16_t TimeCnt_10ms = 0;
  33. static uint16_t TimeCnt_50ms = 0;
  34. static uint16_t TimeCnt_100ms = 0;
  35. static uint16_t TimeCnt_200ms = 0;
  36. static uint16_t TimeCnt_1000ms = 0;
  37. if(IsInitFinish_Flag == FALSE)
  38. {
  39. return;
  40. }
  41. //踏频传感器采集及计算
  42. CadenceSensor_Process(&MC_CadenceResult, MC_ConfigParam1.StopTime, (MC_ConfigParam1.CadenceStarNum == 0) ? 2 : MC_ConfigParam1.CadenceStarNum, FALSE);
  43. //踏频传感器故障检测
  44. if(MC_WorkMode == MC_WorkMode_Run)
  45. {
  46. MC_Fault_CadenceSensor_Process(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);
  47. }
  48. //根据电机工作模式(MC_WorkMode)、力矩传感器和指拨AD值(ADC_SensorData)、控制档位(MC_ControlCode.GearSt)计算控制FOC输入值(MC_CalParam)
  49. MC_CalParam_Cal(MC_WorkMode, ADC_SensorData, MC_ControlCode.GearSt, IsBreakTrig_Flag, IsGearSensorTrig_Flag, &MC_CalParam);
  50. //更新控制参数备份值
  51. Update_MC_CalParam_Back();
  52. //动态更新力矩传感器零点值
  53. if(IsTorqueOffSetUpdateEnable == TRUE)
  54. {
  55. TorqueOffSetData_Present_Update1(&TorqueSensor_1_Param.Torque_OffSetData.PresentData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR_1], TorqueSensor_1_Param.Torque_Cal_K, &MC_ErrorCode);
  56. TorqueOffSetData_Present_Update2(&TorqueSensor_2_Param.Torque_OffSetData.PresentData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR_2], TorqueSensor_2_Param.Torque_Cal_K, &MC_ErrorCode);
  57. TorqueOffSetData_Present_Update3(&TorqueSensor_3_Param.Torque_OffSetData.PresentData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR_3], TorqueSensor_3_Param.Torque_Cal_K, &MC_ErrorCode);
  58. }
  59. //更新指拨零点值
  60. if(IsGasSensorConnectedFlag == TRUE)
  61. {
  62. GasSensorOffSetData_Update(&GasSensor_OffSet, ADC1_Result[ADC1_RANK_GAS], &MC_ErrorCode);
  63. }
  64. //ADC数据滑动滤波计算
  65. ADC_SensorData_Filt(ADC1_Result_Filt, ADC2_Result_Filt);
  66. //发送给TE的传感器数据采集
  67. MC_TE_SensorScan(&MC_TE_SensorData);
  68. //5ms任务
  69. TimeCnt_5ms++;
  70. if(TimeCnt_5ms >= 5)
  71. {
  72. TimeCnt_5ms = 0;
  73. }
  74. //10ms任务
  75. TimeCnt_10ms++;
  76. if(TimeCnt_10ms >= 10)
  77. {
  78. TimeCnt_10ms = 0;
  79. //计算整车传动比
  80. BikeRatioCal_Process(MC_RunInfo.MotorSpeed, MC_RunInfo.Cadence, MC_RunInfo.BikeSpeed, &Bike_RatioCalParam);
  81. }
  82. //50ms任务
  83. TimeCnt_50ms++;
  84. if(TimeCnt_50ms >= 50)
  85. {
  86. TimeCnt_50ms = 0;
  87. //计算TE同步时钟频率
  88. Cal_SyncClockFreq(&MC_TE_SyncClockFreqScan);
  89. }
  90. //100ms任务
  91. TimeCnt_100ms++;
  92. if(TimeCnt_100ms >= 100)
  93. {
  94. TimeCnt_100ms = 0;
  95. //踏频计算滑动均值滤波
  96. MC_RunInfo.Cadence = MovingAverageFilter(MC_CadenceResult.Cadence_Data, MC_Cadence_Array, sizeof(MC_Cadence_Array) / 2);
  97. }
  98. //200ms任务
  99. TimeCnt_200ms++;
  100. if(TimeCnt_200ms >= 200)
  101. {
  102. TimeCnt_200ms = 0;
  103. }
  104. //1000ms任务
  105. TimeCnt_1000ms++;
  106. if(TimeCnt_1000ms >= 1000)
  107. {
  108. TimeCnt_1000ms = 0;
  109. }
  110. }
  111. //CAN数据解析函数
  112. void CanRx_Process(void)
  113. {
  114. CAN_RxData_Process(&CAN_RxBuf_Struct_PBU, 500);
  115. CAN_RxData_Process(&CAN_RxBuf_Struct_BMS, 500);
  116. CAN_RxData_Process(&CAN_RxBuf_Struct_HMI, 500);
  117. CAN_RxData_Process(&CAN_RxBuf_Struct_CDL, 500);
  118. }
  119. //UART数据解析函数
  120. void UartRx_Process(void)
  121. {
  122. Uart_RxData_Process(&UART_RxBuff_Struct3, 500);
  123. }
  124. //MC运行信息更新
  125. void MC_RunInfo_Update(void)
  126. {
  127. static uint32_t PeriodTimeCnt = 0;
  128. if((HAL_GetTick() - PeriodTimeCnt) >= 200)
  129. {
  130. PeriodTimeCnt = HAL_GetTick();
  131. //计算电功率,额定功率高5位用于显示功率分频系数,低11位额定功率
  132. if((MC_MotorParam.Rate_Power >> 11) == 0) //旧程序未配
  133. {
  134. MC_RunInfo.Power = ((uint32_t)MC_RunInfo.BusCurrent) * 250 / (MC_ConfigParam1.CurrentLimit * 1000);
  135. }
  136. else //新程序高5位为显示最大功率分频系数,最大显示功率 = 配置额定功率 * 分频系数 / 32
  137. {
  138. MC_RunInfo.Power = ((uint32_t)MC_RunInfo.BusCurrent) * (((MC_MotorParam.Rate_Power & 0x07FF) * ((MC_MotorParam.Rate_Power >> 11) + 1)) >> 5) / (MC_ConfigParam1.CurrentLimit * 1000);
  139. }
  140. MC_RunInfo.Power = (MC_RunInfo.Power < 20) ? 0 : MC_RunInfo.Power;
  141. //更新踏频方向
  142. MC_RunInfo.CadenceDir = MC_CadenceResult.Cadence_Dir;
  143. //计算力矩值
  144. MC_RunInfo.Torque = ADC_SensorData.TorqueSensor / 28;
  145. //当前助力档位
  146. MC_RunInfo.GearSt = MC_ControlCode.GearSt;
  147. //当前灯开关
  148. MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
  149. //剩余电量
  150. MC_RunInfo.SOC = (DeviceOnLine_Status.Status_Bit.BMS_OffLine == 1) ? Battery_SocCal(&Battery_Info, &BatteryCellInfo, MC_RunInfo.SOC, MC_MotorParam.Rate_Voltage)
  151. : BMS_RunInfo.SOC;
  152. //续航里程
  153. MC_RunInfo.RemainDistance = (DeviceOnLine_Status.Status_Bit.BMS_OffLine == 1) ? 0xEEEE : RemainDis.remainDistance;
  154. //骑行总里程计算
  155. static uint32_t WheelTurnCount = 0;
  156. static FlagStatus RefreshFlag = RESET;
  157. if(MC_ConfigParam1.SpeedSignal == MC_SPEED_COMMUNICATION) //根据通信获取的车轮旋转周期计算
  158. {
  159. static uint32_t WheelTurnCount_Temp = 0;
  160. //运算周期是200ms,根据车轮旋转周期计算200ms内旋转的圈数,存在小数,放4096倍
  161. if(MC_SpeedSensorData.IsStopFlag == FALSE)
  162. {
  163. WheelTurnCount_Temp += 819200 / MC_SpeedSensorData.DiffTime_ms;
  164. MC_SpeedSensorData.WheelTurnCount = WheelTurnCount_Temp >> 12;
  165. }
  166. }
  167. else if(MC_ConfigParam1.SpeedSignal == MC_SPEED_CADENCE_CAL) //根据踏频计算
  168. {
  169. //车轮转过的圈数 = 踏频信号个数 / 120 * 2.4 * 前飞齿数 / 后飞齿数
  170. MC_SpeedSensorData.WheelTurnCount = MC_CadenceResult.TrigCount * MC_ConfigParam1.TeethNum_F / MC_ConfigParam1.TeethNum_B / 50;
  171. }
  172. else
  173. {
  174. //车轮转过的圈数在速度传感器中断已处理
  175. }
  176. if((MC_SpeedSensorData.WheelTurnCount - WheelTurnCount) >= (10000 / (MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj))) //0.1km车轮所需圈数
  177. {
  178. RefreshFlag = SET;
  179. WheelTurnCount = MC_SpeedSensorData.WheelTurnCount;
  180. }
  181. if(RefreshFlag == SET)
  182. {
  183. RefreshFlag = RESET;
  184. //更新骑行历史信息中ODO和TRIP里程
  185. MC_RideLog.ODO_Km++;
  186. #if 0 //总里程是否自动归零
  187. if(MC_RideLog.ODO_Km > 999999)
  188. {
  189. MC_RideLog.ODO_Km = 0;
  190. MC_RideLog.ODO_Time = 0;
  191. }
  192. #endif
  193. MC_RideLog.TRIP_Km++;
  194. if(MC_RideLog.TRIP_Km > 99999) //超过9999.9km清零
  195. {
  196. MC_RideLog.TRIP_Km = 0;
  197. MC_RideLog.TRIP_Time = 0;
  198. }
  199. //更新运行信息中里程信息
  200. MC_RunInfo.Ride_Km++;
  201. MC_RunInfo.ODO_Km = MC_RideLog.ODO_Km / 10;
  202. #if 1 //自动存储骑行里程
  203. static uint8_t SavePeriodCount = 0;
  204. SavePeriodCount++;
  205. if(SavePeriodCount >= 30)//存储周期为3km
  206. {
  207. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  208. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  209. SavePeriodCount = 0;
  210. }
  211. #endif
  212. }
  213. //骑行时间计算
  214. static uint8_t Period_1sCnt = 0;
  215. static uint8_t Period_1minCnt = 0;
  216. static uint16_t SavePeriod_Cnt = 0;
  217. if(MC_RunInfo.BikeSpeed >= 30)
  218. {
  219. Period_1sCnt++;
  220. if(Period_1sCnt >= 5) //运行周期为200ms,计时周期200 * 5 = 1s
  221. {
  222. Period_1sCnt = 0;
  223. SavePeriod_Cnt++;
  224. MC_RunInfo.Ride_Time++;
  225. Period_1minCnt++;
  226. }
  227. }
  228. else
  229. {
  230. Period_1sCnt = 0;
  231. }
  232. if(Period_1minCnt >= 60) //1min
  233. {
  234. Period_1minCnt = 0;
  235. //更新骑行历史信息中骑行时间
  236. MC_RideLog.ODO_Time++;
  237. #if 0 //时间是否自动归零
  238. MC_RideLog.ODO_Time = (MC_RideLog.ODO_Time > 599999) ? 0 : MC_RideLog.ODO_Time; //超过9999h59min,清零
  239. MC_RideLog.TRIP_Time = (MC_RideLog.TRIP_Time > 599999) ? 0 : MC_RideLog.TRIP_Time;//超过9999h59min,清零
  240. #endif
  241. MC_RideLog.TRIP_Time++;
  242. }
  243. //存储骑行总时间
  244. if(SavePeriod_Cnt >= 600) //累计骑行600s进行存储
  245. {
  246. SavePeriod_Cnt = 0;
  247. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  248. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  249. }
  250. //平均功耗
  251. MC_RunInfo.PowerPerKm = RemainDis.Power_per_km_result / 10;
  252. }
  253. }
  254. //调试信息更新
  255. void MC_DebugInfo_Update(void)
  256. {
  257. static uint32_t PeriodTimeCnt = 0;
  258. if((HAL_GetTick() - PeriodTimeCnt) >= 100)
  259. {
  260. PeriodTimeCnt = HAL_GetTick();
  261. MC_DebugInfo.SysFSM1 = MC_CalParam.AssistRunMode;
  262. MC_DebugInfo.SysFSM2 = FOC_Status;
  263. MC_DebugInfo.SysFSM3 = 0;
  264. MC_DebugInfo.SysFSM4 = 0;
  265. MC_DebugInfo.IdRef = Stat_Curr_q_d.qI_Component2;
  266. MC_DebugInfo.IqRef = Stat_Curr_q_d.qI_Component1;
  267. MC_DebugInfo.UdRef = Stat_Volt_q_d.qV_Component2;
  268. MC_DebugInfo.UqRef = Stat_Volt_q_d.qV_Component1;
  269. MC_DebugInfo.PedalTorquePer = MC_RunInfo.Torque;
  270. MC_DebugInfo.PedalTorqueAvg = 0;
  271. MC_DebugInfo.PedalTorqueByCad = MC_CadenceResult.torqueByCadence;
  272. MC_DebugInfo.IdFdb = IdFdbFlt >> 10;
  273. MC_DebugInfo.IqFdb = IqFdbFlt >> 10;
  274. MC_DebugInfo.AssistOut = (MC_CalParam.AssistRunMode == MC_AssistRunMode_TORQUE) ? MC_CalParam.Ref_Torque : MC_CalParam.Ref_Speed;
  275. }
  276. }
  277. //MC故障码发送
  278. void MC_SendErrorCode_Process(MC_ErrorCode_Struct_t ErrorCode)
  279. {
  280. static uint32_t PeriodTimeCnt = 0;
  281. if(IsSendDataToTE_Step == SENDUPDATA)
  282. {
  283. return;
  284. }
  285. if(ErrorCode.Code != 0x00000000)
  286. {
  287. if((HAL_GetTick() - PeriodTimeCnt) > 500)
  288. {
  289. PeriodTimeCnt = HAL_GetTick();
  290. SendData(ID_MC_BC, MODE_REPORT, 0x1104, (uint8_t*)&ErrorCode.Code);
  291. }
  292. }
  293. else
  294. {
  295. PeriodTimeCnt = HAL_GetTick();
  296. }
  297. }
  298. //MC主动发送运行信息
  299. void MC_SendRunInfo_Process(MC_WorkMode_Struct_t WorkMode)
  300. {
  301. static uint32_t PeriodTimeCnt = 0;
  302. if(WorkMode == MC_WorkMode_Config)
  303. {
  304. if((HAL_GetTick() - PeriodTimeCnt) >= 200)
  305. {
  306. SendData(ID_MC_BC, MODE_REPORT, 0x1020, (uint8_t*)&MC_RunInfo.BikeSpeed);
  307. PeriodTimeCnt = HAL_GetTick();
  308. }
  309. }
  310. else
  311. {
  312. PeriodTimeCnt = HAL_GetTick();
  313. }
  314. }
  315. //MC主动发送运行信息
  316. void MC_SendDebugInfo_Process(MC_WorkMode_Struct_t WorkMode)
  317. {
  318. static uint32_t PeriodTimeCnt = 0;
  319. if(WorkMode == MC_WorkMode_Debug)
  320. {
  321. if((HAL_GetTick() - PeriodTimeCnt) >= 200)
  322. {
  323. SendData(ID_MC_BC, MODE_REPORT, 0x1020, (uint8_t*)&MC_RunInfo.BikeSpeed);
  324. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBA20, (uint8_t*)&MC_DebugInfo.SysFSM1);
  325. PeriodTimeCnt = HAL_GetTick();
  326. }
  327. }
  328. else
  329. {
  330. PeriodTimeCnt = HAL_GetTick();
  331. }
  332. }
  333. //发给TE的传感器数据扫描
  334. void MC_TE_SensorScan(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData)
  335. {
  336. static GPIO_PinState Cadence_Hall_1;
  337. static GPIO_PinState Cadence_Hall_2;
  338. static GPIO_PinState Motor_Hall_A;
  339. static GPIO_PinState Motor_Hall_B;
  340. static GPIO_PinState Break;
  341. static GPIO_PinState SpeedSensor;
  342. static TrueOrFalse_Flag_Struct_t IsFirstEnterFalg = TRUE;
  343. GPIO_PinState GPIO_PinState_Temp;
  344. //初始化变量
  345. if(IsFirstEnterFalg == TRUE)
  346. {
  347. Cadence_Hall_1 = HAL_GPIO_ReadPin(CADENCE_1_GPIO_Port, CADENCE_1_Pin);
  348. Cadence_Hall_2 = HAL_GPIO_ReadPin(CADENCE_2_GPIO_Port, CADENCE_2_Pin);
  349. Motor_Hall_A = HAL_GPIO_ReadPin(HALL_A_GPIO_Port, HALL_A_Pin);
  350. Motor_Hall_B = HAL_GPIO_ReadPin(HALL_B_GPIO_Port, HALL_B_Pin);
  351. Break = HAL_GPIO_ReadPin(BREAK_LEFT_GPIO_Port, BREAK_LEFT_Pin);
  352. SpeedSensor = HAL_GPIO_ReadPin(SPEED_SENSOR_GPIO_Port, SPEED_SENSOR_Pin);
  353. p_MC_TE_SensorData->CadenceHall_1_Cnt = 0;
  354. p_MC_TE_SensorData->CadenceHall_2_Cnt = 0;
  355. p_MC_TE_SensorData->MotorHall_A_Cnt = 0;
  356. p_MC_TE_SensorData->MotorHall_B_Cnt = 0;
  357. p_MC_TE_SensorData->BreakTrgiCnt = 0;
  358. p_MC_TE_SensorData->SpeedSensorTrigCnt = 0;
  359. IsFirstEnterFalg = FALSE;
  360. }
  361. //ADC数据更新采集
  362. p_MC_TE_SensorData->AD_BusCurrent = ADC1_Result_Filt[ADC1_RANK_CURRENT];
  363. p_MC_TE_SensorData->AD_CoilTemp = ADC1_Result_Filt[ADC1_RANK_NTC_COIL];
  364. p_MC_TE_SensorData->AD_TE_Voltage = 2048;
  365. p_MC_TE_SensorData->AD_Torque = ADC1_Result_Filt[ADC1_RANK_TORQUE_SENSOR_1];
  366. //踏频霍尔1
  367. GPIO_PinState_Temp = HAL_GPIO_ReadPin(CADENCE_1_GPIO_Port, CADENCE_1_Pin);
  368. if(Cadence_Hall_1 != GPIO_PinState_Temp)
  369. {
  370. p_MC_TE_SensorData->CadenceHall_1_Cnt++;
  371. }
  372. Cadence_Hall_1 = GPIO_PinState_Temp;
  373. //踏频霍尔2
  374. GPIO_PinState_Temp = HAL_GPIO_ReadPin(CADENCE_2_GPIO_Port, CADENCE_2_Pin);
  375. if(Cadence_Hall_2 != GPIO_PinState_Temp)
  376. {
  377. p_MC_TE_SensorData->CadenceHall_2_Cnt++;
  378. }
  379. Cadence_Hall_2 = GPIO_PinState_Temp;
  380. //马达霍尔A
  381. GPIO_PinState_Temp = HAL_GPIO_ReadPin(HALL_A_GPIO_Port, HALL_A_Pin);
  382. if(Motor_Hall_A != GPIO_PinState_Temp)
  383. {
  384. p_MC_TE_SensorData->MotorHall_A_Cnt++;
  385. }
  386. Motor_Hall_A = GPIO_PinState_Temp;
  387. //马达霍尔B
  388. GPIO_PinState_Temp = HAL_GPIO_ReadPin(HALL_B_GPIO_Port, HALL_B_Pin);
  389. if(Motor_Hall_B != GPIO_PinState_Temp)
  390. {
  391. p_MC_TE_SensorData->MotorHall_B_Cnt++;
  392. }
  393. Motor_Hall_B = GPIO_PinState_Temp;
  394. //刹车
  395. GPIO_PinState_Temp = HAL_GPIO_ReadPin(BREAK_LEFT_GPIO_Port, BREAK_LEFT_Pin);
  396. if(Break != GPIO_PinState_Temp)
  397. {
  398. p_MC_TE_SensorData->BreakTrgiCnt++;
  399. }
  400. Break = GPIO_PinState_Temp;
  401. //速度传感器
  402. GPIO_PinState_Temp = HAL_GPIO_ReadPin(SPEED_SENSOR_GPIO_Port, SPEED_SENSOR_Pin);
  403. if(SpeedSensor != GPIO_PinState_Temp)
  404. {
  405. p_MC_TE_SensorData->SpeedSensorTrigCnt++;
  406. }
  407. SpeedSensor = GPIO_PinState_Temp;
  408. //同步时钟频率
  409. p_MC_TE_SensorData->SynC_Clock_Freq = 1000; //1000KHz
  410. }
  411. //发给TE的传感器数据处理
  412. void MC_TE_SensorData_Process(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData)
  413. {
  414. static uint32_t PeriodTimeCnt = 0;
  415. static uint16_t EnterCnt = 0;
  416. //数据发送
  417. if((HAL_GetTick() - PeriodTimeCnt) >= 500)
  418. {
  419. //计数超过20 * 500ms = 10s,进行一次清零
  420. EnterCnt++;
  421. if(EnterCnt >= 20)
  422. {
  423. if(MC_TE_SensorStatus.TE_ErrorCode.Status_Bit.BikeSpeed == 0)
  424. {
  425. MC_TE_SensorData.SpeedSensorTrigCnt = 0;
  426. }
  427. if(MC_TE_SensorStatus.TE_ErrorCode.Status_Bit.StopBreak == 0)
  428. {
  429. MC_TE_SensorData.BreakTrgiCnt = 0;
  430. }
  431. if(MC_TE_SensorStatus.TE_ErrorCode.Status_Bit.CadenseSensor_1 == 0)
  432. {
  433. MC_TE_SensorData.CadenceHall_1_Cnt = 0;
  434. }
  435. if(MC_TE_SensorStatus.TE_ErrorCode.Status_Bit.CadenseSensor_2 == 0)
  436. {
  437. MC_TE_SensorData.CadenceHall_2_Cnt = 0;
  438. }
  439. if(MC_TE_SensorStatus.TE_ErrorCode.Status_Bit.HallSensor_A == 0)
  440. {
  441. MC_TE_SensorData.MotorHall_A_Cnt = 0;
  442. }
  443. if(MC_TE_SensorStatus.TE_ErrorCode.Status_Bit.HallSensor_B == 0)
  444. {
  445. MC_TE_SensorData.MotorHall_B_Cnt = 0;
  446. }
  447. HAL_GPIO_TogglePin(SYC_IO_GPIO_Port, SYC_IO_Pin);
  448. EnterCnt = 0;
  449. }
  450. //发送
  451. if(IsSendDataToTE_Step == HANDSHAKE)//发送握手信息到TE,只发送一次
  452. {
  453. SendUartDataToTE(&UART_TxBuff_Struct3, 0x07FF, MODE_REPORT, 0x8800, (uint8_t*)NULL);
  454. IsSendDataToTE_Step = SENDSENSOR;
  455. }
  456. else if(IsSendDataToTE_Step == SENDSENSOR)//正常发送数据到TE
  457. {
  458. //发送指令,TE不控制12V电源
  459. static uint8_t Count = 0;
  460. uint8_t Data[1] = {0};
  461. if(Count++ <= 5)
  462. {
  463. SendUartDataToTE(&UART_TxBuff_Struct3, 0x07FF, MODE_WRITE, 0x1301, (uint8_t*)Data);
  464. HAL_Delay(10);
  465. }
  466. SendUartDataToTE(&UART_TxBuff_Struct3, 0x07FF, MODE_REPORT, 0x1014, (uint8_t*)&p_MC_TE_SensorData->AD_Torque);
  467. }
  468. PeriodTimeCnt = HAL_GetTick();
  469. }
  470. }
  471. //根据踏频和母线电流计算限流系数
  472. uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_Coil)
  473. {
  474. static uint32_t PeriodTimeCnt = 0;
  475. static uint32_t IdcFiltSum = 0;
  476. static uint8_t IdcFiltCnt = 0; //滤波输入值计算
  477. static uint16_t IdcFilt = 0; //滤波结果
  478. static uint16_t Limit_Cnt = 0; //限流计时值
  479. static uint16_t OK_Cnt = 0; //限流恢复计时值
  480. static FlagStatus LimitFlag = RESET;
  481. static uint8_t Result = 100;
  482. if((HAL_GetTick() - PeriodTimeCnt) >= 100)
  483. {
  484. PeriodTimeCnt = HAL_GetTick();
  485. //母线电流滤波
  486. IdcFiltSum += Current;
  487. IdcFiltCnt++;
  488. if(IdcFiltCnt >= 8)
  489. {
  490. IdcFilt = IdcFiltSum >> 3;
  491. IdcFiltCnt = 0;
  492. IdcFiltSum = 0;
  493. }
  494. //限流保护计时
  495. if((Cadence < 70) && (IdcFilt > 6000))
  496. {
  497. Limit_Cnt++;
  498. }
  499. else
  500. {
  501. Limit_Cnt = 0;
  502. }
  503. //限流恢复计时
  504. if(((Cadence > 70) || (IdcFilt < 5000)) && (T_Coil < 150))
  505. {
  506. OK_Cnt++;
  507. }
  508. else
  509. {
  510. OK_Cnt = 0;
  511. }
  512. //限流判断
  513. if(Limit_Cnt > 300)
  514. {
  515. Limit_Cnt = 0;
  516. LimitFlag = SET;
  517. }
  518. //限流恢复判断
  519. if(OK_Cnt > 100)
  520. {
  521. OK_Cnt = 0;
  522. LimitFlag = RESET;
  523. }
  524. //限流系数计算
  525. if(LimitFlag == SET)
  526. {
  527. if(Cadence < 70)
  528. {
  529. Result = 30 + Cadence;
  530. Result = (Result > 100) ? 100 : Result;
  531. }
  532. else
  533. {
  534. Result = 100;
  535. }
  536. }
  537. else
  538. {
  539. Result = 100;
  540. }
  541. }
  542. return Result;
  543. }
  544. //接收到关机指令处理
  545. void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
  546. {
  547. static FlagStatus SaveFlag = RESET;
  548. static uint32_t PeriodTimeCnt = 0;
  549. static uint8_t Count = 0;
  550. //关闭助力档位
  551. MC_ControlCode.GearSt = MC_GearSt_OFF;
  552. MC_ControlCode.LightSwitch = MC_LightSwitch_OFF;
  553. Update_MC_ControlCode_Back();
  554. LightDriver_Process(MC_ConfigParam2.MC_TailLight_Mode, MC_ConfigParam2.HeadLightVol, MC_ConfigParam2.TailLightVol, IsBreakTrig_Flag, MC_ControlCode.LightSwitch);
  555. #if 1 //存储到Flash,下次开机时从Flash取出转移到EEPROM
  556. if(SaveFlag == RESET)
  557. {
  558. MC_PowerOffBkp.ODO_Km = MC_RideLog.ODO_Km;
  559. MC_PowerOffBkp.ODO_Time = MC_RideLog.ODO_Time;
  560. MC_PowerOffBkp.Trip_Km = MC_RideLog.TRIP_Km;
  561. MC_PowerOffBkp.Trip_Time = MC_RideLog.TRIP_Time;
  562. MC_PowerOffBkp.Run_Time = MC_RunLog1.RunTime;
  563. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, (uint8_t*)&MC_PowerOffBkp.ODO_Km, 40);//写入掉电临时保存数据,写入前该区域需擦除为0xFF才能操作成功
  564. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, (uint8_t*)"FLAG", 4); //掉电存储的数据标志更新
  565. SaveFlag = SET;
  566. }
  567. #endif
  568. //发送关机就绪信号
  569. SendData(ID_MC_BC, MODE_REPORT, 0x1305, (uint8_t*)"READY");
  570. //等待关机
  571. if(ReturnEnable == TRUE)
  572. {
  573. return;
  574. }
  575. else
  576. {
  577. PeriodTimeCnt = HAL_GetTick();
  578. Count = 0;
  579. while(Count < 10)
  580. {
  581. if((HAL_GetTick() - PeriodTimeCnt) > 100)
  582. {
  583. PeriodTimeCnt = HAL_GetTick();
  584. Count++;
  585. #if DEBUG
  586. HAL_IWDG_Refresh(&hiwdg);
  587. #endif
  588. }
  589. }
  590. }
  591. }
  592. //CAN设备PBU、HMI、BMS通信状态检测处理
  593. void MC_CanRxCheck_Process(MC_SupportFlag_Struct_t NoPBU_Flag, MC_SupportFlag_Struct_t NoHMI_Flag, MC_WorkMode_Struct_t WorkMode, MC_GearSt_Struct_t* GearSt)
  594. {
  595. if(WorkMode == MC_WorkMode_Run) //不支持无PBU,且正常运行模式
  596. {
  597. if( NoPBU_Flag == MC_SUPPORT_DISABLE )
  598. {
  599. //PBU通信状态检测
  600. if(IsComOK_PBU.IsOK_Flag == TRUE)
  601. {
  602. if((HAL_GetTick() - IsComOK_PBU.OK_TrigTime) > 1000)
  603. {
  604. IsComOK_PBU.IsOK_Flag = FALSE;
  605. *GearSt = MC_GearSt_OFF;
  606. Update_MC_ControlCode_Back();
  607. DeviceOnLine_Status.Status_Bit.PBU_OffLine = 1;
  608. }
  609. else
  610. {
  611. DeviceOnLine_Status.Status_Bit.PBU_OffLine = 0;
  612. }
  613. }
  614. else
  615. {
  616. *GearSt = MC_GearSt_OFF;
  617. Update_MC_ControlCode_Back();
  618. DeviceOnLine_Status.Status_Bit.PBU_OffLine = 1;
  619. }
  620. //HMI通信状态检测
  621. if(NoHMI_Flag == MC_SUPPORT_ENABLE)
  622. {
  623. DeviceOnLine_Status.Status_Bit.HMI_OffLine = 0;
  624. }
  625. else
  626. {
  627. if(IsComOK_HMI.IsOK_Flag == TRUE)
  628. {
  629. if((HAL_GetTick() - IsComOK_HMI.OK_TrigTime) > 1000)
  630. {
  631. IsComOK_HMI.IsOK_Flag = FALSE;
  632. DeviceOnLine_Status.Status_Bit.HMI_OffLine = 1;
  633. }
  634. else
  635. {
  636. DeviceOnLine_Status.Status_Bit.HMI_OffLine = 0;
  637. }
  638. }
  639. else
  640. {
  641. DeviceOnLine_Status.Status_Bit.HMI_OffLine = 1;
  642. }
  643. }
  644. }
  645. //BMS通信状态检测
  646. if(IsComOK_BMS.IsOK_Flag == TRUE)
  647. {
  648. if((HAL_GetTick() - IsComOK_BMS.OK_TrigTime) > 5000)
  649. {
  650. IsComOK_BMS.IsOK_Flag = FALSE;
  651. DeviceOnLine_Status.Status_Bit.BMS_OffLine = 1;
  652. }
  653. else
  654. {
  655. DeviceOnLine_Status.Status_Bit.BMS_OffLine = 0;
  656. }
  657. }
  658. else
  659. {
  660. DeviceOnLine_Status.Status_Bit.BMS_OffLine = 1;
  661. }
  662. }
  663. }
  664. //UART设备TE通信状态检测处理
  665. void MC_UartRxCheck_Process(void)
  666. {
  667. //TE通信状态检测
  668. if(IsComOK_TE.IsOK_Flag == TRUE)
  669. {
  670. if((HAL_GetTick() - IsComOK_TE.OK_TrigTime) > 2000)
  671. {
  672. IsComOK_TE.IsOK_Flag = FALSE;
  673. }
  674. }
  675. }
  676. //运行总时间计算
  677. void MC_RunTime_Cal(uint32_t* p_Runtime)
  678. {
  679. static uint32_t PeriodTimeCnt = 0;
  680. static uint8_t SavePeriodCount = 0;
  681. if((HAL_GetTick()- PeriodTimeCnt) >= 60000)
  682. {
  683. PeriodTimeCnt = HAL_GetTick();
  684. (*p_Runtime)++;
  685. //存储运行总时间
  686. SavePeriodCount++;
  687. if(SavePeriodCount >= 10) //自动存储周期10min
  688. {
  689. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  690. SavePeriodCount = 0;
  691. }
  692. }
  693. }
  694. //设备授权校验
  695. void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t* p_ErrorCode)
  696. {
  697. uint32_t SendPeriodTimeCnt = 0;
  698. uint8_t Send_MAC_ID_Cmd_Count = 0;
  699. uint8_t Send_Code_Cmd_Count = 0;
  700. uint8_t CalCodeResult[12];
  701. uint8_t CheckResult = 0;
  702. uint16_t Send_CanID;
  703. uint16_t Send_MAC_ID_Cmd;
  704. uint16_t Send_Code_Cmd;
  705. uint8_t DeviceSerial = 0;
  706. //确定校验设备类型
  707. if(p_Device == &BMS_CheckInfo)
  708. {
  709. DeviceSerial = 1;
  710. }
  711. else if(p_Device == &PBU_CheckInfo)
  712. {
  713. DeviceSerial = 2;
  714. }
  715. if(p_Device == &HMI_CheckInfo)
  716. {
  717. DeviceSerial = 3;
  718. }
  719. //根据设备类型定义发送指令
  720. switch(DeviceSerial)
  721. {
  722. case 1://校验电池
  723. {
  724. p_ErrorCode->ERROR_Bit.Fault_BMS_Check = 1;
  725. Send_CanID = ID_MC_TO_BMS;
  726. Send_MAC_ID_Cmd = 0x3100;
  727. Send_Code_Cmd = 0x3200;
  728. break;
  729. }
  730. case 2://校验按键
  731. {
  732. p_ErrorCode->ERROR_Bit.Fault_PBU_Check = 1;
  733. Send_CanID = ID_MC_TO_BMS;
  734. Send_MAC_ID_Cmd = 0x5100;
  735. Send_Code_Cmd = 0x5200;
  736. break;
  737. }
  738. case 3://校验仪表
  739. {
  740. p_ErrorCode->ERROR_Bit.Fault_HMI_Check = 1;
  741. Send_CanID = ID_MC_TO_BMS;
  742. Send_MAC_ID_Cmd = 0x7100;
  743. Send_Code_Cmd = 0x7200;
  744. break;
  745. }
  746. default:break;
  747. }
  748. //查询MAC ID,计算校验码,并与查询的授权码比较
  749. Send_MAC_ID_Cmd_Count = 4;
  750. SendData(Send_CanID, MODE_READ, Send_MAC_ID_Cmd, (uint8_t*)NULL);
  751. SendPeriodTimeCnt = HAL_GetTick();
  752. while(Send_MAC_ID_Cmd_Count)
  753. {
  754. CanRx_Process();
  755. if(CheckArrayIs0(p_Device->MAC_ID, 12) != 0) //检查是否接收到ID
  756. {
  757. CheckCodeCal(p_Device->MAC_ID, Secret_Key, CalCodeResult);//根据接收的ID计算授权码
  758. Send_Code_Cmd_Count = 4;
  759. SendData(Send_CanID, MODE_READ, Send_Code_Cmd, (uint8_t*)NULL);
  760. SendPeriodTimeCnt = HAL_GetTick();
  761. while(Send_Code_Cmd_Count)
  762. {
  763. CanRx_Process();
  764. if(CheckArrayIs0(p_Device->CheckCode, 12) != 0) ////检查是否接收到授权码
  765. {
  766. if(strncmp((char*)p_Device->CheckCode, (char*)CalCodeResult, 12) == 0)
  767. {
  768. CheckResult = 1;
  769. }
  770. Send_MAC_ID_Cmd_Count = 0;
  771. Send_Code_Cmd_Count = 0;
  772. break;
  773. }
  774. else
  775. {
  776. if((HAL_GetTick() - SendPeriodTimeCnt) > 100)
  777. {
  778. SendData(Send_CanID, MODE_READ, Send_Code_Cmd, (uint8_t*)NULL);
  779. Send_Code_Cmd_Count--;
  780. SendPeriodTimeCnt = HAL_GetTick();
  781. }
  782. }
  783. //看门狗清零
  784. #if DEBUG
  785. HAL_IWDG_Refresh(&hiwdg);
  786. #endif
  787. }
  788. }
  789. else
  790. {
  791. if((HAL_GetTick() - SendPeriodTimeCnt) > 100)
  792. {
  793. SendData(Send_CanID, MODE_READ, Send_MAC_ID_Cmd, (uint8_t*)NULL);
  794. Send_MAC_ID_Cmd_Count--;
  795. SendPeriodTimeCnt = HAL_GetTick();
  796. }
  797. }
  798. //看门狗清零
  799. #if DEBUG
  800. HAL_IWDG_Refresh(&hiwdg);
  801. #endif
  802. }
  803. //根据设备类型输出结果
  804. switch(DeviceSerial)
  805. {
  806. case 1://校验电池
  807. {
  808. if(CheckResult == 1)
  809. {
  810. p_ErrorCode->ERROR_Bit.Fault_BMS_Check = 0;
  811. }
  812. else
  813. {
  814. p_ErrorCode->ERROR_Bit.Fault_BMS_Check = 1;
  815. MC_RunLog1.BMS_Check_FaultCnt++;
  816. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  817. }
  818. break;
  819. }
  820. case 2://校验按键
  821. {
  822. if(CheckResult == 1)
  823. {
  824. p_ErrorCode->ERROR_Bit.Fault_PBU_Check = 0;
  825. }
  826. else
  827. {
  828. p_ErrorCode->ERROR_Bit.Fault_PBU_Check = 1;
  829. MC_RunLog1.PBU_Check_FaultCnt++;
  830. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  831. }
  832. break;
  833. }
  834. case 3://校验仪表
  835. {
  836. if(CheckResult == 1)
  837. {
  838. p_ErrorCode->ERROR_Bit.Fault_HMI_Check = 0;
  839. }
  840. else
  841. {
  842. p_ErrorCode->ERROR_Bit.Fault_HMI_Check = 1;
  843. MC_RunLog1.HMI_Check_FaultCnt++;
  844. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  845. }
  846. break;
  847. }
  848. default:break;
  849. }
  850. }
  851. //计算TIM2 ETR采集频率
  852. void Cal_SyncClockFreq(uint16_t* Result)
  853. {
  854. uint16_t Count = 0;
  855. Count = __HAL_TIM_GET_COUNTER(&htim2);
  856. *Result = Count * 20 / 1000;//50ms内计数值,单位转换为KHz
  857. __HAL_TIM_SET_COUNTER(&htim2, 0);
  858. }
  859. //温度历史信息处理
  860. void MC_TemperatureLogProcess(void)
  861. {
  862. static uint32_t PeriodTimeCnt = 0;
  863. static uint16_t SavePeriodCnt = 0;
  864. static TrueOrFalse_Flag_Struct_t DataChangeFlag = FALSE;
  865. if(HAL_GetTick() < 10000) //开机前10s不处理
  866. {
  867. PeriodTimeCnt = HAL_GetTick();
  868. return;
  869. }
  870. if((HAL_GetTick() - PeriodTimeCnt) >= 5000) //判断周期5s
  871. {
  872. PeriodTimeCnt = HAL_GetTick();
  873. //PCB温度最小值
  874. if(MC_RunInfo.T_PCB < MC_RunLog1.T_PCB_Min)
  875. {
  876. MC_RunLog1.T_PCB_Min = MC_RunInfo.T_PCB;
  877. DataChangeFlag = TRUE;
  878. }
  879. //PCB温度最大值
  880. if(MC_RunInfo.T_PCB > MC_RunLog1.T_PCB_Max)
  881. {
  882. MC_RunLog1.T_PCB_Max = MC_RunInfo.T_PCB;
  883. DataChangeFlag = TRUE;
  884. }
  885. //绕组温度最小值
  886. if(MC_RunInfo.T_Coil < MC_RunLog1.T_Coil_Min)
  887. {
  888. MC_RunLog1.T_Coil_Min = MC_RunInfo.T_Coil;
  889. DataChangeFlag = TRUE;
  890. }
  891. //绕组温度最大值
  892. if(MC_RunInfo.T_Coil > MC_RunLog1.T_Coil_Max)
  893. {
  894. MC_RunLog1.T_Coil_Max = MC_RunInfo.T_Coil;
  895. DataChangeFlag = TRUE;
  896. }//MCU温度最小值
  897. if(MC_RunInfo.T_MCU < MC_RunLog1.T_MCU_Min)
  898. {
  899. MC_RunLog1.T_MCU_Min = MC_RunInfo.T_MCU;
  900. DataChangeFlag = TRUE;
  901. }
  902. //MCU温度最大值
  903. if(MC_RunInfo.T_MCU > MC_RunLog1.T_MCU_Max)
  904. {
  905. MC_RunLog1.T_MCU_Max = MC_RunInfo.T_MCU;
  906. DataChangeFlag = TRUE;
  907. }
  908. //自动存储
  909. SavePeriodCnt++;
  910. if((SavePeriodCnt > 12) && (DataChangeFlag == TRUE)) //1min
  911. {
  912. SavePeriodCnt = 0;
  913. DataChangeFlag = FALSE;
  914. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  915. }
  916. }
  917. }
  918. //无码表模式初始化处理
  919. void NoPBUMode_Ini( void )
  920. {
  921. static TrueOrFalse_Flag_Struct_t NoPBUModeIniFinishedFlag = FALSE;
  922. if(HAL_GetTick() > 3000)
  923. {
  924. if( NoPBUModeIniFinishedFlag== FALSE )
  925. {
  926. NoPBUModeIniFinishedFlag = TRUE;
  927. if(MC_ConfigParam1.NoPBU_Flag == MC_SUPPORT_ENABLE)
  928. {
  929. MC_ControlCode.GearSt = MC_GearSt_SMART;
  930. Update_MC_ControlCode_Back();
  931. }
  932. }
  933. }
  934. }
  935. //车辆传动比计算,运行周期10ms
  936. void BikeRatioCal_Process(uint16_t MotorSpeed, uint16_t Cadence, uint16_t BikeSpeed, Bike_RatioCal_Struct_t* p_Bike_RatioCal)
  937. {
  938. uint16_t AccCnt, DecCnt;
  939. //车辆静止或滑行时不计算
  940. if((BikeSpeed < 30) || ((BikeSpeed >= 30) && (MotorSpeed < 100) && (Cadence < 10)))
  941. {
  942. p_Bike_RatioCal->RatioPer = p_Bike_RatioCal->RatioDefault;
  943. p_Bike_RatioCal->RatioResult = p_Bike_RatioCal->RatioDefault;
  944. p_Bike_RatioCal->RatioFlt = p_Bike_RatioCal->RatioDefault;
  945. p_Bike_RatioCal->RatioFltSum = 0;
  946. return;
  947. }
  948. //根据车速、电机转速、踏频计算传动系数,系数 = 车速 / 电机转速 * 1024,其中车速单位为km/h,并放大了10倍
  949. p_Bike_RatioCal->RatioPer = (((uint32_t)BikeSpeed << 18) * 10) / ((((uint32_t)MotorSpeed << 8) > ((uint32_t)Cadence * 2795)) ? ((uint32_t)MotorSpeed << 8) : ((uint32_t)Cadence * 2795));
  950. //限制计算结果
  951. p_Bike_RatioCal->RatioPer = (p_Bike_RatioCal->RatioPer < 500) ? 500 : ((p_Bike_RatioCal->RatioPer > 8000) ? 8000 : p_Bike_RatioCal->RatioPer);
  952. //计算结果滤波
  953. p_Bike_RatioCal->RatioFltSum += ((p_Bike_RatioCal->RatioPer << 10) - p_Bike_RatioCal->RatioFltSum) >> 5;
  954. p_Bike_RatioCal->RatioFlt = p_Bike_RatioCal->RatioFltSum >> 10;
  955. //目标值计算
  956. #if 0
  957. AccCnt = p_Bike_RatioCal->TargetAcc;
  958. DecCnt = p_Bike_RatioCal->TargetDec;
  959. if(p_Bike_RatioCal->RatioFlt - p_Bike_RatioCal->RatioResult >= AccCnt)
  960. p_Bike_RatioCal->RatioResult += AccCnt;
  961. else if(p_Bike_RatioCal->RatioResult - p_Bike_RatioCal->RatioFlt >= DecCnt)
  962. p_Bike_RatioCal->RatioResult -= DecCnt;
  963. else
  964. p_Bike_RatioCal->RatioResult = p_Bike_RatioCal->RatioFlt;
  965. #else
  966. p_Bike_RatioCal->RatioResult = p_Bike_RatioCal->RatioFlt;
  967. #endif
  968. }
  969. /**************************全局函数定义结束*****************/