作业 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 接收的 filtergetTxHeader:通过传入 电机ID 和 电机类型 构造控制帧的 headerinit:通过传入 回调函数 和 filter 初始化CANconstructTxData:通过传入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 中用于评测的代码。
四、作业步骤
- 使用 STM32CubeMX 配置 CAN 外设并生成代码。
- 使用 HAL 库函数编写 CAN 发送及接收程序,确保数据能够正确传输。
- 实现电机驱动,管理电机的实时状态,实现指令接口,并具备一定的错误处理机制。
- 设计 PID 控制器,为电机的闭环控制提供接口。
- 以 1000 Hz 的频率实现 2 个电机的通信收发。
- 按照设定的目标对电机进行闭环控制。
- 利用板上的外设(如 LED)进行模块状态提示,包括连接状态、运行状态和报警等。
- 实现代码模块化,分文件编写各个模块和驱动;学习使用 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 可能会交替下达上述两类指令,系统需要能够连续、交替地处理:
- 以当前位置为基准,按顺时针或逆时针方向旋转指定角度
x°。 - 旋转至绝对编码器对应的目标角度
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% |
八、提交
提交分为以下两个部分:
- 将完成后的代码(整个 STM32 项目)压缩,并在 Canvas 上提交。
- 在我们位于 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)
- 实验室中的 M3508 电机使用官方减速箱,减速比为
187:3591。 - 有关 GM6020 电机控制的内容,请参考 RoboMaster GM6020 官方手册。
- 有关 PID 的内容,可以参考: