# ql-control-hero **Repository Path**: wizard-lhx/ql-control-hero ## Basic Information - **Project Name**: ql-control-hero - **Description**: 齐鲁战队英雄电控程序 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-09-18 - **Last Updated**: 2023-12-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 齐鲁战队英雄电控程序 ## 1 英雄机器人使用说明 ![遥控器](./image/遥控器.jpg) ### 1.1 开关说明 1. 右边打到最上面所有电调输出电流为零,起到保护开关的作用。右边中间为底盘跟随云台的遥控器遥控模式,云台转到哪个角度,底盘就转到哪个角度。右边下面为学以致用比赛模式。 2. 左边打到最上面为学以致用比赛赛题一模式,底盘会相应上位机输入的位置和角度。左边达到中间是学以致用比赛赛题二模式,底盘不会响应位置输入,只有云台响应角度输入。 3. 在右边开关在中间位置时,响应遥控器输入,右摇杆四个方向分别对应车子前后左右移动。左摇杆上下打对应云台俯仰角增大减小,左右打对应云台偏航角左偏右偏。同时由于没有滑环,底盘需要跟随云台,所以底盘也会旋转到对应角度。 ### 1.2 学以致用比赛 UWB 摆放说明 ![UWB](./image/UWB.png) 左下角开始数顺时针摆放的位置依次是 0,1,2,3。 ## 2 程序说明 工程分为三层,APP 层是各个控制任务,BSP 层是各种算法,外设的驱动,MCU 层是使用 CubeMX 创建的单片机最底层的外设驱动。我认为将 CubeMX 创建的底层驱动工程与最终任务工程分开使得不用直接在 CubeMX 创建的文件里写(感觉很别扭),需要将自己写的代码写在一些注释区域里,否则用 CubeMX 重新构建底层驱动时会把自己写的东西覆盖。 ### 2.1 开发环境 - Toolchain/IDE : MDK-ARM V5 - STM32F4xx_DFP Packs:2.17.0 - STM32CubeMx:6.9.1 - package version: STM32Cube FW_F4 V1.27.1 - FreeRTOS version: 10.3.1 - CMSIS-RTOS version: 2 ### 2.2 调试器推荐 进行 pid 调节时使用 jlink 结合 ozone 可以实时查看数据波形,同时可以导出 csv 数据进行分析。 ## 3 调试过程遇到问题 ### 3.1 时钟源 时钟源选择错误,首先是陶瓷晶振选成了自己的 Bypass 晶振。然后晶振的频率选择不对 12M 选成了 8M,这两个原因都导致时钟树初始化时进入了错误中断(Error_Handle)中。 ### 3.2 大疆遥控器波特率 应该是 10k 的波特率。(设成了 115200)。 ### 3.3 姿态解算 1. 使用 AHRS 算法解算,需要定时执行解算任务,然后将陀螺仪加速度计数据单位转换好后,就可以完成。 2. 同时陀螺仪的零飘问题很影响姿态解算,需要计算静置一段时间计算陀螺仪数据平均值,然后减去零偏。 ### 3.4 底盘跟随云台 #### 3.4.1 云台控制 云台进行双环的控制,外环是角度环,内环是速度环。外环的反馈值为姿态解算的姿态角,内环反馈值为陀螺仪的角速度。调节 pid 参数时,先调内环,再调外环。进行 yaw 轴速度控制时,设定值给零,调节到突然给云台一个力,云台能快速停下。角度控制时给定一个角度,很难掰动云台。同时调节时无论是内环还是外环,都要进行限幅,例如当角度超过一定值时,电机电流全为零。进行 pitch 轴速度控制时,结合得到的 pitch 角,小于一定角度时给往上的速度,大于一定角度时给往下的速度,调节到云台能匀速点头。角度控制时同 yaw 轴调节方法一样。限幅也同样需要。 #### 3.4.2 底盘控制 底盘跟随时,控制量是云台与底盘的角度差,这个可以通过 yaw 轴电机的编码器获得。所以跟随的思路就是云台角度与设定值有差先转,底盘与云台有角度差后转,云台调节到指定角度,但底盘还没有时,由于底盘还继续转动,云台会回转。总的来说就是,云台 yaw 角控制量是姿态解算的角度,底盘的控制量是电机编码值与底盘位于正前方编码器值的差。 ### 3.5 串口接收数据 当接收大量数据时,频繁的进入串口中断,CPU 还要有大量任务时就不行。可以使用 DMA 接收,接收到数据时 DMA 自动将数据移到指定位置,可以在 DMA 完成和半完成中断或任务中完成数据的处理。 ### 3.6 绝对编码器数值跳变 由于绝对编码器会有从最小值跳到最大值的问题,所以有时需要进行判断,例如 M3508 拨弹电机需要进行角度控制时,编码器从 0 跳到 8191,并不是转了一圈而是转过了一点。