一、任务
设计并制作一声音导引系统,示意图如图 1 所示。
图中,AB 与 AC 垂直,Ox 是 AB 的中垂线,O'y 是 AC 的中垂线,W 是 Ox 和 O'y 的交点。
声音导引系统有一个可移动声源 S,三个声音接收器 A、B 和 C,声音接收器之间可以有线连接。声音接收器能利用可移动声源和接收器之间的不同距离,产生一个可移动声源离 Ox 线(或 O'y 线)的误差信号,并用无线方式将此误差信号传输至可移动声源,引导其运动。可移动声源运动的起始点必须在 Ox 线右侧,位置可以任意指定。
二、要求
1.基本要求
(1)制作可移动的声源。可移动声源产生的信号为周期性音频脉冲信号,如图 2 所示,声音信号频率不限,脉冲周期不限。
(2)可移动声源发出声音后开始运动,到达 Ox 线并停止,这段运动时间为响应时间,测量响应时间,用下列公式计算出响应的平均速度,要求平均速度大于 5cm/s。可移动声源的起始位置到 Ox 线的垂直距离
(3)可移动声源停止后的位置与 Ox 线之间的距离为定位误差,定位误差小于 3cm。
(4)可移动声源在运动过程中任意时刻超过 Ox 线左侧的距离小于 5cm。
(5)可移动声源到达 Ox 线后,必须有明显的光和声指示。
(6)功耗低,性价比高。
2.发挥部分
(1)将可移动声源转向 180 度(可手动调整发声器件方向),能够重复基本要求。
(2)平均速度大于 10cm/s。
(3)定位误差小于 1cm。
(4)可移动声源在运动过程中任意时刻超过 Ox 线左侧距离小于 2cm。
(5)在完成基本要求部分移动到 Ox 线上后,可移动声源在原地停止 5s~10s,然后利用接收器 A 和 C,使可移动声源运动到 W 点,到达 W 点以后,必须有明显的光和声指示并停止,此时声源距离 W 的直线距离小于 1cm。整个运动过程的平均速度大于 10cm/s。
三、说明
1. 本题必须采用组委会提供的电机控制 ASSP 芯片(型号 MMC-1)实现可移动声源的运动。
2. 在可移动声源两侧必须有明显的定位标志线,标志线宽度 0.3cm 且垂直于地面。
3. 误差信号传输采用的无线方式、频率不限。
4. 可移动声源的平台形式不限。
5. 可移动声源开始运行的方向应和 Ox 线保持垂直。
6. 不得依靠其他非声音导航方式。
7. 移动过程中不得人为对系统施加影响。
8. 接收器和声源之间不得使用有线连接。
GPT-4o给出的设计方案:
设计一个声学导引系统,由三个固定声学接收器和一个可移动声源组成。系统通过分析声源和接收器之间的响度时间差,计算出声源的位置,并引导声源沿指定路线移动到目标位置。
通过声波的传输时间差来确定声源的位置并进行控制。利用三个声接收器(C, B, A)接收声源(S)发出的信号,分析每个接收器接收到信号的时间差,可以计算出声源的位置。然后,通过控制系统发出指令,控制声源沿指定路径移动。
接收电路模块:
信号处理电路:
移动控制电路:
反馈与修正模块:
MCU(如STM32F407VG):
步进电机或伺服电机:
高精度时间测量单元:
六、项目实现主要功能代码介绍
以下是通过MCU实现声源定位和控制的C代码示例:
#include "stm32f4xx.h"
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
UART_HandleTypeDef huart1;
// ADC采样初始化
void ADC_Init(void) {
// ADC初始化代码,配置ADC通道和参数
}
// 定时器初始化
void TIM_Init(void) {
// 定时器初始化代码,配置高精度定时器
}
// 串口通信初始化
void UART_Init(void) {
// 串口初始化代码,配置串口参数
}
// 计算声源位置
void Calculate_Position(void) {
// 获取定时器计数值
uint32_t t1 = __HAL_TIM_GET_COUNTER(&htim1);
uint32_t t2 = __HAL_TIM_GET_COUNTER(&htim2);
uint32_t t3 = __HAL_TIM_GET_COUNTER(&htim3);
// 计算时间差Δt
float delta_t1 = (float)t1 / HAL_RCC_GetPCLK1Freq();
float delta_t2 = (float)t2 / HAL_RCC_GetPCLK1Freq();
float delta_t3 = (float)t3 / HAL_RCC_GetPCLK1Freq();
// 根据时间差计算位置(采用简单三角几何计算方法)
float x = ...; // 根据实际情况计算
float y = ...; // 根据实际情况计算
// 输出计算结果
char buffer[50];
sprintf(buffer, "X: %f, Y: %f\r\n", x, y);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}
// 控制步进电机
void Control_Motor();
int main(void) {
HAL_Init();
SystemClock_Config();
ADC_Init();
TIM_Init();
UART_Init();
while (1) {
Calculate_Position();
Control_Motor();
HAL_Delay(100);
}
}
// 系统时钟配置函数
void SystemClock_Config(void) {
// 系统时钟配置代码
}
// 控制步进电机的函数
void Control_Motor() {
// 获取所需位置
float target_position = ...;
// 控制步进电机运动到目标位置
// 调整速度和方向
}
代码介绍:
通过该设计方案,系统能够精确计算并控制声源位置,达到预计的定位和移动要求。同时通过示例代码,实现MCU对信号处理和运动控制的具体逻辑。
本题考察的主要知识点: