|
@@ -0,0 +1,345 @@
|
|
|
+#include "enviolo_can.h"
|
|
|
+#include "can.h"
|
|
|
+#include "canAppl.h"
|
|
|
+#include "string.h"
|
|
|
+#include "CodePara.h"
|
|
|
+#include "AssistCurve.h"
|
|
|
+
|
|
|
+/********全局变量定义********/
|
|
|
+EnvioloGearInfo1_Struct_t EnvioloGearInfo1 = {0, 0, 0, 0, 0, 0, 0, 0};
|
|
|
+EnvioloGearInfo2_Struct_t EnvioloGearInfo2 = {0, 0, 0, 0, 0, 0, 0, 0};
|
|
|
+EnvioloConfigParams_Struct_t EnvioloConfigParams = {43, 20, 30, 90, 0, 119, 5, 0}; //默认前牙盘43T,后牙盘20T,最低踏频30rpm,最高踏频90rpm,车轮周长219cm,自动关机时间5min
|
|
|
+EnvioloControlParams_Struct_t EnvioloControlParams = {ENVIOLO_INACTIVE, 0, 0, 0, 0, 0}; //默认未激活,目标变速比0,目标踏频0
|
|
|
+GearBox_CanData_Struct_t GearBox_CanData = {FALSE, 0, 0, {0, }}; //CAN报文数据
|
|
|
+BOOL GearBox_ComIsOK_Flag = FALSE; //变速器通信状态
|
|
|
+uint32_t GearBox_ComTrigTime = 0; //变速器通信超时计数
|
|
|
+GearBox_OBC_SetMode_Struct_t GearBox_OBC_SetMode = {GEAR_MODE_NULL, 0, 0, 0, 0, 0, 0, 0}; //默认无效值,目标0
|
|
|
+GearBox_OBC_SetParams_Struct_t GearBox_OBC_SetParams = {9, 30, 120, 0, 0, 0, 0, 0}; //默认9档,最低踏频30rpm,最高踏频90rpm
|
|
|
+GearBox_Status_Struct_t GearBox_Status = GEAR_STATUS_OFFLINE; //变速器状态默认为初始化
|
|
|
+GearBox_CalFlag_Struct_t GearBox_CalFlag = GEAR_CAL_SUCCESS; //变速器默认校准完成
|
|
|
+uint16_t GearBox_RatioTable[24] = {500, 662, 824, 986, 1148, 1310, 1472, 1634, 1800, }; //变速器变速比与档位对照表,默认9速
|
|
|
+
|
|
|
+/********局部函数定义********/
|
|
|
+//发送Enviolo变速器配置参数
|
|
|
+void GearBox_Send_EnvioloConfigParams(EnvioloConfigParams_Struct_t* p_EnvioloConfigParams)
|
|
|
+{
|
|
|
+ uint8_t Data[8] = {0,};
|
|
|
+ memcpy(Data, (uint8_t*)&p_EnvioloConfigParams->FrontChain, 8);
|
|
|
+ CAN_SendData(ENVIOLO_CONFIG_ID, Data, 8);
|
|
|
+}
|
|
|
+
|
|
|
+//发送Enviolo变速器工作参数
|
|
|
+void GearBox_Send_EnvioloControlParams(EnvioloControlParams_Struct_t* p_EnvioloControlParams)
|
|
|
+{
|
|
|
+ uint8_t Data[8] = {0,};
|
|
|
+ //避免大小端和内存对齐问题,赋值处理
|
|
|
+ Data[0] = p_EnvioloControlParams->GearMode;
|
|
|
+ Data[1] = p_EnvioloControlParams->RatioMode_Data >> 8;
|
|
|
+ Data[2] = p_EnvioloControlParams->RatioMode_Data & 0xFF;
|
|
|
+ Data[3] = p_EnvioloControlParams->CadenceMode_Data >> 8;
|
|
|
+ Data[4] = p_EnvioloControlParams->CadenceMode_Data & 0xFF;
|
|
|
+ Data[5] = 0;
|
|
|
+ Data[6] = 0;
|
|
|
+ Data[7] = 0;
|
|
|
+ CAN_SendData(ENVIOLO_CONTROL_ID, Data, 8);
|
|
|
+}
|
|
|
+
|
|
|
+//根据变速器的变速比计算档位
|
|
|
+uint8_t GearBox_CalGearSt(uint16_t Ratio, uint8_t Num)
|
|
|
+{
|
|
|
+ uint8_t Result = 0;
|
|
|
+ if(Ratio <= 500)
|
|
|
+ Result = 1;
|
|
|
+ else if(Ratio >= 1800)
|
|
|
+ Result = Num;
|
|
|
+ else
|
|
|
+ Result = (Ratio - 500) / (1300 / Num) + 1;
|
|
|
+ return Result;
|
|
|
+}
|
|
|
+
|
|
|
+/*************************全局函数定义*******************************/
|
|
|
+
|
|
|
+//变速器CAN报文解析
|
|
|
+void GearBox_CanProcess(GearBox_CanData_Struct_t* CanData)
|
|
|
+{
|
|
|
+ if(CanData->RefreshFlag == TRUE)
|
|
|
+ {
|
|
|
+ //更新通信检测标志
|
|
|
+ GearBox_ComIsOK_Flag = TRUE;
|
|
|
+ GearBox_ComTrigTime = cp_ulSystickCnt;
|
|
|
+ //数据解析
|
|
|
+ if(CanData->ID == ID_ENVIOLO_TO_MC_1)
|
|
|
+ {
|
|
|
+ EnvioloGearInfo1.Pedal_Rpm = CanData->Data[0];
|
|
|
+ EnvioloGearInfo1.Actual_Ratio = CanData->Data[1];
|
|
|
+ EnvioloGearInfo1.Bike_Speed = CanData->Data[2];
|
|
|
+ EnvioloGearInfo1.Battery_Vol = CanData->Data[3];
|
|
|
+ EnvioloGearInfo1.Wheel_Rpm = (uint16_t)(CanData->Data[4] << 8) + CanData->Data[5];
|
|
|
+ EnvioloGearInfo1.StatusFlag.Flag = CanData->Data[6];
|
|
|
+ EnvioloGearInfo1.ErrorFlag.Flag = CanData->Data[7];
|
|
|
+ //变速器校准成功标志1
|
|
|
+ if(EnvioloGearInfo1.StatusFlag.StatusFlagBit.CaliSuccessFlag == 1)
|
|
|
+ {
|
|
|
+ GearBox_CalFlag = GEAR_CAL_SUCCESS;
|
|
|
+ }
|
|
|
+ //变速器校准成功标志0
|
|
|
+ else
|
|
|
+ {
|
|
|
+ GearBox_CalFlag = GEAR_CAL_NEED;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(CanData->ID == ID_ENVIOLO_TO_MC_2)
|
|
|
+ {
|
|
|
+ memcpy((uint8_t*)&EnvioloGearInfo2.PCB_Version_Major, (uint8_t*)CanData->Data, 8);
|
|
|
+ }
|
|
|
+ CanData->RefreshFlag = FALSE;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//发送仪表变速器参数
|
|
|
+void GearBox_Send_OBC_Params(GearBox_CalFlag_Struct_t CalFlag, GearBox_OBC_SetParams_Struct_t* p_GearBox_OBC_SetParams, uint8_t* p_EnvioloSoftVer)
|
|
|
+{
|
|
|
+ uint8_t Data[16] = {0,};
|
|
|
+ Data[0] = CalFlag;
|
|
|
+ memcpy(Data + 1, (uint8_t*)&p_GearBox_OBC_SetParams->GearNum, 3);
|
|
|
+ Data[4] = *p_EnvioloSoftVer;
|
|
|
+ SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5510, Data);
|
|
|
+}
|
|
|
+
|
|
|
+//初始化变速器工作参数
|
|
|
+void GearBox_Init(void)
|
|
|
+{
|
|
|
+ //根据仪表配置的变速器档位数量初始化变速比与档位对照表
|
|
|
+ do
|
|
|
+ {
|
|
|
+ uint16_t K;
|
|
|
+ if(GearBox_OBC_SetParams.GearNum < 5)
|
|
|
+ GearBox_OBC_SetParams.GearNum = 5;
|
|
|
+ else if(GearBox_OBC_SetParams.GearNum > 24)
|
|
|
+ GearBox_OBC_SetParams.GearNum = 24;
|
|
|
+ K = (18000 - 5000) / (GearBox_OBC_SetParams.GearNum - 1);
|
|
|
+ for(uint8_t i = 0 ; i < (sizeof(GearBox_RatioTable) >> 1); i++)
|
|
|
+ GearBox_RatioTable[i] = 0;
|
|
|
+ for(uint8_t i = 0; i < (GearBox_OBC_SetParams.GearNum - 1); i++)
|
|
|
+ {
|
|
|
+ GearBox_RatioTable[i] = 500 + (i * K) / 10;
|
|
|
+ }
|
|
|
+ GearBox_RatioTable[GearBox_OBC_SetParams.GearNum - 1] = 1800;
|
|
|
+ }while(0);
|
|
|
+
|
|
|
+ //初始化变速器参数
|
|
|
+ do
|
|
|
+ {
|
|
|
+ EnvioloConfigParams.FrontChain = MC_UpcInfo.stBikeInfo.uwNmFrontChainring; //前牙盘,小牙盘升速比2.4
|
|
|
+ EnvioloConfigParams.RearTeeth = MC_UpcInfo.stBikeInfo.uwNmBackChainring; //后牙盘
|
|
|
+ EnvioloConfigParams.WheelSize = MC_UpcInfo.stBikeInfo.uwWheelPerimeter + MC_UpcInfo.stBikeInfo.swWheelSizeAdjust - 100; //周长,偏移100cm
|
|
|
+ EnvioloConfigParams.CadenceMin = GearBox_OBC_SetParams.CadenceMin; //最低踏频
|
|
|
+ EnvioloConfigParams.CadenceMax = GearBox_OBC_SetParams.CadenceMax; //最高踏频
|
|
|
+ }while(0);
|
|
|
+}
|
|
|
+
|
|
|
+//变速器处理主函数
|
|
|
+void GearBox_Loop(void)
|
|
|
+{
|
|
|
+ //开机3s后变速器仍离线直接退出
|
|
|
+ if((cp_ulSystickCnt > 3000) && (GearBox_Status == GEAR_STATUS_OFFLINE))
|
|
|
+ {
|
|
|
+ MC_RunInfo.GearBoxInfo = GEAR_STATUS_OFFLINE;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //解析变速器CAN数据
|
|
|
+ GearBox_CanProcess(&GearBox_CanData);
|
|
|
+
|
|
|
+ //变速器在线检测
|
|
|
+ if(GearBox_ComIsOK_Flag == TRUE)
|
|
|
+ {
|
|
|
+ if((cp_ulSystickCnt - GearBox_ComTrigTime) > 1000) //变速器超时1s认为离线
|
|
|
+ {
|
|
|
+ GearBox_ComIsOK_Flag = FALSE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //变速器状态更新
|
|
|
+ switch(GearBox_Status)
|
|
|
+ {
|
|
|
+ case GEAR_STATUS_OFFLINE: //初始状态为离线模式,检测到变速器通讯正常,跳转为初始化模式
|
|
|
+ {
|
|
|
+ MC_RunInfo.GearBoxInfo = GearBox_Status;
|
|
|
+ //发送指令,激活变速器
|
|
|
+ do
|
|
|
+ {
|
|
|
+ static uint32_t SendPeriodCnt = 0;
|
|
|
+ if((cp_ulSystickCnt - SendPeriodCnt) > 200)
|
|
|
+ {
|
|
|
+ EnvioloControlParams.GearMode = ENVIOLO_ACTIVE;
|
|
|
+ GearBox_Send_EnvioloControlParams(&EnvioloControlParams);
|
|
|
+ SendPeriodCnt = cp_ulSystickCnt;
|
|
|
+ }
|
|
|
+ }while(0);
|
|
|
+
|
|
|
+ //变速器通讯正常,跳转初始化模式
|
|
|
+ if(GearBox_ComIsOK_Flag == TRUE)
|
|
|
+ {
|
|
|
+ GearBox_Status = GEAR_STATUS_INITIAL;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case GEAR_STATUS_INITIAL: //初始化模式,发送变速器状态给仪表
|
|
|
+ {
|
|
|
+ MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + 0x00;
|
|
|
+ //初始化完成,主动发送OBC变速器参数,发送5次。
|
|
|
+ do
|
|
|
+ {
|
|
|
+ static uint32_t SendPeriodCnt = 0;
|
|
|
+ static uint8_t SendCount = 0;
|
|
|
+ if(SendCount >= 5)
|
|
|
+ continue;
|
|
|
+ if((cp_ulSystickCnt - SendPeriodCnt) > 200)
|
|
|
+ {
|
|
|
+ GearBox_Send_OBC_Params(GearBox_CalFlag, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
|
|
|
+ SendPeriodCnt = cp_ulSystickCnt;
|
|
|
+ SendCount++;
|
|
|
+ }
|
|
|
+ }while(0);
|
|
|
+
|
|
|
+ //等待仪表设置变速器工作模式,跳转到对应的模式
|
|
|
+ if(GearBox_OBC_SetMode.Mode != GEAR_MODE_NULL)
|
|
|
+ {
|
|
|
+ if(GearBox_OBC_SetMode.Mode == GEAR_MODE_MANUAL) //仪表设置变速器进入手动模式
|
|
|
+ {
|
|
|
+ GearBox_Status = GEAR_STATUS_MANUAL;
|
|
|
+ }
|
|
|
+ else if((GearBox_OBC_SetMode.Mode == GEAR_MODE_AUTO) || (GearBox_OBC_SetMode.Mode == GEAR_MODE_CAL)) //仪表设置变速器进入自动模式或校准模式
|
|
|
+ {
|
|
|
+ GearBox_Status = GEAR_STATUS_AUTO;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case GEAR_STATUS_MANUAL: case GEAR_STATUS_AUTO: //手动、自动、校准,三种模式共用一个状态
|
|
|
+ {
|
|
|
+ //进入校准模式
|
|
|
+ if(GearBox_OBC_SetMode.Mode == GEAR_MODE_CAL)
|
|
|
+ {
|
|
|
+ EnvioloControlParams.GearMode = ENVIOLO_CAL_MODE;
|
|
|
+ EnvioloControlParams.RatioMode_Data = 0;
|
|
|
+ EnvioloControlParams.CadenceMode_Data = 0;
|
|
|
+ }
|
|
|
+ //进入手动模式
|
|
|
+ else if(GearBox_OBC_SetMode.Mode == GEAR_MODE_MANUAL)
|
|
|
+ {
|
|
|
+ GearBox_Status = GEAR_STATUS_MANUAL;
|
|
|
+ EnvioloControlParams.GearMode = ENVIOLO_MANUAL_MODE;
|
|
|
+ if(GearBox_OBC_SetMode.Value < 1)
|
|
|
+ EnvioloControlParams.RatioMode_Data = GearBox_RatioTable[0];
|
|
|
+ else if(GearBox_OBC_SetMode.Value > GearBox_OBC_SetParams.GearNum)
|
|
|
+ EnvioloControlParams.RatioMode_Data = GearBox_RatioTable[GearBox_OBC_SetParams.GearNum - 1];
|
|
|
+ else
|
|
|
+ EnvioloControlParams.RatioMode_Data = GearBox_RatioTable[GearBox_OBC_SetMode.Value - 1];
|
|
|
+ EnvioloControlParams.CadenceMode_Data = 0;
|
|
|
+ }
|
|
|
+ //进入自动模式
|
|
|
+ else if(GearBox_OBC_SetMode.Mode == GEAR_MODE_AUTO)
|
|
|
+ {
|
|
|
+ GearBox_Status = GEAR_STATUS_AUTO;
|
|
|
+ EnvioloControlParams.GearMode = ENVIOLO_AUTO_MODE;
|
|
|
+ if(GearBox_OBC_SetMode.Value < GearBox_OBC_SetParams.CadenceMin)
|
|
|
+ EnvioloControlParams.CadenceMode_Data = GearBox_OBC_SetParams.CadenceMin;
|
|
|
+ else if(GearBox_OBC_SetMode.Value > GearBox_OBC_SetParams.CadenceMax)
|
|
|
+ EnvioloControlParams.CadenceMode_Data = GearBox_OBC_SetParams.CadenceMax;
|
|
|
+ EnvioloControlParams.CadenceMode_Data = GearBox_OBC_SetMode.Value;
|
|
|
+ EnvioloControlParams.RatioMode_Data = 0;
|
|
|
+ }
|
|
|
+ //更新变速器运行信息,高5位表示变速器状态,低5位表示变速器当前档位
|
|
|
+ if(GearBox_ComIsOK_Flag == FALSE) //离线模式
|
|
|
+ {
|
|
|
+ MC_RunInfo.GearBoxInfo = GEAR_STATUS_OFFLINE;
|
|
|
+ }
|
|
|
+ else //在线时发送变速器信息
|
|
|
+ {
|
|
|
+ if(GearBox_Status == GEAR_STATUS_MANUAL) //手动模式低五位发送挡位
|
|
|
+ {
|
|
|
+ MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + (GearBox_CalGearSt(EnvioloGearInfo1.Actual_Ratio * 100, GearBox_OBC_SetParams.GearNum) & 0x1F);
|
|
|
+ }
|
|
|
+ else if(GearBox_Status == GEAR_STATUS_AUTO) //自动模式低五位发送变速比,单位0.1
|
|
|
+ {
|
|
|
+ MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + (EnvioloGearInfo1.Actual_Ratio & 0x1F);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //定时发送变速器控制指令
|
|
|
+ do
|
|
|
+ {
|
|
|
+ static uint32_t SendPeriodCnt = 0;
|
|
|
+ static uint8_t SendPluseCnt = 0;
|
|
|
+ static uint8_t SendCalCnt = 0;
|
|
|
+
|
|
|
+ if((cp_ulSystickCnt - SendPeriodCnt) > 1000)
|
|
|
+ {
|
|
|
+ if(GearBox_OBC_SetMode.Mode == GEAR_MODE_CAL) //校准指令只发送5次
|
|
|
+ {
|
|
|
+ if(SendCalCnt < 5)
|
|
|
+ {
|
|
|
+ GearBox_Send_EnvioloControlParams(&EnvioloControlParams); //发送控制指令
|
|
|
+ SendCalCnt++;
|
|
|
+ }
|
|
|
+ SendPluseCnt = 0;
|
|
|
+ }
|
|
|
+ else //手动和自动指令定时发送
|
|
|
+ {
|
|
|
+ if(SendPluseCnt < 1)
|
|
|
+ {
|
|
|
+ GearBox_Send_EnvioloConfigParams(&EnvioloConfigParams); //发送配置参数
|
|
|
+ SendPluseCnt++;
|
|
|
+ }
|
|
|
+ else if(SendPluseCnt < 5)
|
|
|
+ {
|
|
|
+ GearBox_Send_EnvioloControlParams(&EnvioloControlParams); //发送控制指令
|
|
|
+ SendPluseCnt++;
|
|
|
+ if(SendPluseCnt >= 5)
|
|
|
+ {
|
|
|
+ SendPluseCnt = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ SendCalCnt = 0;
|
|
|
+ }
|
|
|
+ SendPeriodCnt = cp_ulSystickCnt;
|
|
|
+ }
|
|
|
+ }while(0);
|
|
|
+ //校准模式定时发送踩踏提示
|
|
|
+ do
|
|
|
+ {
|
|
|
+ static uint32_t SendPeriodCnt = 0;
|
|
|
+ static uint8_t SendCount = 0xFF;
|
|
|
+ GearBox_CalFlag_Struct_t CalFlgTemp = GEAR_CAL_PEDAL;
|
|
|
+
|
|
|
+ if((cp_ulSystickCnt - SendPeriodCnt) > 1000)
|
|
|
+ {
|
|
|
+ //校准中发送踩踏提示
|
|
|
+ if(GearBox_CalFlag == GEAR_CAL_NEED)
|
|
|
+ {
|
|
|
+ CalFlgTemp = GEAR_CAL_PEDAL;
|
|
|
+ GearBox_Send_OBC_Params(CalFlgTemp, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
|
|
|
+ SendCount = 0;
|
|
|
+ }
|
|
|
+ //校准成功发送校准完成,发送5次
|
|
|
+ else if(GearBox_CalFlag == GEAR_CAL_SUCCESS)
|
|
|
+ {
|
|
|
+ CalFlgTemp = GEAR_CAL_SUCCESS;
|
|
|
+ if(SendCount < 5)
|
|
|
+ {
|
|
|
+ GearBox_Send_OBC_Params(CalFlgTemp, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
|
|
|
+ SendCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ SendPeriodCnt = cp_ulSystickCnt;
|
|
|
+ }
|
|
|
+ }while(0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|