From a941a3719ab494bf50a3effdabcf402346431cf5 Mon Sep 17 00:00:00 2001 From: tuxmonkey Date: Mon, 23 Feb 2026 23:49:47 +0800 Subject: [PATCH] great changes --- .../module/algorithm/controller/pid/pid.c | 72 +++++++++++++++++-- .../module/algorithm/controller/pid/pid.h | 35 ++++----- .../motor/can_motors/dji_motor/dji_motor.c | 26 +++---- .../motor/can_motors/dji_motor/dji_motor.h | 6 +- User_Code/module/motor/motor_def.h | 4 +- ozonedeb/windebnewwt.jdebug.user | 22 +++--- 6 files changed, 116 insertions(+), 49 deletions(-) diff --git a/User_Code/module/algorithm/controller/pid/pid.c b/User_Code/module/algorithm/controller/pid/pid.c index dcd9a65..55f94c8 100644 --- a/User_Code/module/algorithm/controller/pid/pid.c +++ b/User_Code/module/algorithm/controller/pid/pid.c @@ -1,5 +1,5 @@ /** - * @file controller.c + * @file pid.c * @author wanghongxi * @author modified by TuxMonkey * @brief PID控制器及前馈控制器 @@ -82,6 +82,61 @@ static void f_Output_Filter(PIDInstance *pid) pid->Last_Output * pid->Output_LPF_RC / (pid->Output_LPF_RC + pid->dt); } +// 简单前馈模式: f_out = K_F * (Target - Pre_Target) / dt +static void f_FeedForward_Control_Simple(PIDInstance *pid) +{ + if (pid->dt > 0.000001f) { // 防止除以零 + pid->FFC_Output = pid->FFC_K * (pid->Ref - pid->FFC_Set_History[0]) / pid->dt; + } else { + pid->FFC_Output = 0.0f; + } + + // 更新设定值历史 + pid->FFC_Set_History[0] = pid->Ref; // 保存当前设定值用于下次计算 +} + +// 复杂前馈模式: P + D + A 三阶前馈 +static void f_FeedForward_Control_Complex(PIDInstance *pid) +{ + // 更新设定值历史 + pid->FFC_Set_History[2] = pid->FFC_Set_History[1]; // LLAST = LAST + pid->FFC_Set_History[1] = pid->FFC_Set_History[0]; // LAST = NOW + pid->FFC_Set_History[0] = pid->Ref; // NOW = 当前设定值 + + // 低通滤波处理 + float denominator = pid->FFC_LPF_RC + pid->dt; + if (denominator > 0.000001f) { + pid->FFC_Set_History[0] = pid->FFC_Set_History[0] * pid->dt / denominator + + pid->FFC_Set_History[0] * pid->FFC_LPF_RC / denominator; + } + + // 前馈计算: P + D + A + float p_term = pid->FFC_Kp * pid->FFC_Set_History[0]; // 比例项 + float d_term = 0.0f; + float a_term = 0.0f; + + if (pid->dt > 0.000001f) { // 防止除以零 + // 微分项: 速度前馈 + d_term = pid->FFC_Kd * (pid->FFC_Set_History[0] - pid->FFC_Set_History[1]) / pid->dt; + + // 加速度项: 加速度前馈 + a_term = pid->FFC_Ka * (pid->FFC_Set_History[0] - 2 * pid->FFC_Set_History[1] + pid->FFC_Set_History[2]) / (pid->dt * pid->dt); + } + + pid->FFC_Output = p_term + d_term + a_term; +} + +// 前馈输出限幅 +static void f_FeedForward_Limit(PIDInstance *pid) +{ + if (pid->FFC_Output > pid->MaxOut) { + pid->FFC_Output = pid->MaxOut; + } + if (pid->FFC_Output < -(pid->MaxOut)) { + pid->FFC_Output = -(pid->MaxOut); + } +} + // 前馈控制计算(后续考虑写成电流/速度前馈) static void f_FeedForward_Control(PIDInstance *pid) @@ -226,9 +281,18 @@ float PIDCalculate(PIDInstance *pid, float measure, float ref) pid->Iout += pid->ITerm; // 累加积分 pid->Output = pid->Pout + pid->Iout + pid->Dout; // 计算输出 - // 前馈控制 - if (pid->Improve & PID_FeedForward) - f_FeedForward_Control(pid); + // 前馈控制 (根据模式选择) + if (pid->Improve & PID_FeedForward) { + if (pid->Improve & PID_FFC_SimpleMode) { + // 简单前馈模式 + f_FeedForward_Control_Simple(pid); + } else { + // 复杂前馈模式 + f_FeedForward_Control_Complex(pid); + } + // 前馈输出限幅 + f_FeedForward_Limit(pid); + } // 输出滤波 if (pid->Improve & PID_OutputFilter) diff --git a/User_Code/module/algorithm/controller/pid/pid.h b/User_Code/module/algorithm/controller/pid/pid.h index d19ab6d..7d6555b 100644 --- a/User_Code/module/algorithm/controller/pid/pid.h +++ b/User_Code/module/algorithm/controller/pid/pid.h @@ -28,16 +28,17 @@ // PID 优化环节使能标志位 typedef enum { - PID_IMPROVE_NONE = 0b000000000, // 无优化 0 - PID_Integral_Limit = 0b000000001, // 积分限幅 1 - PID_Derivative_On_Measurement = 0b000000010, // 微分先行 2 - PID_Trapezoid_Intergral = 0b000000100, // 梯形积分 4 - PID_Proportional_On_Measurement = 0b000001000, // 比例先行 8 - PID_OutputFilter = 0b000010000, // 输出滤波 16 - PID_ChangingIntegrationRate = 0b000100000, // 变速积分 32 - PID_DerivativeFilter = 0b001000000, // 微分滤波 64 - PID_ErrorHandle = 0b010000000, // 错误处理 128 - PID_FeedForward = 0b100000000, // 前馈控制 256 + PID_IMPROVE_NONE = 0b0000000000, // 无优化 0 + PID_Integral_Limit = 0b0000000001, // 积分限幅 1 + PID_Derivative_On_Measurement = 0b0000000010, // 微分先行 2 + PID_Trapezoid_Intergral = 0b0000000100, // 梯形积分 4 + PID_Proportional_On_Measurement = 0b0000001000, // 比例先行 8 + PID_OutputFilter = 0b0000010000, // 输出滤波 16 + PID_ChangingIntegrationRate = 0b0000100000, // 变速积分 32 + PID_DerivativeFilter = 0b0001000000, // 微分滤波 64 + PID_ErrorHandle = 0b0010000000, // 错误处理 128 + PID_FeedForward = 0b0100000000, // 前馈控制 256 + PID_FFC_SimpleMode = 0b1000000000, // 简单前馈模式 (与PID_FeedForward组合使用) 512 } PID_Improvement_e; /* PID 报错类型枚举*/ @@ -74,9 +75,10 @@ typedef struct //----------------------------------- // Feed Forward Control (FFC) parameters - float FFC_Kp; // 前馈比例系数 - float FFC_Kd; // 前馈微分系数 - float FFC_Ka; // 前馈加速度系数 + float FFC_K; // 简单前馈增益系数 + float FFC_Kp; // 前馈比例系数 (复杂模式) + float FFC_Kd; // 前馈微分系数 (复杂模式) + float FFC_Ka; // 前馈加速度系数 (复杂模式) float FFC_LPF_RC; // 前馈低通滤波器系数 float FFC_Output; // 前馈输出值 float FFC_Set_History[3]; // 前馈设定值历史 [NOW, LAST, LLAST] @@ -125,9 +127,10 @@ typedef struct // config parameter float Derivative_LPF_RC; // Feed Forward Control (FFC) parameters - float FFC_Kp; // 前馈比例系数 - float FFC_Kd; // 前馈微分系数 - float FFC_Ka; // 前馈加速度系数 + float FFC_K; // 简单前馈增益系数 + float FFC_Kp; // 前馈比例系数 (复杂模式) + float FFC_Kd; // 前馈微分系数 (复杂模式) + float FFC_Ka; // 前馈加速度系数 (复杂模式) float FFC_LPF_RC; // 前馈低通滤波器系数 } PID_Init_Config_s; diff --git a/User_Code/module/motor/can_motors/dji_motor/dji_motor.c b/User_Code/module/motor/can_motors/dji_motor/dji_motor.c index 9c574f7..f378d6d 100644 --- a/User_Code/module/motor/can_motors/dji_motor/dji_motor.c +++ b/User_Code/module/motor/can_motors/dji_motor/dji_motor.c @@ -13,7 +13,7 @@ static DJIMotorInstance *dji_motor_instance[DJI_MOTOR_CNT] = {NULL}; // 会在co #ifdef FDCAN -static CANInstance sender_assignment[9] = { +static FDCANInstance sender_assignment[9] = { [0] = {.can_handle = &hfdcan1, .txconf.Identifier = 0x1ff, .txconf.IdType = FDCAN_STANDARD_ID, .txconf.TxFrameType = FDCAN_DATA_FRAME, .txconf.DataLength = FDCAN_DLC_BYTES_8, .txconf.FDFormat = FDCAN_CLASSIC_CAN,.txconf.BitRateSwitch = FDCAN_BRS_OFF, .tx_buff = {0}}, [1] = {.can_handle = &hfdcan1, .txconf.Identifier = 0x200, .txconf.IdType = FDCAN_STANDARD_ID, .txconf.TxFrameType = FDCAN_DATA_FRAME, .txconf.DataLength = FDCAN_DLC_BYTES_8, .txconf.FDFormat = FDCAN_CLASSIC_CAN,.txconf.BitRateSwitch = FDCAN_BRS_OFF, .tx_buff = {0}}, [2] = {.can_handle = &hfdcan1, .txconf.Identifier = 0x2ff, .txconf.IdType = FDCAN_STANDARD_ID, .txconf.TxFrameType = FDCAN_DATA_FRAME, .txconf.DataLength = FDCAN_DLC_BYTES_8, .txconf.FDFormat = FDCAN_CLASSIC_CAN,.txconf.BitRateSwitch = FDCAN_BRS_OFF, .tx_buff = {0}}, @@ -60,7 +60,7 @@ static uint8_t sender_enable_flag[9] = {0}; * @brief 根据电调/拨码开关上的ID,根据说明书的默认id分配方式计算发送ID和接收ID, * 并对电机进行分组以便处理多电机控制命令 */ -static void MotorSenderGrouping(DJIMotorInstance *motor, CAN_Init_Config_s *config) +static void MotorSenderGrouping(DJIMotorInstance *motor, FDCAN_Init_Config_s *config) { uint8_t motor_id = config->tx_id - 1; // 下标从零开始,先减一方便赋值 uint8_t motor_send_num; @@ -68,11 +68,11 @@ static void MotorSenderGrouping(DJIMotorInstance *motor, CAN_Init_Config_s *conf uint8_t grouping_offset; //通过CAN计算分组偏移量 - if(config->can_handle == &hcan1) + if(config->can_handle == &hfdcan1) { grouping_offset=0; } - else if(config->can_handle == &hcan2) + else if(config->can_handle == &hfdcan2) { grouping_offset=3; } @@ -106,7 +106,7 @@ static void MotorSenderGrouping(DJIMotorInstance *motor, CAN_Init_Config_s *conf // 检查是否发生id冲突 for (size_t i = 0; i < idx; ++i) { - if (dji_motor_instance[i]->motor_can_instance->can_handle == config->can_handle && dji_motor_instance[i]->motor_can_instance->rx_id == config->rx_id) + if (dji_motor_instance[i]->motor_fdcan_instance->can_handle == config->can_handle && dji_motor_instance[i]->motor_fdcan_instance->rx_id == config->rx_id) { LOGERROR("[dji_motor] ID crash. Check in debug mode, add dji_motor_instance to watch to get more information."); uint16_t can_bus = config->can_handle == &hcan1 ? 1 : 2; @@ -135,7 +135,7 @@ static void MotorSenderGrouping(DJIMotorInstance *motor, CAN_Init_Config_s *conf for (size_t i = 0; i < idx; ++i) { - if (dji_motor_instance[i]->motor_can_instance->can_handle == config->can_handle && dji_motor_instance[i]->motor_can_instance->rx_id == config->rx_id) + if (dji_motor_instance[i]->motor_fdcan_instance->can_handle == config->can_handle && dji_motor_instance[i]->motor_fdcan_instance->rx_id == config->rx_id) { LOGERROR("[dji_motor] ID crash. Check in debug mode, add dji_motor_instance to watch to get more information."); uint16_t can_bus = config->can_handle == &hcan1 ? 1 : 2; @@ -157,7 +157,7 @@ static void MotorSenderGrouping(DJIMotorInstance *motor, CAN_Init_Config_s *conf * * @param _instance 收到数据的instance,通过遍历与所有电机进行对比以选择正确的实例 */ -static void DecodeDJIMotor(CANInstance *_instance) +static void DecodeDJIMotor(FDCANInstance *_instance) { // 这里对can instance的id进行了强制转换,从而获得电机的instance实例地址 // _instance指针指向的id是对应电机instance的地址,通过强制转换为电机instance的指针,再通过->运算符访问电机的成员motor_measure,最后取地址获得指针 @@ -189,8 +189,8 @@ static void DecodeDJIMotor(CANInstance *_instance) static void DJIMotorLostCallback(void *motor_ptr) { DJIMotorInstance *motor = (DJIMotorInstance *)motor_ptr; - uint16_t can_bus = motor->motor_can_instance->can_handle == &hcan1 ? 1 : 2; - LOGWARNING("[dji_motor] Motor lost, can bus [%d] , id [%d]", can_bus, motor->motor_can_instance->tx_id); + uint16_t can_bus = motor->motor_fdcan_instance->can_handle == &hcan1 ? 1 : 2; + LOGWARNING("[dji_motor] Motor lost, can bus [%d] , id [%d]", can_bus, motor->motor_fdcan_instance->tx_id); } // 电机初始化,返回一个电机实例 @@ -214,12 +214,12 @@ DJIMotorInstance *DJIMotorInit(Motor_Init_Config_s *config) // 后续增加电机前馈控制器(速度和电流) // 电机分组,因为至多4个电机可以共用一帧CAN控制报文 - MotorSenderGrouping(instance, &config->can_init_config); + MotorSenderGrouping(instance, &config->fdcan_init_config); // 注册电机到CAN总线 - config->can_init_config.can_module_callback = DecodeDJIMotor; // set callback - config->can_init_config.id = instance; // set id,eq to address(it is identity) - instance->motor_can_instance = CANRegister(&config->can_init_config); + config->fdcan_init_config.can_module_callback = DecodeDJIMotor; // set callback + config->fdcan_init_config.id = instance; // set id,eq to address(it is identity) + instance->motor_fdcan_instance = CANRegister(&config->fdcan_init_config); // 注册守护线程 Daemon_Init_Config_s daemon_config = { diff --git a/User_Code/module/motor/can_motors/dji_motor/dji_motor.h b/User_Code/module/motor/can_motors/dji_motor/dji_motor.h index 36aadb5..8005479 100644 --- a/User_Code/module/motor/can_motors/dji_motor/dji_motor.h +++ b/User_Code/module/motor/can_motors/dji_motor/dji_motor.h @@ -6,7 +6,7 @@ #define TRONONEH7_SCAFFOLD_DJI_MOTOR_H #include "bsp_fdcan.h" -#include "controller.h" +#include "pid.h" #include "motor_def.h" #include "stdint.h" #include "daemon.h" @@ -42,7 +42,7 @@ typedef struct Motor_Control_Setting_s motor_settings; // 电机设置 Motor_Controller_s motor_controller; // 电机控制器 - CANInstance *motor_can_instance; // 电机CAN实例 + FDCANInstance *motor_fdcan_instance; // 电机CAN实例 // 分组发送设置 uint8_t sender_group; uint8_t message_num; @@ -50,7 +50,7 @@ typedef struct Motor_Type_e motor_type; // 电机类型 Motor_Working_Type_e stop_flag; // 启停标志 - DaemonInstance* daemon; + Daemon_Instance* daemon; uint32_t feed_cnt; float dt; } DJIMotorInstance; diff --git a/User_Code/module/motor/motor_def.h b/User_Code/module/motor/motor_def.h index ecee010..c09473c 100644 --- a/User_Code/module/motor/motor_def.h +++ b/User_Code/module/motor/motor_def.h @@ -5,7 +5,7 @@ #ifndef TRONONEH7_SCAFFOLD_MOTOR_DEF_H #define TRONONEH7_SCAFFOLD_MOTOR_DEF_H -#include "controller.h" +#include "pid.h" #include "stdint.h" #define LIMIT_MIN_MAX(x, min, max) (x) = (((x) <= (min)) ? (min) : (((x) >= (max)) ? (max) : (x))) @@ -125,7 +125,7 @@ typedef struct Motor_Controller_Init_s controller_param_init_config; Motor_Control_Setting_s controller_setting_init_config; Motor_Type_e motor_type; - CAN_Init_Config_s can_init_config; + FDCAN_Init_Config_s fdcan_init_config; } Motor_Init_Config_s; diff --git a/ozonedeb/windebnewwt.jdebug.user b/ozonedeb/windebnewwt.jdebug.user index d586fdb..74ca0c3 100644 --- a/ozonedeb/windebnewwt.jdebug.user +++ b/ozonedeb/windebnewwt.jdebug.user @@ -2,26 +2,26 @@ GraphedExpression="(INS).Yaw", Color=#a00909 GraphedExpression="(INS).Pitch", Color=#09a01b GraphedExpression="(INS).Roll", Color=#09a087 -OpenDocument="delayticks.c", FilePath="C:/Users/esqwt/CLionProjects/tronone-h7-scaffold/User_Code/bsp/delayticks/delayticks.c", Line=14 +OpenDocument="delayticks.c", FilePath="C:/Users/esqwt/CLionProjects/tronone-h7-scaffold/User_Code/bsp/delayticks/delayticks.c", Line=7 OpenDocument="ins_task.c", FilePath="C:/Users/esqwt/CLionProjects/tronone-h7-scaffold/User_Code/module/periph/imu/ins_task.c", Line=217 -OpenDocument="tasks.c", FilePath="C:/Users/esqwt/CLionProjects/tronone-h7-scaffold/Middlewares/Third_Party/FreeRTOS/Source/tasks.c", Line=2298 +OpenDocument="tasks.c", FilePath="C:/Users/esqwt/CLionProjects/tronone-h7-scaffold/Middlewares/Third_Party/FreeRTOS/Source/tasks.c", Line=2308 OpenDocument="main.c", FilePath="C:/Users/esqwt/CLionProjects/tronone-h7-scaffold/Core/Src/main.c", Line=74 OpenToolbar="Debug", Floating=0, x=0, y=0 OpenToolbar="Breakpoints", Floating=0, x=1, y=0 -OpenWindow="Call Stack", DockArea=LEFT, x=0, y=3, w=551, h=159, TabPos=0, TopOfStack=1, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 +OpenWindow="Call Stack", DockArea=LEFT, x=0, y=3, w=551, h=161, TabPos=0, TopOfStack=1, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 OpenWindow="Registers 1", DockArea=BOTTOM, x=1, y=0, w=271, h=181, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, FilteredItems=[], RefreshRate=1 OpenWindow="Source Files", DockArea=LEFT, x=0, y=0, w=551, h=187, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 OpenWindow="Disassembly", DockArea=BOTTOM, x=2, y=0, w=472, h=181, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 OpenWindow="Break & Tracepoints", DockArea=LEFT, x=0, y=1, w=551, h=194, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, VectorCatchIndexMask=254 OpenWindow="Memory 1", DockArea=BOTTOM, x=3, y=0, w=348, h=181, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, EditorAddress=0x20005E30 -OpenWindow="Global Data", DockArea=RIGHT, x=0, y=2, w=614, h=269, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 -OpenWindow="Watched Data 1", DockArea=LEFT, x=0, y=2, w=551, h=190, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 -OpenWindow="Functions", DockArea=LEFT, x=0, y=3, w=551, h=159, TabPos=2, TopOfStack=0, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 -OpenWindow="Call Graph", DockArea=LEFT, x=0, y=3, w=551, h=159, TabPos=3, TopOfStack=0, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 +OpenWindow="Global Data", DockArea=RIGHT, x=0, y=2, w=614, h=267, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 +OpenWindow="Watched Data 1", DockArea=LEFT, x=0, y=2, w=551, h=188, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 +OpenWindow="Functions", DockArea=LEFT, x=0, y=3, w=551, h=161, TabPos=2, TopOfStack=0, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 +OpenWindow="Call Graph", DockArea=LEFT, x=0, y=3, w=551, h=161, TabPos=3, TopOfStack=0, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 OpenWindow="Data Sampling", DockArea=BOTTOM, x=0, y=0, w=826, h=181, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, VisibleTab=0, UniformSampleSpacing=0 -OpenWindow="Timeline", DockArea=RIGHT, x=0, y=1, w=614, h=267, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=1, DataPaneShown=1, PowerPaneShown=0, CodePaneShown=0, PinCursor="Cursor Movable", TimePerDiv="2 s / Div", TimeStampFormat="Time", DataGraphDrawAsPoints=0, DataGraphLegendShown=1, DataGraphUniformSampleSpacing=0, DataGraphLegendPosition="368;0", PowerGraphDrawAsPoints=0, PowerGraphLegendShown=0, PowerGraphAvgFilterTime=Off, PowerGraphAvgFilterLen=Off, PowerGraphUniformSampleSpacing=0, PowerGraphLegendPosition="396;-65", CodeGraphLegendShown=0, CodeGraphLegendPosition="412;0" -OpenWindow="Console", DockArea=LEFT, x=0, y=3, w=551, h=159, TabPos=1, TopOfStack=0, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 -OpenWindow="FreeRTOS", DockArea=RIGHT, x=0, y=0, w=614, h=215, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, Showing="Task List" +OpenWindow="Timeline", DockArea=RIGHT, x=0, y=1, w=614, h=263, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=1, DataPaneShown=1, PowerPaneShown=0, CodePaneShown=0, PinCursor="Cursor Movable", TimePerDiv="2 s / Div", TimeStampFormat="Time", DataGraphDrawAsPoints=0, DataGraphLegendShown=1, DataGraphUniformSampleSpacing=0, DataGraphLegendPosition="368;0", PowerGraphDrawAsPoints=0, PowerGraphLegendShown=0, PowerGraphAvgFilterTime=Off, PowerGraphAvgFilterLen=Off, PowerGraphUniformSampleSpacing=0, PowerGraphLegendPosition="396;-65", CodeGraphLegendShown=0, CodeGraphLegendPosition="412;0" +OpenWindow="Console", DockArea=LEFT, x=0, y=3, w=551, h=161, TabPos=1, TopOfStack=0, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0 +OpenWindow="FreeRTOS", DockArea=RIGHT, x=0, y=0, w=614, h=221, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, Showing="Task List" TableHeader="Call Graph", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Name";"Stack Total";"Stack Local";"Code Total";"Code Local";"Depth";"Called From"], ColWidths=[384;100;100;100;100;100;113] TableHeader="Functions", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Name";"Address";"Size";"#Insts";"Source"], ColWidths=[1164;100;100;100;100] TableHeader="Global Data", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Name";"Value";"Location";"Size";"Type";"Scope"], ColWidths=[222;130;100;54;95;486] @@ -29,7 +29,7 @@ TableHeader="Vector Catches", SortCol="None", SortOrder="ASCENDING", VisibleCols TableHeader="Break & Tracepoints", SortCol="None", SortOrder="ASCENDING", VisibleCols=["";"Type";"Location";"Extras"], ColWidths=[100;100;142;209] TableHeader="Source Files", SortCol="File", SortOrder="ASCENDING", VisibleCols=["File";"Status";"Size";"#Insts";"Path"], ColWidths=[229;100;100;100;1046] TableHeader="Data Sampling Table", SortCol="Index", SortOrder="ASCENDING", VisibleCols=["Index";"Time";" (INS).Yaw";" (INS).Pitch";" (INS).Roll"], ColWidths=[100;100;100;100;409] -TableHeader="Data Sampling Setup", SortCol="Expression", SortOrder="ASCENDING", VisibleCols=["Expression";"Type";"Value";"Min";"Max";"Average";"# Changes";"Min. Change";"Max. Change"], ColWidths=[105;100;102;110;102;102;100;118;113] +TableHeader="Data Sampling Setup", SortCol="Expression", SortOrder="ASCENDING", VisibleCols=["Expression";"Type";"Value";"Min";"Max";"Average";"# Changes";"Min. Change";"Max. Change"], ColWidths=[105;100;110;102;100;110;100;113;113] TableHeader="Power Sampling", SortCol="Index", SortOrder="ASCENDING", VisibleCols=["Index";"Time";"Ch 0"], ColWidths=[100;100;100] TableHeader="Task List", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Name";"Run Count";"Priority";"Status";"Timeout";"Stack Info (Free / Size)";"ID";"Mutex Count";"Notified Value";"Notify State"], ColWidths=[110;110;110;110;110;110;110;110;110;110] TableHeader="Registers 1", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Name";"Value";"Description"], ColWidths=[100;105;294]