作业 2:电机控制器模块

一、作业简介

在本次作业中,我们将开发一个电机控制器模块,实现电机的控制功能。该模块包括 CAN 通信驱动、电机驱动和 PID 控制器驱动等子模块。任务是集成这些功能,实现对电机的精确控制和状态反馈。

本作业重点在于应用 CAN 通信、无刷电机 GM6020 和 M3508,以及实现 PID 控制器。

二、功能目标

请在提供的模板工程基础上完成以下功能。除非另有说明,所有功能都应在 CAN 通信正常和电机断线后重新连接的情况下保持安全运行。

1. 控制电机使能/失能

使用板上的 BTN1 实现按键切换:第一次按下后允许电机输出并开始转动,下一次按下后停止电机,发送给电调的目标电流应为 0。注:停止状态下仍需按通信周期发送零电流,而非停止通讯。

2. 实现与电机的双向通讯

成功读取电机的ID,原始编码器角度,转子转速,电流,温度等,并计算接收频率。

通过CAN通讯向电机发送期望电流值,控制电机转动。

3. 速度与位置控制

通过PID控制算法实现电机的速度控制和位置控制,使得电机能够快速稳定的达到目标

三、模板代码说明

本次作业向各位提供一个基础的template代码,里面已经在cubemx配好了CAN的基础参数,同时在已经修改了makefile,使得其可以编译CPP代码。

模板工程: 打开 Assignment 2 模板工程下载页面

1. DJIMotor.hpp

  • getFilter:通过传入 filterID 和 filterMaskID 构造 CAN 接收的 filter
  • getTxHeader:通过传入 电机ID 和 电机类型 构造控制帧的 header
  • init:通过传入 回调函数 和 filter 初始化CAN
  • constructTxData:通过传入buffer以及控制电机类型构造CAN的控制帧
  • send:将 header 和 data[8] 通过 CAN 发送给电机。

2. PID.hpp

  • calculate:根据目标值和反馈值计算出PID的输出
  • resetPIDState:重置PID的状态
  • pidClampMinMax:限制PID输出,防止数字溢出

3. Evaluation.hpp 和 Evaluation.o

模板已经实例化 eval,且 Test 的实现代码不可修改。以下函数均返回一个 float 目标值:

  • eval.eval_Sin():正弦波;
  • eval.eval_Square():方波;
  • eval.eval_Triangle():三角波;
  • eval.eval_FakeAim():假自瞄目标。(模仿在自瞄的yaw target)

可以通过 setFrequency、setCenter 和 setAmplitude 修改波形参数。请把相应返回值作为位置 PID 的目标,记录跟随误差,并分别完成四种波形的测试。不得修改 Evaluation 中用于评测的代码。

四、作业步骤

  1. 使用 STM32CubeMX 配置 CAN 外设并生成代码。
  2. 使用 HAL 库函数编写 CAN 发送及接收程序,确保数据能够正确传输。
  3. 实现电机驱动,管理电机的实时状态,实现指令接口,并具备一定的错误处理机制。
  4. 设计 PID 控制器,为电机的闭环控制提供接口。
  5. 以 1000 Hz 的频率实现 2 个电机的通信收发。
  6. 按照设定的目标对电机进行闭环控制。
  7. 利用板上的外设(如 LED)进行模块状态提示,包括连接状态、运行状态和报警等。
  8. 实现代码模块化,分文件编写各个模块和驱动;学习使用 C++ 的各种特性,例如命名空间和面向对象编程。

指令来源: 上位机手动更改、遥控器控制信号、Ozone 更改。

五、评分政策

每一项评分均基于现场 Demo 的实际表现。

Basics(题目标注合计:110%)

评分项目 占比
按钮控制电机启停 10%
同时读取每个电机的反馈频率,且所有反馈频率不低于 980 Hz 10%
M3508 转子速度控制 10%
GM6020 绝对角度和相对角度控制 30%
角度波形跟随 30%
错误检测与处理 10%
合计 100%

说明: 上表沿用题目中各项标注的分值;题目列出的 Basics 分项比例合计为 110%,请以课程现场公布的最终评分规则为准。

六、基础要求与验收指标

1. 按钮控制电机启停(10%)

实现通过按钮控制电机开始和停止旋转。

2. 电机反馈频率(10%)

能够同时读取每个电机的反馈频率,要求所有反馈频率不低于 980 Hz。

3. M3508 转子速度控制(10%)

实现对 M3508 的转子速度控制,要求相应速度和误差范围处于合理范围内。

验收指标 要求 占比
速度曲线 在所有情况下速度曲线不得发散 4%
角速度波动 电机转子角速度允许有一定波动,根据稳定时的最大值和最小值计算波动幅度;可使用 Ozone Graph 功能,无需代码实现 —
3000 rpm 目标速度 误差幅度在 ±100 rpm 以内 1%
3000 rpm 目标速度 误差幅度在 ±70 rpm 以内 2%
3000 rpm 目标速度 误差幅度在 ±50 rpm 以内 3%

4. GM6020 绝对角度和相对角度控制(30%)

实现 GM6020 的绝对角度控制和相对角度控制:

  • 绝对角度:电机绝对编码器对应的位置。
  • 相对角度:以当前位置为基准,按顺时针或逆时针方向转动指定角度。

本项总分为 30%,由运行安全 5%、绝对/相对角度控制 15%,以及响应速度和过冲 10% 组成。

4.1 基本控制功能

验收指标 要求 占比
运行安全 在所有情况下不得失控旋转 5%
控制类型 实现绝对角度控制和相对角度控制 15%

4.2 控制指令定义与实现

绝对角度控制和相对角度控制应使用不同的目标角度定义:

控制类型 目标角度定义 实现要求
相对角度控制 以收到指令时的当前位置为基准,按顺时针或逆时针方向转动指定角度 x° 先记录指令生效时的当前位置,再叠加带方向的角度增量,得到本次运动的目标位置
绝对角度控制 电机绝对编码器对应的目标位置 x° 直接将编码器角度 x° 作为目标位置进行控制,不叠加本次指令前的当前位置

Senior 可能会交替下达上述两类指令,系统需要能够连续、交替地处理:

  1. 以当前位置为基准,按顺时针或逆时针方向旋转指定角度 x°。
  2. 旋转至绝对编码器对应的目标角度 x°。

提示: 可以在 Ozone 中通过修改变量的值设置命令。

4.3 响应速度和过冲(10%:速度 5% + 误差 5%)

本项共 10%,其中响应速度占 5%,过冲后的误差范围占 5%。转过 90°,记录达到特定误差 ±θ (rad) 所需的时间 t (ms)。t 从改变目标位置开始计时,到第一次达到目标位置且之后不再超出误差 θ 为止。

响应速度达标时间(速度部分,满分 5%) 得分
t ≤ 1000 ms 1%
t ≤ 500 ms 3%
t ≤ 250 ms 5%
误差范围(误差部分,满分 5%) 得分
θ ≤ ±π/6 1%
θ ≤ ±π/15 2%
θ ≤ ±0.1 3%
θ ≤ ±0.05 4%
θ ≤ ±0.01 5%

5. 角度波形跟随(30%)

角度控制要求跟随模板中生成的波形函数,跟随效果和误差均应处于合理范围内。

波形 验收指标 占比
Square Wave 过冲小于 Amplitude × 5% 5%
Triangle Wave 跟随时误差小于 0.05 rad 5%
Sine Wave 跟随时误差小于 0.05 rad 5%
Fake Aim 跟随时误差小于 0.02 rad;跳变时能够较快恢复跟随状态 15%

6. 错误检测与处理(10%)

要求在任意情况下断连后重新连接,系统均不会失控运行。

七、Bonus

Bonus 项目用于鼓励进一步完善设计和控制算法。

Bonus:25%

加分项目 占比
使用面向对象的编程方法:使用 class 与命名空间,构造合理的构造函数,并区分私有函数和公有函数 10%
使用双环 PID 进行位置控制 10%
实现 M3508 经过减速箱后的相对位置 PID 控制 5%
合计 25%

八、提交

提交分为以下两个部分:

  1. 将完成后的代码(整个 STM32 项目)压缩,并在 Canvas 上提交。
  2. 在我们位于 Hall 8 的实验室进行线下演示,展示如何通过 STM32CubeMX 构建项目、说明代码逻辑原理并展示实现效果。

实验室开放时间

  • 周中:每日 18:00–23:00。
  • 周末:每日 12:00–24:00。

如果想在其他时间进行演示,请提前通过 WeChat 联系 TA。否则,我们无法保证实验室有人接待。

九、截止日期

最终提交截止时间为 2026 年 10 月 9 日 22:00:00。

仅在 Canvas 上提交代码视为无效提交。请在实验室完成演示,向 TA 展示效果并确认完成情况后,再提交代码。

十、延迟提交政策

每迟交一分钟扣 1 分,最高扣 100 分。

例如,作业 2 的截止时间为 10 月 9 日 22:00:00;如果在 10 月 9 日 23:00:00 提交作业,将扣 60 分。作业最低分数为零分:扣除迟交分数及其他扣分后的负分将重置为零分。

十一、备注与参考资料(Remarks)

最后更新:2026年10月1日 21:24:44