# Dual Start Up

双阱启动流程

# MCU 开机

MCU 上电后,自动进入 Ready 状态: 关闭相关电源和风扇
switch_set_state(SWITCH_POWER_12V, 0);
switch_set_state(SWITCH_POWER_ARMX, 0);
switch_set_state(SWITCH_POWER_24V, 0);
switch_set_state(SWITCH_POWER_ROUGH, 0);
switch_set_state(SWITCH_POWER_SENSORS, 0);
switch_set_state(SWITCH_POWER_RFID_READER, 0);
switch_set_state(SWITCH_POWER_BASE, 0);
switch_set_state(SWITCH_POWER_COIL, 0);
switch_set_state(SWITCH_POWER_HALL, 0);

// set fan off
fan_set_speed(FAN1_ID, 0);
fan_set_speed(FAN2_ID, 0);
fan_set_speed(FAN3_ID, 0);

MCU 开机键按下,进入 running 状态

switch_set_state(SWITCH_POWER_12V, 1);
switch_set_state(SWITCH_POWER_ROUGH, 1);
switch_set_state(SWITCH_POWER_ARMX, 1);
osDelay(500);
switch_set_state(SWITCH_POWER_24V, 1);
switch_set_state(SWITCH_POWER_HALL, 1);

switch_set_state(SWITCH_POWER_SENSORS, 1);
switch_set_state(SWITCH_POWER_RFID_READER, 1);

// set fan on
fan_set_speed(FAN1_ID, CONFIG_FAN_SPEED_DEFAULT);
fan_set_speed(FAN2_ID, CONFIG_FAN_SPEED_DEFAULT);
fan_set_speed(FAN3_ID, CONFIG_FAN_SPEED_DEFAULT);

# ARM 开机

MCU 给 arm 上电后,arm 操作系统启动大致10多秒,后进入启动流程:

1) 循环5次,查询MCU检查版本,便于多USB接口的查询,确保MCU连接成功
因为双阱USB口需要查询,所以此处循环初始化 5 次,一旦成功,理解退出循环

2) 循环 5次,取得MCU时间,设置 arm 时间
3) 打开所有传感器电源
PmsDevice::Instance().device_switch.setSwitchState(PmsEnum::SwitchMCUToKey(PmsEnum::SwitchMCU::SWITCH_POWER_SENSORS), 1);
4) 检查隔膜泵转速
a) 设置隔膜泵占空比95 PmsDevice::Instance().device_pump.set_diaphragm_pump_duty(95);
b) 判断隔膜泵是否启动, 读3次当前隔膜泵转速,避免一次读失败造成失误,如果读转速失败,直接退出启动,弹出重启倒计时界面
c) 如果隔膜泵当前转速大于 占空比为60的工作转速范围最小值,认为当前转速已经合理,不需要补气,直接进入后续启动流程
d) 进入补气流程
1) 打开 base power , 等待 1500, 初始化 FPGA
1) 关闭分子泵 MOTOR
PmsDevice::Instance().device_switch.setSwitchState(PmsEnum::SwitchMCUToKey(PmsEnum::SwitchMCU::SWITCH_TURBO_MOTOR), 0);
3) 设置补气超时
vavle1_open_timeout = 10000
PmsDevice::Instance().device_fpga.setStaticDACValue(int(PmsEnum::StaticDAC::DAC_VAVLE1_OPEN_TIMEOUT), vavle1_open_timeout);
4)打开补气开关,如果失败尝试3次 ,如果补气开发打开失败,直接退出启动,弹出重启倒计时界面
5)补气等待 等待 5次 10 秒,
如果转速达标,直接退出等待
如果连续3次转速在上涨,退出等待
如果补气时间达到 前面设置的补气FPGA时间限制,重新打开补气开关,循环5次

   6) 如果5次没有等到转速合法,直接退出启动,弹出重启倒计时  
   7) 如果成功 关闭补气
       PmsDevice::Instance().device_switch.setSwitchState(PmsEnum::SwitchFPGAToKey(PmsEnum::SwitchFPGA::SWITCH_VALVE1), 0);

5)隔膜泵转速等待

retry_times = 200 超时 200 秒
high_duty_rpm_min=2000  95时候最低转速
high_duty_rpm_max=3350  95时候最高转速
turbopump_start_pressure_exp_max = 1.0  气压最大
pressure_min_exp = -7.333333 气压最小
 
气压在[pressure_min_exp, turbopump_start_pressure_exp_max] , 转速在 [high_duty_rpm_min,high_duty_rpm_max] 达标,
超时 retry_times

如果隔膜泵转速不达标,退出启动流程,弹出关机倒计时界面

6) 开启分子泵电源
PmsDevice::Instance().device_switch.setSwitchState(PmsEnum::SwitchMCUToKey(PmsEnum::SwitchMCU::SWITCH_POWER_TURBO), 1);
QThread::msleep(3000);
开启分子泵
PmsDevice::Instance().device_switch.setSwitchState(PmsEnum::SwitchMCUToKey(PmsEnum::SwitchMCU::SWITCH_TURBO_MOTOR), 1);

7) 检查分子泵转速和气压
retry_times = 300 秒
pressure_min_exp = -7.333333 气压最小
hight_voltage_start_pressure_exp_max=-3.0 气压最大
stable_spd_rpm=88000 转速最小值
气压在[pressure_min_exp, hight_voltage_start_pressure_exp_max] , 转速大于 stable_spd_rpm 达标,
超时 retry_times

8) 等待隔膜泵占空比 60 转速达标
设置占空比 60 PmsDevice::Instance().device_pump.set_diaphragm_pump_duty(60);
retry_times = 60 60秒
work_duty_rpm_min=950 转速最小
work_duty_rpm_max=2000 转速最大
气压在[pressure_min_exp, turbopump_start_pressure_exp_max] , 转速在 [work_duty_rpm_min,work_duty_rpm_max] 达标,
超时 retry_times
如果隔膜泵转速小于最小达标值,认为隔膜泵异常,退出启动,弹出关机倒计时

9) 开启BASE&COIL板电源,
如果前面已经打开base powr,此处将不重复打开
PmsDevice::Instance().device_switch.setSwitchState(PmsEnum::SwitchMCUToKey(PmsEnum::SwitchMCU::SWITCH_POWER_BASE), 1);
QThread::msleep(1500);
PmsDevice::Instance().device_switch.setSwitchState(PmsEnum::SwitchMCUToKey(PmsEnum::SwitchMCU::SWITCH_POWER_COIL), 1);

10) 重试10次,以确认FPGA连接成功

11 设置FPGA 所有缺省值

备注:
MCU 在接收到 SWITCH_POWER_BASE , 会启动 RFID 查找流程, 自动兼容不同 读卡器
MCU 在接收到 SWITCH_POWER_TURBO , 会启动 Trubo 查找流程,自动兼容不同分子泵