25_R1_chassis/User/Module/config.c
2025-07-10 06:02:19 +08:00

301 lines
5.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "config.h"
#include "flash.h"
#include "string.h"
#define DEBUG
#define CONFIG_BASE_ADDRESS (ADDR_FLASH_SECTOR_11)
#ifdef DEBUG
ConfigParam_t param_chassis ={
#else
static const ConfigParam_t param_chassis ={
#endif
.chassis = {/**/
.C6020Angle_param = {
.p = 30.0f,
.i = 0.05f,
.d = 2.0f,
.i_limit = 20.0f,
.out_limit = 5000.0f,
},
.C6020Omega_param = {
.p = 45.0f,
.i = 0.4f,
.d = 6.0f,
.i_limit = 2000.0f,
.out_limit = 25000.0f
},
.Chassis_AngleAdjust_param={
.p = 10.0f,
.i = 0.0f,
.d = 0.0f,
.i_limit = 0.0f,
.out_limit =6000.0f,
},
// 家里pid
// .RadarAngle_param = {
// .p = 22.0f,
// .i = 20.0f,
// .d = 800.0f,
// .i_limit = 100.0f,
// .out_limit =2000.0f,
// },
// .RadarSpeed_param = {
// .p = 7.0f,
// .i = 0.1f,
// .d = 50.0f,
// .i_limit = 1000.0f,
// .out_limit =8000.0f,
// },
//备馆pid
// .RadarAngle_param = {
// .p = 20.0f,
// .i = 0.06f,
// .d = 650.0f,
// .i_limit = 30.0f,
// .out_limit =2000.0f,
// },
// .RadarSpeed_param = {
// .p = 7.0f,
// .i = 0.1f,
// .d = 200.0f,
// .i_limit = 1000.0f,
// .out_limit =8000.0f,
// },
.RadarAngle_param = {
.p = 22.0f,
.i = 1.2f,
.d = 700.0f,
.i_limit = 30.0f,
.out_limit =4000.0f,
},
.RadarSpeed_param = {
.p = 9.0f,
.i = 0.15f,
.d = 450.0f,
.i_limit = 1200.0f,
.out_limit =8000.0f,
},
.SickVx_param = {
.p =12.0f,
.i =0.3f,
.d =1000.0f,
.i_limit =2500.0f,
.out_limit =15000.0f,
},
.SickVy_param = {
.p =15.0f,
.i =0.3f,
.d =1200.0f,
.i_limit =2500.0f,
.out_limit =15000.0f,
},
.SickVw_param = {
.p =20.0f,
.i =0.3f,
.d =800.0f,
.i_limit = 2500.0f,
.out_limit = 8000.0f
},
.M3508_param = {
.p = 15.0f,
.i = 0.0f,
.d = 1.5f,
.i_limit = 0.0f,
.out_limit = 5000.0f,
},
.C6020pitAngle_param = {
.p = 10.0f,
.i = 0.025f,
.d =5.0f,
.i_limit = 2000.0f,
.out_limit = 3000.0f,
},
.C6020pitOmega_param = {
.p =10.0f,
.i =0.0f,
.d =0.0f,
.i_limit = 2000.0f,
.out_limit = 3000.0f,
},
},
/*码盘导航*/
.ops={
.ops_pid={
/*路径速度*/
//不要盲目的为了提高速度直接给大out一定要慢慢往上加并根据情况调整pid参数
/*原本的pid速度不快很稳定适合作为基础速度*/
// .path_speed_pid_param=
// {
// .p = 20.0f,
// .i = 0.02f,
// .d = 3.2f,
// .i_limit = 200.0f,
// .out_limit =6000.0f,
// },
// .pid_PosSpeed_xy_param={
// .p =5.0f,
// .i =0.1f,
// .d =0.0f,
// .i_limit =5.0f,
// .out_limit =6000.0f,
// },
/*家里的的pid*/
.path_speed_pid_param=
{
.p = 0.5f,
.i = 0.0f,
.d = 0.0f,
.i_limit = 0.0f,
.out_limit =1000.0f,
},
.pid_PosSpeed_xy_param={
.p =27.0f,
.i =0.1f,
.d =500.0f,
.i_limit =500.0f,
.out_limit =25000.0f,
},
/*码盘导航陀螺仪角度纠正内外环*/
.pid_OutAngle_param={ //外环数据非常合适
.p = 20.0f,
.i = 0.0f,
.d = 0.0f,
.i_limit = 0.0f,
.out_limit =2000.0f,
},
.pid_InnerAngle_param={
.p = 20.0f,
.i = 0.04f,
.d = 0.0f,
.i_limit = 0.0f,
.out_limit =16000.0f,
},
//原本的pid
// .pid_OutAngle_hold_param={
// .p = 50.0f,
// .i = 0.3f,
// .d = 3.5f,
// .i_limit = 100.0f,
// .out_limit =1000.0f,
// },
// .pid_InnerAngle_hold_param={
// .p = 30.0f,
// .i = 0.0f,
// .d = 0.5f,
// .i_limit = 0.0f,
// .out_limit =7000.0f,
// },
//目前的pid r1跑到目标点会震荡i大了
.pid_OutAngle_hold_param={
.p = 25.0f,
.i = 0.1f,
.d = 5.0f,
.i_limit = 100.0f,
.out_limit =1000.0f,
},
.pid_InnerAngle_hold_param={
.p = 20.0f,
.i = 0.1f,
.d = 0.5f,
.i_limit = 400.0f,
.out_limit =7000.0f,
},
.pid_pos_xy_inner_param={
.p =4.0f,
.i =0.1f,
.d =0.5f,
.i_limit =5.0f,
.out_limit =4000.0f,
},
.pid_pos_xy_outer_param={
.p =4.0f,
.i =0.1f,
.d =0.5f,
.i_limit =5.0f,
.out_limit =4000.0f,
},
/*sick校准*/
.pid_sick_out_param={
.p =8.0f,
.i =0.1f,
.d =0.5f,
.i_limit =5.0f,
.out_limit =4000.0f,
},
.pid_sick_inner_param={
.p =5.0f,
.i =0.1f,
.d =0.5f,
.i_limit =5.0f,
.out_limit =4000.0f,
},
},
},
.can = {
.chassis5065 = BSP_CAN_2,
.chassis6020 = BSP_CAN_1,
},
};
const ConfigParam_t *Config_ChassisGet(void)
{
return &param_chassis;
}
/**
* \brief 从Flash读取配置信息
*
* \param cfg 配置信息
*/
void Config_Get(Config_t *cfg) {
BSP_Flash_ReadBytes(CONFIG_BASE_ADDRESS, (uint8_t *)cfg, sizeof(*cfg));
// /* 防止第一次烧写后访问NULL指针 */
cfg->chassis_config = &param_chassis;
if (cfg->chassis_config == NULL) cfg->chassis_config = &param_chassis;
/* 防止擦除后全为1 */
if ((uint32_t)(cfg->chassis_config) == UINT32_MAX)
cfg->chassis_config = &param_chassis;
if (memcmp(&cfg->cali_088.gyro_offset.x, "\xFF\xFF\xFF\xFF", 4) == 0) {
cfg->cali_088.gyro_offset.x = 0.0f;
}
if (memcmp(&cfg->cali_088.gyro_offset.y, "\xFF\xFF\xFF\xFF", 4) == 0) {
cfg->cali_088.gyro_offset.y = 0.0f;
}
if (memcmp(&cfg->cali_088.gyro_offset.z, "\xFF\xFF\xFF\xFF", 4) == 0) {
cfg->cali_088.gyro_offset.z = 0.0f;
}
}
/**
* \brief 将配置信息写入Flash
*
* \param cfg 配置信息
*/
void Config_Set(Config_t *cfg) {
osKernelLock();
BSP_Flash_EraseSector(11);
BSP_Flash_WriteBytes(CONFIG_BASE_ADDRESS, (uint8_t *)cfg, sizeof(*cfg));
osKernelUnlock();
}