|
@@ -1,346 +1,348 @@
|
|
|
-#include "enviolo_can.h"
|
|
|
+锘�#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速
|
|
|
+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妗o紝鏈€浣庤笍棰�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变速器配置参数
|
|
|
+/********灞€閮ㄥ嚱鏁板畾涔�********/
|
|
|
+//鍙戦€丒nviolo鍙橀€熷櫒閰嶇疆鍙傛暟
|
|
|
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);
|
|
|
+ uint8_t Data[8] = {0,};
|
|
|
+ memcpy(Data, (uint8_t*)&p_EnvioloConfigParams->FrontChain, 8);
|
|
|
+ CAN_SendData(ENVIOLO_CONFIG_ID, Data, 8);
|
|
|
}
|
|
|
|
|
|
-//发送Enviolo变速器工作参数
|
|
|
+//鍙戦€丒nviolo鍙橀€熷櫒宸ヤ綔鍙傛暟
|
|
|
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 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);
|
|
|
}
|
|
|
|
|
|
-//根据变速器的变速比计算档位
|
|
|
+//鏍规嵁鍙橀€熷櫒鐨勫彉閫熸瘮璁$畻妗d綅
|
|
|
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;
|
|
|
+ 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报文解析
|
|
|
+//鍙橀€熷櫒CAN鎶ユ枃瑙f瀽
|
|
|
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;
|
|
|
- }
|
|
|
+ if(CanData->RefreshFlag == TRUE)
|
|
|
+ {
|
|
|
+ //鏇存柊閫氫俊妫€娴嬫爣蹇�
|
|
|
+ GearBox_ComIsOK_Flag = TRUE;
|
|
|
+ GearBox_ComTrigTime = cp_ulSystickCnt;
|
|
|
+ //鏁版嵁瑙f瀽
|
|
|
+ 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[5] = *p_EnvioloSoftVer;
|
|
|
- SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5510, Data);
|
|
|
+ uint8_t Data[16] = {0,};
|
|
|
+ Data[0] = CalFlag;
|
|
|
+ memcpy(Data + 1, (uint8_t*)&p_GearBox_OBC_SetParams->GearNum, 3);
|
|
|
+ Data[5] = *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);
|
|
|
+ //鏍规嵁浠�〃閰嶇疆鐨勫彉閫熷櫒妗d綅鏁伴噺鍒濆�鍖栧彉閫熸瘮涓庢。浣嶅�鐓ц〃
|
|
|
+ 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);
|
|
|
+ //鍒濆�鍖栧彉閫熷櫒鍙傛暟
|
|
|
+ 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);
|
|
|
+ //寮€鏈�3s鍚庡彉閫熷櫒浠嶇�绾跨洿鎺ラ€€鍑�
|
|
|
+ if((cp_ulSystickCnt > 3000) && (GearBox_Status == GEAR_STATUS_OFFLINE))
|
|
|
+ {
|
|
|
+ MC_RunInfo.GearBoxInfo = GEAR_STATUS_OFFLINE;
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- //变速器在线检测
|
|
|
- if(GearBox_ComIsOK_Flag == TRUE)
|
|
|
- {
|
|
|
- if((cp_ulSystickCnt - GearBox_ComTrigTime) > 1000) //变速器超时1s认为离线
|
|
|
- {
|
|
|
- GearBox_ComIsOK_Flag = FALSE;
|
|
|
- }
|
|
|
- }
|
|
|
+ //瑙f瀽鍙橀€熷櫒CAN鏁版嵁
|
|
|
+ GearBox_CanProcess(&GearBox_CanData);
|
|
|
|
|
|
- //变速器状态更新
|
|
|
- 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)
|
|
|
+ {
|
|
|
+ if((cp_ulSystickCnt - GearBox_ComTrigTime) > 1000) //鍙橀€熷櫒瓒呮椂1s璁や负绂荤嚎
|
|
|
+ {
|
|
|
+ GearBox_ComIsOK_Flag = FALSE;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- //变速器通讯正常,跳转初始化模式
|
|
|
- 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;
|
|
|
- else
|
|
|
- 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;
|
|
|
+ //鍙橀€熷櫒鐘舵€佹洿鏂�
|
|
|
+ switch(GearBox_Status)
|
|
|
+ {
|
|
|
+ case GEAR_STATUS_OFFLINE: //鍒濆�鐘舵€佷负绂荤嚎妯″紡锛屾�娴嬪埌鍙橀€熷櫒閫氳�姝e父锛岃烦杞�负鍒濆�鍖栨ā寮�
|
|
|
+ {
|
|
|
+ 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((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)
|
|
|
- {
|
|
|
+ //鍙橀€熷櫒閫氳�姝e父锛岃烦杞�垵濮嬪寲妯″紡
|
|
|
+ if(GearBox_ComIsOK_Flag == TRUE)
|
|
|
+ {
|
|
|
+ GearBox_Status = GEAR_STATUS_INITIAL;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case GEAR_STATUS_INITIAL: //鍒濆�鍖栨ā寮忥紝鍙戦€佸彉閫熷櫒鐘舵€佺粰浠�〃
|
|
|
+ {
|
|
|
+ MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + 0x00;
|
|
|
+ //鍒濆�鍖栧畬鎴愶紝涓诲姩鍙戦€丱BC鍙橀€熷櫒鍙傛暟锛屽彂閫�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;
|
|
|
+ else
|
|
|
+ EnvioloControlParams.CadenceMode_Data = GearBox_OBC_SetMode.Value;
|
|
|
+ EnvioloControlParams.RatioMode_Data = 0;
|
|
|
+ }
|
|
|
+ //鏇存柊鍙橀€熷櫒杩愯�淇℃伅锛岄珮5浣嶈〃绀哄彉閫熷櫒鐘舵€侊紝浣�5浣嶈〃绀哄彉閫熷櫒褰撳墠妗d綅
|
|
|
+ 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)
|
|
|
- {
|
|
|
+ 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;
|
|
|
- }
|
|
|
-
|
|
|
+ if(SendCount < 5)
|
|
|
+ {
|
|
|
+ GearBox_Send_OBC_Params(CalFlgTemp, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
|
|
|
+ SendCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ SendPeriodCnt = cp_ulSystickCnt;
|
|
|
+ }
|
|
|
+ }while(0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|