#ifndef __MAIN__H #define __MAIN__H #include #include "bsp.h" #define USE_FILE_SYSTEM 1 #define SDCARD_BLOCK_MAX (10000) #define OSC_CNT 40 #define SLOPE_CNT 20 #define SLOPE_VPT 1000 #define PRESS_VPT 3 #define FOLLOW_VPT 10 #define SHIELD_VPT 1.5 #define EME_STOP_VPT 4000 #define CENTRE_FRONT_CNT 0 #define CENTRE_FRONT_SUM 0 #define CENTRE_FRONT_VPT 0 #define CENTRE_VPT 2000 #define STOP_TIME_MS 500 #define CENT_TIME_MS 200 #define RUN_TIME_MS 0 #define EME_START_MS 0 #define EME_STOP_MS 2000 #define SLOPE_START_MS 3000 #define TRAVEL_TIME_MS 50000 #define PEAK 1430 //最高高度mm #define VALLEY 1000 //最低高度mm /*高度转应力表索引: 补偿表431点覆盖1000~1430mm(430个步进), h<1000时钳位到0防止越界*/ #define HEIGHT_TO_IDX(h) ((h) < 1000 ? 0 : ((h) - 1000)) #define BDC_STOP() (SET_TWIN_BIT0(),SET_TWIN_BIT1()) #define BDC_DOWN() (SET_TWIN_BIT0(),CLR_TWIN_BIT1()) #define BDC_UP() (SET_TWIN_BIT1(),CLR_TWIN_BIT0()) //#define BDC_STOP() Motor_Control(MOTOR_CMD_STOP) //#define BDC_UP() Motor_Control(MOTOR_CMD_FORWARD) //#define BDC_DOWN() Motor_Control(MOTOR_CMD_REVERSE) /*控制等级*/ typedef enum { LEVEL_1 = 1, // 一级 LEVEL_2 = 2, // 二级 LEVEL_3 = 3, // 三级 LEVEL_4 = 4, // 四级 LEVEL_5 = 5 // 五级 }ControlLevel_m; /*设备阈值*/ typedef struct{ int32_t Slope_VPT; int32_t Stop_VPT; int32_t LeftUpVPT;//左上设备阈值 int32_t LeftLowVPT;//左下设备阈值 int32_t RightUpVPT;//右上设备阈值 int32_t RightLowVPT;//右下设备阈值 int32_t LeftUpShieldVPT; //左上屏蔽阈值 int32_t LeftLowShieldVPT; //左下屏蔽阈值 int32_t RightUpShieldVPT; //右上屏蔽阈值 int32_t RightLowShieldVPT; //右下屏蔽阈值 int32_t LeftUp_Org_AdZero;//左上设备原始AD零点 int32_t LeftLow_Org_AdZero;//左下设备原始AD零点 int32_t RightUp_Org_AdZero;//右上设备原始AD零点 int32_t RightLow_Org_AdZero;//右下设备原始AD零点 }ADTrack_t; typedef struct{//电机参数 bool InitialFlag;//初始标志位 bool RestFlag; bool OverheatFlag;//过热标志: 收到过热帧后置true, 持续下降触发控制盒复位 bool CaliFlag; bool LoopOne;//循环一次标志位 int16_t Current_height;//当前高度mm(控制盒上报1000~1430) int16_t CaliNum;//标校数量 int32_t LU_HeightStress[431];//左上传感器对应高度应力 int32_t LL_HeightStress[431];//左下传感器对应高度应力 int32_t RU_HeightStress[431];//右上传感器对应高度应力 int32_t RL_HeightStress[431];//右下传感器对应高度应力 }MotorPara_t; /*数据读取状态机*/ typedef enum { READ_STATUS_IDLE, READ_STATUS_START, READ_STATUS_LEFTUP, READ_STATUS_WAIT_LEFTUP, READ_STATUS_LEFTLOW, READ_STATUS_WAIT_LEFTLOW, READ_STATUS_RIGHTUP, READ_STATUS_WAIT_RIGHTUP, READ_STATUS_RIGHTLOW, READ_STATUS_WAIT_RIGHTLOW, READ_STATUS_SUPPORT_CONT }ReadStatus_m; /*主程序状态机*/ typedef enum { APP_STATUS_IDLE, APP_STATUS_ON, APP_STATUS_OFF, APP_STATUS_START_BEEP, APP_STATUS_MOTOR_INIT, APP_STATUS_ZERO_MARKING, APP_STATUS_WAIT_MOTOR_INIT, APP_STATUS_WAIT_MOTOR_CALI_UP, APP_STATUS_WAIT_MOTOR_CALI_DOWN, APP_STATUS_WAIT_STEADY, APP_STATUS_END_BEEP, APP_STATUS_HEIGHT_CONTROL, APP_STATUS_POWER_RESET,//上电复位流程: 下降触发控制盒复位, 复位完成后编码器基准一致再进入校准 }AppStatus_m; typedef struct{ __IO uint16_t rPayLen; __IO bool HeaderFrame; __IO uint16_t RxLen; uint8_t RxBuff[10]; }Uart1Rx_t; typedef struct{ __IO uint16_t rPayLen; __IO bool HeaderFrame; __IO uint16_t RxLen; uint8_t RxBuff[4]; }Uart3Rx_t; typedef struct { AppStatus_m Status;//状态 ReadStatus_m RStatus; AppPara_T Para; Uart1Rx_t RxUart1Data; Uart3Rx_t RxUart3Data; ADTrack_t ADTrack; MotorPara_t MotorPara; uint32_t TD1mSDelayCnt; uint32_t Read1mSDelayCnt; uint32_t Uart1Delay1mSCnt; uint32_t Uart3RxTimeOut1mSCnt; uint32_t StopCollDelay1mSCnt; uint32_t RunCollDelay1mSCnt; uint32_t CentCollDelay1mSCnt; uint32_t EmergencyDelay1mSCnt; uint32_t SlopeCollDelay1mSCnt; uint32_t CailUp1mSCnt; uint32_t HeightContRolCnt; uint32_t RestStop1mSCnt;//复位停顿计时: 收到复位帧后先停止电机, 计时结束再下降触发复位 uint32_t PwRstStop1mSCnt;//上电复位到底停顿计时: 下降到底后先停止电机, 计时结束再继续下降触发复位 uint16_t PwRstNoChg1mSCnt;//上电复位下降中高度无变化计时: 持续1秒无变化判定到底 int16_t PwRstLastHeight;//上电复位下降中上一次高度值, 用于比较高度是否变化 int16_t PwRstRiseRef;//上电复位反弹判定参考高度: 只跟随下降/持平更新(只跟跌不跟涨), 高度较其反升>1cm判定碰撞 int16_t PwRstMinHeight;//上电复位下降过程历史最低高度: 确认到底仅限接近最低点, 停在高处=被障碍物/碰撞保护托住 bool PwRstHtSeen;//上电复位已收到首帧有效高度标志: 高度基准就绪后才启动到底检测(防止首帧误判反弹) uint8_t PwRstReboundCnt;//上电复位连续反弹计数: 首次反弹停1秒恢复下降观察, 再次反弹才转点动(到底确认时清零) uint16_t PwRstInch1mSCnt;//上电复位点动下降节奏计时: 反弹后改为脉冲式下降减小触底冲击 uint16_t PwRstInchLastHeight;//上电复位点动周期起点高度: 周期结束时比较判断该周期是否移动 uint8_t PwRstInchNoMvCnt;//上电复位点动无位移周期计数: 连续2个点动周期无位移判定到底 bool PwRstErrValid;//上电复位报错帧已处理标志: 同一报错码连发只停顿一次, 防止连发广播把停顿无限续期 uint16_t PwRstErrCode;//上电复位已处理的报错码(帧[2]<<8|帧[3]): 不同报错码视为新报错重新停顿 uint16_t PwRstSamp1mSCnt;//上电复位高度采样计时: 每秒打印一次当前高度, 展示下降全程高度曲线 uint16_t PwRstRiseCandCnt;//上电复位反弹候选持续计时: 反升>1cm持续300ms才确认反弹, 滤除瞬时抖动毛刺 int16_t PwRstRiseCandMax;//上电复位反弹候选期间最高高度: 确认时高度须仍接近最高点(未回落) uint16_t PwRstStartDlyCnt;//上电复位开始前延时: 等电机控制盒自身初始化完成(整体断电再上电时控制盒未就绪, 立即下降会因状态切换抖动误触发碰撞保护) bool PwRstMovedFlag;//上电复位已发生位移标志: 高度变化过(电机已响应下降指令)后才允许堵转到底判定, 防止延时/控制盒软启动期间高度停滞误判到底 uint8_t FeedDogDlyCnt; bool CaliZeroFlag;//校零标志位 bool PowerResetFlag;//上电复位流程标志: 上电复位中收到过复位帧, 收到高度帧(复位完成)后进入校准 bool PwRstBottomFlag;//上电复位最终到底标志: 点动下降中高度1秒无变化才确认, 之后点动下降触发复位帧 bool PwRstInchMode;//上电复位点动模式: 发生反弹后生效, 接近反弹高度时改脉冲式下降减小触底冲击 bool SideFlag;//侧压标志位 bool UpFlag;//上升标志位 bool DownFlag;//下降标志位 bool StopFlag;//停止标志位 bool EmeFlag;//应急标志位 bool LeftRunFalg; bool RightRunFalg; bool CentreRunFalg; bool LeftUpCS1237ReadEndFlag; bool LeftLowCS1237ReadEndFlag; bool RightUpCS1237ReadEndFlag; bool RightLowCS1237ReadEndFlag; int32_t LeftUpCS1237_TrendArray[OSC_CNT]; int32_t LeftLowCS1237_TrendArray[OSC_CNT]; int32_t RightUpCS1237_TrendArray[OSC_CNT]; int32_t RightLowCS1237_TrendArray[OSC_CNT]; int32_t LeftUpCS1237_SlopeArray[SLOPE_CNT]; int32_t LeftLowCS1237_SlopeArray[SLOPE_CNT]; int32_t RightUpCS1237_SlopeArray[SLOPE_CNT]; int32_t RightLowCS1237_SlopeArray[SLOPE_CNT]; bool WaitFlag; }AppDetect_t; extern AppDetect_t App; #endif