# COD_F4_Template **Repository Path**: cod_-control/COD_F4_Template ## Basic Information - **Project Name**: COD_F4_Template - **Description**: 辽宁科技大学COD战队STM32F407 通用控制系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2025-01-24 - **Last Updated**: 2025-11-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # COD_F4_Template使用指南 ## 1 简介 开发工具:Keil V5.38 STM32CubeMX V6.12.0 VsCode 软件环境:Windows11 硬件环境:大疆RoboMaster开发板C型 (STM32F407IGHX) 编译工具:Arm Compiler V6.19,C/C++编译(求求你们换V6吧) ## 2 目录结构 待更新 ## 3 模块功能说明(重要!!!) ### 3.1 IMU 惯性测量单元(陀螺仪) #### 3.1.1 校准 **IMU数据在静止状态下不收敛或不稳定和机器人纬度变化时 请进行校准(回学校都校准一遍)** **校准步骤:** 1 请自行查阅当前地区的重力加速度值 如鞍山通常为9.794 g/m^2 将**Task**目录下的**config.h**中的**GravityAccel**修改为当前地区**重力加速度** ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-23_09-20-35.png) ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-23_09-22-13.png) 2. 打开**Components/Device**目录下的**bmi088.c** ​ 找到**BMI088_Offset_Update**函数 **将其上方IMU_Calibration_ENABLE 修改为1**(**1表示开启校准 0表示不校准**) ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-23_09-25-10.png) **IMU_Calibration_ENABLE** 修改为1之后 灰色部分的代码会变为黑色 **进入debug** 将**BMI088_Info**放入**watch**窗口 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-26-26.png) **运行代码前 请保持陀螺仪静止且水平!!!** **运行代码,等待温度Temperature上升至40度**,温度保持至40度左右时,**Reset,重新运行代码** ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-33-07.png) **重新运行代码 Offsets_Gyro_X 、Offsets_Gyro_Y、Offsets_Gyro_Z**会不断累加,最后收敛为一个定值(**Offsets_Init**变为0x01)(**期间保持陀螺仪静止且水平**!!!) ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-34-50.png) 将得到的 **Offsets_Gyro_X 、Offsets_Gyro_Y、Offsets_Gyro_Z**的值填入**BMI088_Offset_Update**函数**#else**下(199行至204行)对应的变量中 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-38-42.png) 最后将**IMU_Calibration_ENABLE** 修改为 0 (关闭校准)完成校准 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-39-41.png) #### 3.1.2 陀螺仪参数 **Yaw**: ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-54-59.png) **Pitch:** ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-55-38.png) **Roll**: ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-55-49.png) 其中Yaw轴方向不可变,安装方向请保持水平 Pitch和Roll方向根据安装位置调换,但图上所示的Pitch方向接近90度时会导致陀螺仪解算错误(sinf的问题),使用时该方向角度不要接近垂直(90度) 陀螺仪任务运行至**INS_Task**的FreeRTOS任务中 陀螺仪参数保存至INS_Info中 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_10-47-14.png) 其中Angle、Gyro的数组代表陀螺仪角度和角速度(单位rad和rad/s)为原始数据,上面表示的角度角速度都是乘RadiansToDegrees(57.295779513f)得到的角度,一些数学计算函数通常使用的是弧度制 请注意 Angle[3]角度根据config.h中的宏定义对应 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_11-07-00.png) Gyro[3]、Accel[3]同理 且方向一致 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_11-10-04.png) ### 3.2 PID模块 PID新增参数Alpha(微分的一阶低通滤波器) 微分项可显著提升系统的动态响应 但会因为噪声的存在放大输出,引起系统震荡 固对微分输出进行低通滤波后加到总输出。 初始化参数变为7个 第四位变为Alpha。 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_11-14-42.png) Alpha大于0.f小于1.f时 开启微分滤波。 比较适用的场景 底盘跟踪云台 不太精确的角度控制 云台P PI串级控制 可加入一点D项和滤波器系数 调参方法:**全程保证随时可以断电或者失能** 给定一点点微分项 ,使得系统稍微震荡 ,滤波器从0开始往上给,使得系统趋于稳定 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_11-24-37.png) 该功能待测试 建议先试试麦轮、舵轮的底盘跟踪云台 ### 3.3 裁判系统 裁判系统适配了最新的RoboMaster 裁判系统串口协议附录V1.7.0([RoboMaster 裁判系统串口协议附录 V1.7.0(20241225).pdf](https://terra-1-g.djicdn.com/b2a076471c6c4b72b574a977334d3e05/RoboMaster 裁判系统串口协议附录 V1.7.0(20241225).pdf))请所有人熟读一遍 使用C板的3pin串口(串口6)读取 请各位回到学校后将裁判系统升级至最新版本后测试数据是否正确 后续将更新图传链路数据 键鼠数据 UI部分后续将适配南京航空航天的开源项目 ### 3.4 电机 motor.c 新增我自己写的达妙电机库。 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_11-39-57.png) **以上参数请保证与上位机参数对应 其中RX接收ID大于TX发送ID如发送0x01 接收0x11** 达妙电机1000hz下一路最多带三个电机 大于三个电机请降频处理或使用CANFD ### 3.5 CAN CAN1数据统一放在FIFO0接收 CAN2数据统一放在FIFO2接收 ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_11-44-25.png) ### 3.6 FreeRTOS 现在任务的allocation都改成了static 新建任务请不要选择Dynamic ![](D:\图片\STM32H7教程\F4\Snipaste_2025-01-24_14-17-55.png) 请注意优先级问题 以前大家都一股脑选择最高级别realtime 导致任务顺序是随机的 比如控制任务在CAN发送任务之后 这样CAN发送的数据会慢0.001s 虽然影响不大 但是注意细节 现在优先级INS_Task>Vision_Task>Control_Task>CAN_Task>其他任务 请据自己任务的顺序 选择对应的优先级