一、任务
设计并制作一套电磁控制运动装置,该装置由电磁控制装置、摆杆等部分构成。装置外形尺寸要求不能大于:长 300mm、宽 300mm、高 300 mm,摆杆支撑轴中心点到摆杆底端的长度规定在 100mm~150mm 范围内;装置结构示意图如图 1 和图 2 所示。
二、要求
1.基本要求
(1)按下启动按钮,由静止点开始,控制摆杆摆动。
(2)由静止点开始,控制摆杆在指定的摆角(10°~45°范围内)连续摆动,摆动摆角绝对误差≤5°,响应时间≤15s。
(3)由静止点开始,按指定周期(0.5s~2s 范围内)控制摆杆连续摆动,摆动周期绝对误差值≤0.2s,响应时间≤15s。
(4)在摆杆连续摆动的情况下,按下停止按钮,控制摆杆平稳地停在静止点上,停止时间≤10s。
2.发挥部分
(1)摆杆摆角幅度能在 10°~45°范围内预置,预置步进值为 5°,摆角幅度绝对误差值≤3°,响应时间≤10s。
(2)摆杆的周期能在 0.5s~2s 范围内预置,预置步进值 0.5s,周期绝对误差值≤0.1s,响应时间≤10s。
(3)摆杆摆角幅度和周期在上述范围内可同时预置,由静止点开始摆动,摆角幅度值和周期相对误差要求均和发挥部分中的(1)、(2)相同。当摆杆稳定运行 20 秒后发出声、光提示,并在 5s 内平稳停在静止点上。
(4)其他。
三、说明
(1)图 1 和图 2 只作为设计参考,参赛队可以自行设计电磁控制运动装置结构;
(2)摆杆和摆杆支撑轴上不能安装任何驱动装置,但可以安装角度传感器;
(3)摆杆运动控制、检测装置的安装方式与控制方法由参赛队自行确定;
(4)磁铁在摆杆上的安装位置不做限制,在测试过程中不允许做任何改动和调整;
(5)摆角指示刻度盘绘制以 1°为最小单位,可以自制或采用成品量角器,摆角测量值以摆杆上指针与指示刻度盘相对应的读数为基准。
(6)摆杆自然下垂的点定义为摆杆的静止点。
(7)响应时间在本题目中定义为:摆杆由初始静止状态到达稳定状态(4 个周期摆幅基本相同)的时间。响应时间包括 4 个稳定周期摆动的时间。
设计一个基于电磁控制的摆杆运动装置,通过电磁铁的开闭控制运动摆杆,实现摆角指示装置的摆动。主要组件包括电磁铁、摆角指示器、运动摆杆、支架、控制电路等。摆动角度通过摆角指示器进行显示,由电磁铁通断电控制摆杆运动,电磁铁由MCU进行控制。
使用电磁铁进行非接触式控制,驱动摆杆运动:
器件:12V DC电磁铁。
设计要点:
选择使用STM32系列单片机,利用其丰富的I/O接口和实时控制能力:
器件:STM32F103C8T6。
设计要点:
使用光电编码器或电位计实时监测运动摆杆的角度位置:
设计要点:
系统需要12V和5V两路电源,使用DC-DC转换模块实现稳压:
器件:LM2596。
设计要点:
电磁铁控制电路
角度检测电路
五、代码实现
MCU(STM32)C代码
#include "stm32f1xx_hal.h"
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM1_Init(void);
uint32_t readAngle();
void controlElectromagnet(uint8_t state);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM1_Init();
uint32_t angle;
while (1) {
angle = readAngle();
if (angle >= 10 && angle <= 45) {
controlElectromagnet(GPIO_PIN_SET);
HAL_Delay(15000); // 保持15秒
controlElectromagnet(GPIO_PIN_RESET);
HAL_Delay(5000); // 停止5秒
}
}
}
uint32_t readAngle() {
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 1000000);
uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
return (adcValue * 45) / 4096; // 根据ADC值计算角度
}
void controlElectromagnet(uint8_t state) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, state);
}
static void MX_ADC1_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
static void MX_TIM1_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 0;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
HAL_TIM_Base_Init(&htim1);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
}
static void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
// 系统时钟配置等其他配置省略
总结
本设计考察了电磁控制、角度检测、MCU控制、定时器和PWM控制等知识点,重点在于实现电磁铁的精确控制及摆角检测与反馈,保障系统在指定范围内稳定运行。通过STM32的GPIO操作、ADC采样及定时器控制,满足了题目要求。
本题考察的主要知识点