3. PID控制器参数整定

您所在的位置:网站首页 pid怎样调节参数 3. PID控制器参数整定

3. PID控制器参数整定

2024-07-13 08:15| 来源: 网络整理| 查看: 265

3.3.4. 解析数据包并处理¶ receiving_process()函数(工程目录\User\protocol\protocol.c)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75/** * @brief 接收的数据处理 * @param void * @return -1:没有找到一个正确的命令. */ int8_t receiving_process(void) { uint8_t frame_data[128]; // 要能放下最长的帧 uint16_t frame_len = 0; // 帧长度 uint8_t cmd_type = CMD_NONE; // 命令类型 while(1) { cmd_type = protocol_frame_parse(frame_data, &frame_len); switch (cmd_type) { case CMD_NONE: { return -1; } case SET_P_I_D_CMD: { uint32_t temp0 = COMPOUND_32BIT(&frame_data[13]); uint32_t temp1 = COMPOUND_32BIT(&frame_data[17]); uint32_t temp2 = COMPOUND_32BIT(&frame_data[21]); float p_temp, i_temp, d_temp; p_temp = *(float *)&temp0; i_temp = *(float *)&temp1; d_temp = *(float *)&temp2; set_p_i_d(p_temp, i_temp, d_temp); // 设置 P I D } break; case SET_TARGET_CMD: { int actual_temp = COMPOUND_32BIT(&frame_data[13]); // 得到数据 set_point = (actual_temp); // 设置目标值 } break; case START_CMD: { set_motor_enable(); // 启动电机 } break; case STOP_CMD: { set_motor_disable(); // 停止电机 } break; case RESET_CMD: { HAL_NVIC_SystemReset(); // 复位系统 } break; case SET_PERIOD_CMD: { uint32_t temp = COMPOUND_32BIT(&frame_data[13]); // 周期数 SET_BASIC_TIM_PERIOD(temp); // 设置定时器周期1~1000ms } break; default: return -1; } } }

该函数实现的功能为接收一帧数据并解析内容,在主函数中轮询调用。我们可以看到在函数中调用了protocol_frame_parse函数来解析数据,根据获取到的指令类型,最后在Switch操作中做出对应操作。

下面我们来看protocol_frame_parse()函数是如何解析一帧数据的。

protocol_frame_parse()函数(工程目录\User\protocol\protocol.c)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96/** * @brief 查询帧类型(命令) * @param *data: 帧数据 * @param data_len: 帧数据的大小 * @return 帧类型(命令). */ static uint8_t protocol_frame_parse(uint8_t *data, uint16_t *data_len) { uint8_t frame_type = CMD_NONE; uint16_t need_to_parse_len = 0; int16_t header_oft = -1; uint8_t checksum = 0; need_to_parse_len = recvbuf_get_len_to_parse(parser.frame_len, PROT_FRAME_LEN_RECV, parser.r_oft, parser.w_oft); // 得到为解析的数据长度 if (need_to_parse_len


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3