一、任务
设计一电机控制系统,控制物体在倾斜(仰角≤100 度)的板上运动。在一白色底板上固定两个滑轮,两只电机(固定在板上)通过穿过滑轮的吊绳控制一物体在板上运动,运动范围为 80cm×100cm。物体的形状不限,质量大于 100 克。物体上固定有浅色画笔,以便运动时能在板上画出运动轨迹。板上标有间距为 1cm 的浅色坐标线(不同于画笔颜色),左下角为直角坐标原点, 示意图如下。
二、要求
1、基本要求:
(1)控制系统能够通过键盘或其他方式任意设定坐标点参数;
(2)控制物体在 80cm×100cm 的范围内作自行设定的运动,运动轨迹长度不小于100cm,物体在运动时能够在板上画出运动轨迹,限 300 秒内完成;
(3)控制物体作圆心可任意设定、直径为 50cm 的圆周运动,限 300 秒内完成;
(4)物体从左下角坐标原点出发,在 150 秒内到达设定的一个坐标点(两点间直线距
离不小于 40cm)。
2、发挥部分
(1)能够显示物体中画笔所在位置的坐标;
(2)控制物体沿板上标出的任意曲线运动(见示意图),曲线在测试时现场标出,线宽1.5cm~1.8cm,总长度约 50cm,颜色为黑色;曲线的前一部分是连续的,长约30cm;后一部分是两段总长约 20cm 的间断线段,间断距离不大于 1cm;沿连续曲线运动限定在 200 秒内完成,沿间断曲线运动限定在 300 秒内完成;
(3)其他。
三、说明
1、物体的运动轨迹以画笔画出的痕迹为准,应尽量使物体运动轨迹与预期轨迹吻合,同时尽量缩短运动时间;
2、若在某项测试中运动超过限定的时间,该项目不得分;
3、运动轨迹与预期轨迹之间的偏差超过 4cm 时,该项目不得分;
4、在基本要求(3)、(4)和发挥部分(2)中,物体开始运动前,允许手动将物体定位;开始运动后,不能再人为干预物体运动;
5、竞赛结束时,控制系统封存上交赛区组委会,测试用板(板上含空白坐标纸) 测试时自带。
GPT-4o给出的设计方案:
控制系统
定位和识别
用户交互
通过步进电机控制钢丝拉动物体,可以实现准确的二维平面运动。使用MCU对输入的坐标数据进行处理和控制能够提高系统的灵活性和精度,光电传感器的反馈可以进一步提高绘图的精度和稳定性。
运动控制
轨迹绘制
负载
步进电机驱动电路
限位开关电路
光电传感器电路
步进电机与驱动器
MCU
光电传感器
以下是一个实现基本步进电机控制和坐标计算的示例代码:
#include "stm32f1xx_hal.h"
#include "A4988.h"
// 步进电机引脚定义
#define STEP_PIN_X GPIO_PIN_0
#define DIR_PIN_X GPIO_PIN_1
#define STEP_PIN_Y GPIO_PIN_2
#define DIR_PIN_Y GPIO_PIN_3
#define LIMIT_SWITCH_X GPIO_PIN_4
#define LIMIT_SWITCH_Y GPIO_PIN_5
void stepMotorX(int steps, int direction) {
HAL_GPIO_WritePin(GPIOA, DIR_PIN_X, direction);
for (int i = 0; i < steps; i++) {
HAL_GPIO_WritePin(GPIOA, STEP_PIN_X, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, STEP_PIN_X, GPIO_PIN_RESET);
HAL_Delay(1);
}
}
void stepMotorY(int steps, int direction) {
HAL_GPIO_WritePin(GPIOA, DIR_PIN_Y, direction);
for (int i = 0; i < steps; i++) {
HAL_GPIO_WritePin(GPIOA, STEP_PIN_Y, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, STEP_PIN_Y, GPIO_PIN_RESET);
HAL_Delay(1);
}
}
void setup() {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_GPIO_WritePin(GPIOA, STEP_PIN_X|DIR_PIN_X|STEP_PIN_Y|DIR_PIN_Y, GPIO_PIN_RESET);
}
int main(void) {
setup();
while (1) {
if(HAL_GPIO_ReadPin(GPIOA, LIMIT_SWITCH_X) == GPIO_PIN_RESET) {
// 初始化完成,进入绘图状态
int targetX = calculateTargetX(); // 用户输入目标X坐标
int targetY = calculateTargetY(); // 用户输入目标Y坐标
stepMotorX(targetX, GPIO_PIN_SET);
stepMotorY(targetY, GPIO_PIN_SET);
}
}
}
这个题目考察的知识点:
上述设计和控制系统涉及到机械运动、传感器检测、系统控制和用户交互等多个方面,每个模块需要紧密协调工作,才能实现精准的机械控制和轨迹绘图任务。