一、任务
设计并制作一套简易旋转倒立摆及其控制装置。旋转倒立摆的结构如图 1 所示。电动机 A 固定在支架 B 上,通过转轴 F 驱动旋转臂 C 旋转。摆杆 E 通过转轴 D 固定在旋转臂 C 的一端,当旋转臂 C 在电动机 A 驱动下作往复旋转运动时,带动摆杆 E 在垂直于旋转臂 C 的平面作自由旋转。
二、要求
1.基本要求
(1)摆杆从处于自然下垂状态(摆角 0°)开始,驱动电机带动旋转臂作往复旋转使摆杆摆动,并尽快使摆角达到或超过-60°~ +60°;
(2)从摆杆处于自然下垂状态开始,尽快增大摆杆的摆动幅度,直至完成圆周运动;
(3)在摆杆处于自然下垂状态下,外力拉起摆杆至接近 165°位置,外力撤除同时,启动控制旋转臂使摆杆保持倒立状态时间不少于 5s;期间旋转臂的转动角度不大于 90°。
2.发挥部分
(1)从摆杆处于自然下垂状态开始,控制旋转臂作往复旋转运动,尽快使摆杆摆起倒立,保持倒立状态时间不少于 10s;
(2)在摆杆保持倒立状态下,施加干扰后摆杆能继续保持倒立或 2s 内恢复倒立状态;
(3)在摆杆保持倒立状态的前提下,旋转臂作圆周运动,并尽快使单方向转过角度达到或超过 360°;
(4)其他。
三、说明
1.旋转倒立摆机械部分必须自制,结构要求如下:硬质摆杆 E 通过转轴 D 连接在旋转臂 C 边缘,且距旋转臂 C 轴心距离为 20cm±5cm;摆杆的横截面为圆形或正方形,直径或边长不超过 1cm,长度在 15cm±5cm 范围内;允许使用传感器检测摆杆的状态,但不得影响摆杆的转动灵活性;图 1 中支架 B 的形状仅作参考,其余未作规定的可自行设计结构;电动机自行选型。
2.摆杆要能够在垂直平面灵活旋转,检验方法如下:将摆杆拉起至水平位置后松开,摆杆至少能够自由摆动 3 个来回。
3.除电动机 A 之外,装置中不得有其他动力部件。
4.摆杆自然下垂状态是指摆角为0°位置,见图 2。
5.摆杆倒立状态是指摆杆在-165°至 165°范围内。
6.基本要求(1)、(2)中,超过 30s视为失败;发挥部分(1)超过 90s视为失败;发挥部分(3)超过 3分钟即视为失败;以上各项,完成时间越短越好。
7.摆杆倒立时施加干扰的方法是,以 15cm 长细绳栓一只 5 克砝码,在摆杆上方将砝码拉起 15°~45°,释放后用砝码沿摆杆摆动的切线方向撞击摆杆上端 1~2cm 处;以抗扰动能力强弱判定成绩。
8.测试时,将在摆杆后 1~2cm 处固定一如图 2 所示轻质量角器,以方便观察摆杆的旋转角度。
GPT-4o给出的设计方案:
本题的任务是设计并制作一套自动旋转倒立摆控制装置。该装置通过电动机A驱动旋转臂B和连接杆E,实现摆杆F的平衡控制与自由旋转。以下是详细的设计方案:
倒立摆系统设计:
控制系统:
机械结构设计:
响应时间:
转动稳定性:
旋转范围:
主控制单元:
传感器接口:
电机驱动电路:
STM32 MCU:
角度传感器:
H桥驱动芯片:
#include "stm32f4xx.h"
#define TARGET_ANGLE 0 // 0度为平衡目标
#define MAX_PWM 1000 // PWM最大值
#define KP 2.0 // 比例系数
#define KI 1.0 // 积分系数
#define KD 0.5 // 微分系数
volatile int16_t current_angle = 0;
// PID控制变量
volatile float integral = 0;
volatile float previous_error = 0;
void init_system() {
// 初始化代码
// 初始化传感器,电机驱动,串口等
}
int16_t read_angle() {
// 读取角度传感器的数据
// 假设用ADC读取模拟量然后转换为角度
}
void set_motor_pwm(int16_t pwm_value) {
// 设置电机PWM值
// 根据需要选择正反转控制
}
void update_control() {
float error = TARGET_ANGLE - current_angle;
integral += error;
float derivative = error - previous_error;
float output = KP * error + KI * integral + KD * derivative;
previous_error = error;
int16_t pwm_value = (int16_t)(output);
if (pwm_value > MAX_PWM) pwm_value = MAX_PWM;
if (pwm_value < -MAX_PWM) pwm_value = -MAX_PWM;
set_motor_pwm(pwm_value);
}
void main() {
init_system();
while (1) {
current_angle = read_angle();
update_control();
}
}
FPGA控制倒立摆平衡,假设FPGA用于实现倒立摆控制任务,以下是简化的Verilog代码示例:
module pid_controller(
input wire clk,
input wire rst_n,
input wire [15:0] current_angle,
output reg [15:0] motor_pwm
);
parameter TARGET_ANGLE = 16'd0;
parameter MAX_PWM = 16'd1000;
parameter KP = 16'd2;
parameter KI = 16'd1;
parameter KD = 16'd0.5;
reg signed [15:0] error, previous_error;
reg signed [31:0] integral;
reg signed [15:0] derivative;
reg signed [31:0] output;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
error <= 16'd0;
previous_error <= 16'd0;
integral <= 32'd0;
output <= 32'd0;
end else begin
error <= TARGET_ANGLE - current_angle;
integral <= integral + error;
derivative <= error - previous_error;
output <= KP * error + KI * integral + KD * derivative;
previous_error <= error;
if (output > MAX_PWM) motor_pwm <= MAX_PWM;
else if (output < -MAX_PWM) motor_pwm <= -MAX_PWM;
else motor_pwm <= output;
end
end
endmodule
本题考察的知识点