# 二维云台激光打靶系统 **Repository Path**: haisheer/laser-target-system ## Basic Information - **Project Name**: 二维云台激光打靶系统 - **Description**: 本项目是2025年全国大学生电子设计竞赛E题《二维云台激光打靶系统》的完整实现方案。系统基于STM32F407微控制器,结合k230视觉追踪、PID控制、ZDT步进电机驱动等技术,实现高精度的激光自动瞄准与发射功能。 注:视觉识别代码为“矩形识别.py” - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: https://blog.csdn.net/haisheer/article/details/156866821?spm=1001.2014.3001.5502 - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 0 - **Created**: 2026-01-07 - **Last Updated**: 2026-03-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: C语言, Python, cv ## README # 二维云台激光打靶系统 - 2025电赛E题项目 ## 🎯 项目简介 本项目是2025年全国大学生电子设计竞赛E题《二维云台激光打靶系统》的完整实现方案。系统基于STM32F407微控制器,结合视觉追踪、PID控制、步进电机驱动等技术,实现高精度的激光自动瞄准与发射功能。 **核心功能**: - 实时视觉目标追踪与坐标解析 - 双轴步进电机精确角度控制 - 多模式激光发射策略 - 自适应防摆动优化算法 - 系统状态监控与调试输出 **应用场景**: - 电子设计竞赛项目 - 嵌入式控制系统教学 - 视觉伺服系统研发 - 自动化激光瞄准系统 **技术栈**: - MCU:STM32F407VET6 (ARM Cortex-M4) - 开发环境:Keil MDK-ARM - 通信协议:UART串口通信 - 控制算法:位置式PID、自适应控制 - 视觉处理:矩形检测、坐标变换 ## 📋 目录 - [🎯 项目简介](#项目简介) - [🖥️ 硬件平台](#硬件平台) - [📁 软件架构](#软件架构) - [⚙️ 功能特性](#功能特性) - [🎮 系统工作模式](#系统工作模式) - [🔧 编译与烧录](#编译与烧录) - [📂 详细目录结构](#详细目录结构) - [🚀 使用说明](#使用说明) - [🔬 关键技术](#关键技术) - [🤝 贡献指南](#贡献指南) - [📄 许可证](#许可证) - [📞 联系与支持](#联系与支持) ## 🖥️ 硬件平台 ### MCU核心 - **型号**:STM32F407VET6 (LQFP100封装) - **核心**:ARM Cortex-M4 (带FPU) - **主频**:25MHz外部晶振,PLL倍频至系统时钟 - **内存**: - IRAM: 112KB (0x20000000-0x2001BFFF) - IRAM2: 16KB (0x2001C000-0x2001FFFF) - IROM: 512KB (0x8000000-0x807FFFF) ### 外设配置 #### 串口通信 - **UART1**:调试信息输出 (PA9/PA10) - **UART2**:X轴步进电机控制 (地址0x01, PA2/PA3) - **UART3**:摄像头数据输入 (PD8/PD9) - **UART4**:Y轴步进电机控制 (地址0x02, PC10/PC11) - **UART6**:备用通信接口 (PC6/PC7) #### GPIO控制 - **激光控制**:PA8 (激光继电器控制,低电平开启) - **按键输入**: - KEY1: PE9 (模式切换按键) - KEY2: PE11 (备用按键) - Start: PB6 (系统启动按键) - **状态指示**: - LED1: PA3 (系统状态指示灯) - LED2: PA5 (模式指示指示灯) #### 运动控制 - **TIM2**:定时器,用于任务调度 - **DMA**:多通道DMA,用于UART数据高效传输 ### 外部设备 - **摄像头模块**:通过UART3接收目标坐标数据,格式为`origin:(x,y)\r\n` - **步进电机驱动器**: - X轴:地址0x01,UART2通信,最大速度2000 RPM - Y轴:地址0x02,UART4通信,最大速度2000 RPM - **激光模块**:继电器控制,500mW红色激光,低电平触发 ## 📁 软件架构 ### 模块化设计 ``` 二维云台激光打靶/ ├── MDK-ARM/ # Keil MDK项目文件 │ ├── 2025template.uvprojx # 项目文件 │ ├── 2025template.uvoptx # 配置选项 │ └── 2025template/ # 编译输出目录 ├── Core/ # STM32核心驱动 │ ├── Inc/ # 头文件目录 │ │ ├── main.h # 主程序头文件 │ │ ├── gpio.h # GPIO配置 │ │ ├── usart.h # 串口配置 │ │ ├── tim.h # 定时器配置 │ │ ├── dma.h # DMA配置 │ │ └── stm32f4xx_hal_conf.h # HAL库配置 │ └── Src/ # 源文件目录 │ ├── main.c # 程序入口 │ ├── gpio.c # GPIO驱动 │ ├── usart.c # 串口驱动 │ ├── tim.c # 定时器驱动 │ ├── dma.c # DMA驱动 │ ├── stm32f4xx_it.c # 中断处理 │ └── stm32f4xx_hal_msp.c # HAL底层驱动 ├── Drivers/ # STM32 HAL驱动库 ├── bsp/ # 板级支持包 │ ├── bsp_system.h # 系统头文件 │ ├── schedule.c # 任务调度器 │ ├── key_bsp.c # 按键处理模块 │ ├── uart_bsp.c # UART数据处理 │ ├── step_motor_bsp.c # 步进电机控制 │ ├── pi_bsp.c # PI控制算法 │ ├── laser_bsp.c # 激光控制系统 │ └── *.h # 对应头文件 ├── app/ # 应用程序层 │ ├── Emm_V5.c # 步进电机驱动库 │ ├── Emm_V5.h │ ├── mypid.c # PID控制器 │ └── mypid.h ├── ringbuffer/ # 环形缓冲区组件 │ ├── ringbuffer.c │ └── ringbuffer.h ├── 矩形识别.py # Python摄像头矩形识别脚本 ├── *.md # 项目文档文件 └── README.md # 项目说明文档(本文档) ``` ### 核心模块说明 #### 1. 调度系统 (`schedule.c`) - 基于时间片的任务调度机制 - 周期性任务管理(激光控制、按键扫描、视觉处理等) - 任务执行时间控制与系统状态监控 #### 2. 视觉处理系统 (`pi_bsp.c`) - 摄像头数据接收与解析(UART3 DMA接收) - 目标坐标提取与误差计算 - 自适应PID控制算法 - 防摆动优化与运动规划 #### 3. 电机控制系统 (`step_motor_bsp.c`, `Emm_V5.c`) - 双轴步进电机驱动与控制 - 速度与位置闭环控制 - 回零功能与精度校准 - 运动平滑与防抖动算法 #### 4. 激光控制系统 (`laser_bsp.c`) - 激光发射控制逻辑与状态管理 - 多模式工作策略(自动/手动) - 安全保护机制与超时处理 - 模式切换与优先级管理 #### 5. 通信系统 (`uart_bsp.c`) - UART数据接收与环形缓冲区管理 - 协议解析与错误检测 - 多通道通信协调 #### 6. PID控制系统 (`mypid.c`) - 位置式PID算法实现 - 参数自适应整定 - 积分分离与微分先行 - 死区管理与输出限幅 ## ⚙️ 功能特性 ### 视觉追踪系统 - **摄像头数据**:通过UART3接收 `origin:(x,y)\r\n`格式坐标 - **参考点**:固定激光准星坐标 (320, 340) - **误差计算**: - error_x = 320 - origin_x - error_y = 340 - origin_y - **自适应滤波**:根据运动状态动态调整滤波强度 - **运动预测**:基于历史数据预测目标轨迹 ### 电机控制 - **X轴电机**:地址0x01,UART2通信,最大速度2000 RPM - **Y轴电机**:地址0x02,UART4通信,最大速度2000 RPM - **控制方式**:PWM速度控制与位置控制双闭环 - **回零功能**:Y轴自动回零,精度校准算法 - **平滑运动**:加速度控制与S曲线规划 ### PID控制系统 - **位置式PID**:双闭环控制结构(位置环+速度环) - **参数配置**: - Kp = 1.5 (比例系数) - Ki = 0.00015 (积分系数) - Kd = 0.012 (微分系数) - 最大输出:30 RPM - **自适应调整**: - 远距离:快速响应模式(12 RPM) - 中距离:平衡控制模式(6 RPM) - 近距离:精确控制模式(3 RPM) - 极近距离:超精确模式(0.4 RPM) - **死区管理**:6像素死区,防止微小振荡 ### 防摆动优化 - **渐进式积分管理**:根据距离动态减少积分累积 - **自适应变化率限制**:距离越近变化限制越严格 - **智能摆动检测**:自动识别并抑制振荡 - **超细分距离控制**:5段式精确控制策略 - **平滑接近算法**:保证系统平稳接近目标 ## 🎮 系统工作模式 ### 模式0: 待机模式 - **状态**:电机未使能,激光强制关闭 - **指示灯**:LED1和LED2均灭 - **操作**:按下START键启动系统 - **适用场景**:系统初始化与安全检查 ### 模式1: 定时发射模式 - **功能**:Y轴复位后1.5秒自动定位发射 - **特点**:无目标追踪,X轴不运动 - **指示灯**:LED1亮,LED2灭 - **触发条件**:Y轴回零完成1.5秒后 - **适用场景**:固定目标打靶与基础测试 ### 模式2: 按键角度模式 - **功能**:先通过角度按键预设启动后的转动角度,当按下START按键后自动转动并发射 - **特点**:支持目标追踪,双轴运动 - **指示灯**:LED1灭,LED2亮 - **触发条件**:按下START键开始计时 - **适用场景**:移动目标静态打靶 ### 模式3: 增强稳定模式 - **功能**:识别目标立即发射,持续20秒 - **特点**:高级滤波算法,抗干扰性强 - **指示灯**:LED1和LED2均亮 - **触发条件**:目标进入稳定区域 - **适用场景**:复杂环境下高精度动态追踪打靶 ## 🔧 编译与烧录 ### 开发环境 - **IDE**:Keil MDK-ARM (Version 5) - **编译器**:ARM Compiler (V5.06 update 7) - **调试器**:J-Link (配置为Segger JL2CM3.dll) - **目标芯片**:STM32F407VET6 ### 编译设置 #### 预定义宏 ```c USE_HAL_DRIVER STM32F407xx ``` #### 优化级别 - Level 2 (-O2):平衡性能与代码大小 #### 包含路径 ``` ../Core/Inc ../Drivers/STM32F4xx_HAL_Driver/Inc ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy ../Drivers/CMSIS/Device/ST/STM32F4xx/Include ../Drivers/CMSIS/Include ../bsp ../app ../ringbuffer ``` ### 烧录配置 - **编程算法**:STM32F4xx_512.FLM - **起始地址**:0x8000000 - **设备ID**:2BA01477 - **调试协议**:ARM CoreSight SW-DP ### 调试配置 #### 断点设置 - `main.c` 第120行:系统初始化检查点 - `main.c` 第121行:调度器启动检查点 - `main.c` 第122行:电机初始化检查点 #### 观察变量 ```c latest_red_laser_coord // 目标坐标 latest_green_laser_coord // 激光准星坐标 x_motor_angle // X轴电机角度 y_motor_angle // Y轴电机角度 system_mode // 系统工作模式 laser_state // 激光发射状态 pid_x_output // X轴PID输出 pid_y_output // Y轴PID输出 error_distance // 当前误差距离 adaptive_mode // 自适应控制模式 ``` ## 📂 详细目录结构 ### MDK-ARM项目目录 ``` MDK-ARM/ ├── 2025template.uvprojx # Keil项目文件 ├── 2025template.uvoptx # 项目配置选项 ├── 2025template.uvguix.* # 用户界面配置文件 ├── 2025template.code-workspace # VS Code工作空间 ├── build/ # 编译输出目录 │ ├── 2025template.axf # 可执行文件 │ ├── 2025template.sct # 分散加载文件 │ └── *.json # 编译配置 ├── DebugConfig/ # 调试配置 │ └── STM32F407VE_STLINK.ccdg # ST-Link调试配置 ├── RTE/ # 运行时环境 │ └── _2025template/ # 项目特定RTE文件 │ └── RTE_Components.h # RTE组件配置 ├── EventRecorderStub.scvd # 事件记录器配置 ├── JLinkLog.txt # J-Link调试日志 ├── JLinkSettings.ini # J-Link设置文件 ├── startup_stm32f407xx.s # 启动汇编文件 └── startup_stm32f4xx.lst # 启动文件列表 ``` ### 核心源代码目录 ``` Core/ ├── Inc/ # 头文件目录 │ ├── main.h # 主程序头文件 │ ├── gpio.h # GPIO配置头文件 │ ├── usart.h # 串口配置头文件 │ ├── tim.h # 定时器配置头文件 │ ├── dma.h # DMA配置头文件 │ ├── stm32f4xx_hal_conf.h # HAL库配置头文件 │ └── stm32f4xx_it.h # 中断处理头文件 └── Src/ # 源文件目录 ├── main.c # 主程序文件 ├── gpio.c # GPIO驱动文件 ├── usart.c # 串口驱动文件 ├── tim.c # 定时器驱动文件 ├── dma.c # DMA驱动文件 ├── stm32f4xx_it.c # 中断处理文件 ├── stm32f4xx_hal_msp.c # HAL底层驱动文件 └── system_stm32f4xx.c # 系统时钟配置文件 ``` ### 应用程序目录 ``` app/ ├── Emm_V5.c # 步进电机驱动库 ├── Emm_V5.h # 步进电机驱动头文件 ├── mypid.c # PID控制器实现 └── mypid.h # PID控制器头文件 ``` ### 板级支持包目录 ``` bsp/ ├── bsp_system.h # 系统配置头文件 ├── schedule.c # 任务调度器 ├── schedule.h # 任务调度器头文件 ├── key_bsp.c # 按键处理模块 ├── key_bsp.h # 按键处理头文件 ├── uart_bsp.c # UART数据处理 ├── uart_bsp.h # UART数据头文件 ├── step_motor_bsp.c # 步进电机控制 ├── step_motor_bsp.h # 步进电机控制头文件 ├── pi_bsp.c # PI控制算法 ├── pi_bsp.h # PI控制头文件 ├── laser_bsp.c # 激光控制系统 └── laser_bsp.h # 激光控制头文件 ``` ### Python脚本 - **矩形识别.py**:基于01Studio CanMV K230平台的摄像头矩形检测脚本,实现全角度圆形校正与坐标发送功能。 ### 第三方组件 ``` ringbuffer/ # 环形缓冲区组件 ├── ringbuffer.c # 环形缓冲区实现 └── ringbuffer.h # 环形缓冲区头文件 ``` ## 🚀 使用说明 ### 硬件连接 1. **电源连接**: - 3.3V供电至STM32开发板 - 步进电机驱动器独立供电(24V DC) - 激光模块继电器控制电路(5V-12V) 2. **串口连接**: - UART1 (PA9/PA10) → USB转串口模块,用于调试输出 - UART2 (PA2/PA3) → X轴步进电机驱动器 - UART3 (PD8/PD9) → 摄像头模块TX/RX - UART4 (PC10/PC11) → Y轴步进电机驱动器 3. **控制接口**: - KEY1 (PE9):模式切换按键 - KEY2 (PE11):备用功能按键 - Start (PB6):系统启动按键 - Laser (PA8):激光控制信号 ### 系统启动流程 1. 上电初始化 2. 外设配置检测 3. 系统模式选择(默认为模式0) 4. 按下START键启动系统 5. 根据模式执行相应功能 ### 操作指南 #### 模式切换 - **短按KEY1**:切换激光控制模式(手动/自动) - **短按KEY2**:循环切换系统工作模式(0→1→2→3→0) - **长按KEY1**:手动激光控制(按下开启,松开关闭) #### 系统启动 - **START按键**:启动当前模式的系统功能 - **模式0**:仅使能电机,进入待机状态 - **模式1-3**:根据模式执行相应追踪与发射逻辑 ### 调试信息解读 系统通过UART1输出详细的调试信息,包括: - 系统状态与模式切换 - 摄像头数据解析结果 - PID控制输出与电机状态 - 激光发射状态与计时信息 - 错误检测与异常处理 典型调试输出: ``` === 2D Gimbal Tracking System Started === UART1: Debug output UART2: X Motor (Addr:1) UART3: Camera data UART4: Y Motor (Addr:2) Motor Max Speed: 50 RPM Waiting for camera data... Origin: (301,202) Status: Origin valid=1(301,202), Jiguang fixed=1(320,340) PID: origin(301,202) -> jiguang(320,340) out_x=19.00 out_y=138.00 X Motor Addr:1 Func:0x06 Received Y Motor Addr:2 Func:0x06 Received ``` ## 🔬 关键技术 ### 实时调度系统 - **时间片轮转调度**:确保关键任务及时执行 - **优先级管理**:视觉处理与电机控制优先 - **容错机制**:任务超时检测与自动恢复 - **资源优化**:高效利用MCU计算与存储资源 ### 自适应PID控制 - **参数自整定**:根据误差距离动态调整PID参数 - **积分分离**:近距离时减少积分累积,防止超调 - **微分先行**:提高系统响应速度,减少滞后 - **死区优化**:智能死区管理,平衡精度与稳定性 ### 视觉伺服算法 - **坐标滤波**:卡尔曼滤波与移动平均结合 - **运动预测**:基于历史数据预测目标轨迹 - **误差补偿**:系统延迟与机械误差补偿 - **自适应阈值**:根据环境动态调整检测阈值 ### 防摆动优化 - **多层防摆动机制**:从参数调整到实时检测的多层防护 - **智能振荡抑制**:自动识别并抑制系统振荡 - **平滑接近算法**:保证系统平稳接近目标 - **分段控制策略**:5段式距离控制,精细化速度管理 ### 通信协议设计 - **自定义串口协议**:高效可靠的数据传输 - **环形缓冲区管理**:数据缓冲与流量控制 - **错误检测与重传**:确保通信可靠性 - **多通道协调**:并行处理多个通信接口 ## 🤝 贡献指南 ### 代码规范 1. **命名规范**: - 函数名:小写加下划线,如 `laser_control_init()` - 变量名:小写加下划线,如 `target_coordinate` - 宏定义:大写加下划线,如 `MOTOR_MAX_SPEED` - 结构体:`_t`后缀,如 `LaserControl_t` - 枚举:`_t`后缀,如 `LaserState_t` 2. **注释要求**: - 文件头注释:简要说明文件功能、作者、版本 - 函数注释:说明功能、参数、返回值、注意事项 - 关键代码注释:复杂算法说明、重要逻辑解释 - 调试注释:临时调试代码需明确标记 3. **代码风格**: - 使用4空格缩进,禁止使用Tab - 花括号换行风格一致(K&R风格) - 一行不超过80字符,保持代码可读性 - 函数长度控制在50行以内,保持模块化 ### 提交规范 1. **提交信息格式**: ``` 类型(模块): 简要描述 详细说明(可选) ``` 类型包括: - `feat`:新功能 - `fix`:Bug修复 - `docs`:文档更新 - `style`:代码格式调整 - `refactor`:代码重构 - `test`:测试相关 - `chore`:构建工具或依赖更新 2. **分支管理**: - `main`:稳定版本分支 - `develop`:开发分支 - `feature/*`:功能开发分支 - `bugfix/*`:缺陷修复分支 - `hotfix/*`:紧急修复分支 3. **Pull Request流程**: - Fork项目仓库 - 创建功能分支 (`feature/your-feature`) - 提交代码更改 - 编写测试用例 - 更新相关文档 - 发起Pull Request - 等待代码审查 - 根据反馈修改 - 合并到主分支 ### 开发流程 1. **环境设置**: - 安装Keil MDK-ARM开发环境 - 配置J-Link或ST-Link调试器 - 安装串口调试工具(如SecureCRT、Putty) 2. **开发步骤**: - 分析需求,设计模块接口 - 编写单元测试,确保功能正确性 - 实现核心功能,注重代码质量 - 进行集成测试,验证系统协调性 - 编写使用文档,方便用户理解 3. **质量保证**: - 代码审查,确保符合规范 - 功能测试,验证系统稳定性 - 性能测试,评估系统响应速度 - 兼容性测试,确认硬件适配性 ## 📄 许可证 本项目采用MIT许可证,详情请参阅LICENSE文件。 ### 版权声明 - Copyright (c) 2025 全国大学生电子设计竞赛参赛团队 - 基于STM32CubeF4 HAL驱动开发 - 步进电机驱动库为自定义实现 ### 使用限制 - 本代码仅供学习与竞赛使用 - 禁止用于商业用途 - 引用请注明出处 - 保留所有权利 ### 免责声明 本项目为开源项目,作者不对使用本代码所造成的任何直接或间接损失负责。使用者需自行承担使用风险。 ## 📞 联系与支持 ### 问题反馈 如遇到技术问题或发现Bug,请通过以下方式反馈: 1. GitHub Issues页面提交问题 2. 邮件联系项目维护者 3. 技术论坛讨论 ### 技术支持 - **硬件问题**:检查硬件连接与电源 - **软件问题**:查看调试输出与错误日志 - **算法问题**:参考相关文档与代码注释 - **性能优化**:调整PID参数与系统配置 ### 更新日志 - **v1.0.0** (2025-01-06):初始版本发布 - 完整系统功能实现 - 多模式工作系统 - 防摆动优化算法 - 详细文档说明 --- **项目维护者**:2025电赛E题参赛团队 **最后更新**:2025年1月7日 **版本**:v1.0.0 *让激光精准命中目标,从每一行代码开始*