STM32MiniC8T6_TestLogic/Document/逻辑备份/洗烘一体机-超震限速逻辑.c

231 lines
8.1 KiB
C
Raw Normal View History

#include <stdint.h>
#include "string.h"
typedef enum
{
LOGIC_INIT = 0x5AA5,
LOGIC_RUN = 0x1111
// LOGIC_CLOSE = 0x2222
}LOGIC_STATE_ENUM_T;
typedef enum
{
SUPERSHAKE_LEVEL_MID_DEHY, // 超震等级 中脱
SUPERSHAKE_LEVEL_HIGH1_DEHY, // 超震等级 高脱1
SUPERSHAKE_LEVEL_HIGH2_DEHY, // 超震等级 高脱2
SUPERSHAKE_LEVEL_HIGH3_DEHY, // 超震等级 高脱3
SUPERSHAKE_LEVEL_HIGH4_DEHY, // 超震等级 高脱4
SUPERSHAKE_LEVEL_NUM
}SUPERSHAKE_LEVEL_ENUM_T;
// 超震记录单元
typedef struct
{
/* 基础参数 */
uint16_t imu_set; // 超震值设定
uint16_t over_judge_time; // 超标判断时间
uint16_t recover_judge_time; // 恢复判断时间
uint16_t speed_limit; // 速度限制
/* 状态计数 */
uint16_t over_time_cnt; // 恢复时间计数
uint16_t recover_time_cnt; // 恢复时间计数
}SUPERSHAKE_RECORD_STR_T;
// 超震限速枚举变量
typedef enum
{
SUPERSHAKE_LIMIT_INIT, // 初始化
// SUPERSHAKE_LIMIT_IDLE, // 空闲 不检测超震
SUPERSHAKE_LIMIT_DETECT, // 检测
}SUPERSHAKE_LIMIT_STATE_ENUM_T;
static uint16_t rt_imu_data = 0; // 实时imu数据
static SUPERSHAKE_RECORD_STR_T supershake_record[SUPERSHAKE_LEVEL_NUM] = {0}; // 超震变速记录
/* 中脱转速 */
static uint16_t get_set_mid_dehy_speed_value(void){
return 400;
}
/* 高脱1转速 */
static uint16_t get_set_high_1_dehy_speed_value(void){
return 500;
}
/* 高脱2转速 */
static uint16_t get_set_high_2_dehy_speed_value(void){
return 600;
}
/* 高脱3转速 */
static uint16_t get_set_high_3_dehy_speed_value(void){
return 700;
}
/* 高脱4转速 */
static uint16_t get_set_high_4_dehy_speed_value(void){
return 800;
}
/* 中脱超震值 */
static uint16_t get_set_mid_dehy_supershake_value(void){
return 500;
}
/* 高脱1超震值 */
static uint16_t get_set_high_1_dehy_supershake_value(void){
return 400;
}
/* 高脱2超震值 */
static uint16_t get_set_high_2_dehy_supershake_value(void){
return 300;
}
/* 高脱3超震值 */
static uint16_t get_set_high_3_dehy_supershake_value(void){
return 200;
}
/* 高脱4超震值 */
static uint16_t get_set_high_4_dehy_supershake_value(void){
return 100;
}
/* 获取 实时imu数据 */
static uint16_t get_imu_data(void)
{
return rt_imu_data;
}
/*************************************************************************************
* @brief
*
* @warning
* @note
*************************************************************************************/
static void supershake_record_init(void)
{
memset((uint8_t *)supershake_record, 0x00, sizeof(supershake_record));
/* 中脱初始化 */
supershake_record[SUPERSHAKE_LEVEL_MID_DEHY].imu_set = get_set_mid_dehy_supershake_value();
supershake_record[SUPERSHAKE_LEVEL_MID_DEHY].speed_limit = get_set_mid_dehy_speed_value();
supershake_record[SUPERSHAKE_LEVEL_MID_DEHY].over_judge_time = 5;
supershake_record[SUPERSHAKE_LEVEL_MID_DEHY].recover_judge_time = 10;
/* 高脱1初始化 */
supershake_record[SUPERSHAKE_LEVEL_HIGH1_DEHY].imu_set = get_set_high_1_dehy_supershake_value();
supershake_record[SUPERSHAKE_LEVEL_HIGH1_DEHY].speed_limit = get_set_high_1_dehy_speed_value();
supershake_record[SUPERSHAKE_LEVEL_HIGH1_DEHY].over_judge_time = 5;
supershake_record[SUPERSHAKE_LEVEL_HIGH1_DEHY].recover_judge_time = 10;
/* 高脱2初始化 */
supershake_record[SUPERSHAKE_LEVEL_HIGH2_DEHY].imu_set = get_set_high_2_dehy_supershake_value();
supershake_record[SUPERSHAKE_LEVEL_HIGH2_DEHY].speed_limit = get_set_high_2_dehy_speed_value();
supershake_record[SUPERSHAKE_LEVEL_HIGH2_DEHY].over_judge_time = 5;
supershake_record[SUPERSHAKE_LEVEL_HIGH2_DEHY].recover_judge_time = 10;
/* 高脱3初始化 */
supershake_record[SUPERSHAKE_LEVEL_HIGH3_DEHY].imu_set = get_set_high_3_dehy_supershake_value();
supershake_record[SUPERSHAKE_LEVEL_HIGH3_DEHY].speed_limit = get_set_high_3_dehy_speed_value();
supershake_record[SUPERSHAKE_LEVEL_HIGH3_DEHY].over_judge_time = 5;
supershake_record[SUPERSHAKE_LEVEL_HIGH3_DEHY].recover_judge_time = 10;
/* 高脱4初始化 */
supershake_record[SUPERSHAKE_LEVEL_HIGH4_DEHY].imu_set = get_set_high_4_dehy_supershake_value();
supershake_record[SUPERSHAKE_LEVEL_HIGH4_DEHY].speed_limit = get_set_high_4_dehy_speed_value();
supershake_record[SUPERSHAKE_LEVEL_HIGH4_DEHY].over_judge_time = 5;
supershake_record[SUPERSHAKE_LEVEL_HIGH4_DEHY].recover_judge_time = 10;
}
/*************************************************************************************
* @brief
* @return uint16_t
*
* @warning
* @note
*************************************************************************************/
uint16_t supershake_speed_limit(LOGIC_STATE_ENUM_T cmd)
{
static SUPERSHAKE_LIMIT_STATE_ENUM_T supershake_limit_speed_state = SUPERSHAKE_LIMIT_INIT; // 超震限速逻辑状态机
static uint32_t timetick = 0; // 时间戳
uint16_t realtime_imu_val = 0; // 超震实时值
SUPERSHAKE_LEVEL_ENUM_T index_i = (SUPERSHAKE_LEVEL_ENUM_T)0;
uint16_t supershake_recover_speed = 0; // 恢复速度
static uint16_t ret_limit_speed = 0; // 对外输出的超震限制速度值
/* 外部开关 */
if(cmd == LOGIC_INIT)
{
supershake_limit_speed_state = SUPERSHAKE_LIMIT_INIT;
}
switch(supershake_limit_speed_state)
{
case SUPERSHAKE_LIMIT_INIT:
supershake_record_init();
supershake_limit_speed_state = SUPERSHAKE_LIMIT_DETECT;
ret_limit_speed = get_set_high_4_dehy_speed_value();
break;
case SUPERSHAKE_LIMIT_DETECT:
realtime_imu_val = get_imu_data();
/* 检测 可指定周期 */
for(index_i = (SUPERSHAKE_LEVEL_ENUM_T)0; index_i < SUPERSHAKE_LEVEL_NUM; ++index_i)
{
if(realtime_imu_val <= supershake_record[index_i].imu_set)
{
supershake_record[index_i].over_time_cnt = 0;
}
else
{
supershake_record[index_i].recover_time_cnt = 0;
}
}
// 每秒处理事情
if(get_systick_ms() - timetick >= 1000u)
{
timetick = get_systick_ms();
for(index_i = (SUPERSHAKE_LEVEL_ENUM_T)0; index_i < SUPERSHAKE_LEVEL_NUM; ++index_i)
{
// 更新 超震cnt 恢复cnt
if(supershake_record[index_i].over_time_cnt < 60)
{
(supershake_record[index_i].over_time_cnt)++;
}
if(supershake_record[index_i].recover_time_cnt < 60)
{
(supershake_record[index_i].recover_time_cnt)++;
}
/* 平稳 恢复速度 */
if(supershake_record[index_i].recover_time_cnt >= supershake_record[index_i].recover_judge_time)
{
if(ret_limit_speed < supershake_record[index_i].speed_limit)
{
ret_limit_speed = supershake_record[index_i].speed_limit;
}
}
/* 超震 限速 */
if(supershake_record[index_i].over_time_cnt >= supershake_record[index_i].over_judge_time)
{
if(index_i == (SUPERSHAKE_LEVEL_ENUM_T)0)
{
ret_limit_speed = 0;
}
else
{
if(ret_limit_speed > supershake_record[index_i-1].speed_limit)
{
ret_limit_speed = supershake_record[index_i-1].speed_limit;
}
// ret_limit_speed = supershake_record[index_i-1].speed_limit;
}
}
}
}
break;
}
return ret_limit_speed;
}