课程设计总体思路
一个好的课程设计不仅仅是实现一个功能,更重要的是展示你系统分析、方案设计、问题解决和文档撰写的能力,我们将遵循以下步骤:
- 选题与需求分析:确定一个有实际意义、难度适中的项目。
- 方案设计:进行系统架构设计,划分硬件和软件模块。
- 硬件选型与电路设计:选择合适的STM32型号、传感器、模块,并设计原理图。
- 软件设计与编程:使用Keil MDK或VS Code + PlatformIO进行开发,实现各模块功能。
- 系统联调与测试:将软硬件结合,解决遇到的问题,进行性能测试。
- 文档撰写与成果展示:整理设计报告,准备演示和答辩。
课程设计选题方向(按难度和类型划分)
这里提供几个不同方向和难度的选题,你可以选择一个作为你的核心项目。

基础入门型 (适合初学者)
这类项目旨在让你熟悉STM32的最外设(GPIO, UART, TIM, ADC)和开发流程。
选题1:智能循迹小车
- 功能描述:
- 利用红外对管传感器检测地面上的黑线。
- STM32根据传感器信号,控制直流电机驱动模块(如L298N),使小车自动沿黑线行驶。
- 可增加速度显示(OLED屏)或按键调速功能。
- 涉及知识点:
- 硬件:STM32最小系统板、红外传感器模块、电机驱动模块、直流减速电机、电池、车轮。
- 软件:GPIO输入(读取传感器)、PWM输出(控制电机速度)、定时器(用于电机控制或延时)、UART(用于调试)。
- 核心挑战:PID算法的初步实现,使小车转弯平滑,不冲出轨道。
选题2:多功能环境监测仪
- 功能描述:
- 实时采集环境温度、湿度(DHT11/DHT22)、光照强度(光敏电阻)。
- 将采集到的数据显示在OLED液晶屏上。
- 通过串口将数据发送到电脑,用串口助手或上位机软件显示。
- 涉及知识点:
- 硬件:STM32最小系统板、DHT11温湿度传感器、光敏电阻、OLED显示屏(I2C/SPI接口)。
- 软件:GPIO(读取光敏电阻)、I2C/SPI通信协议(驱动OLED)、单总线协议(驱动DHT11)、ADC(读取光敏电阻模拟值)、UART通信。
- 核心挑战:传感器驱动协议的实现,多任务调度(数据采集、显示、发送)。
进阶提高型 (适合有一定基础的同学)
这类项目会涉及更复杂的通信协议、实时操作系统和算法。

选题3:智能家居中控系统
- 功能描述:
- 通过WiFi模块(如ESP8266)连接到局域网。
- 可以通过手机APP或网页远程控制板载的LED灯、继电器(模拟开关家电)。
- 实时采集温湿度数据,并通过网页显示。
- 可以增加人体红外传感器,实现人来灯亮、人走灯灭的功能。
- 涉及知识点:
- 硬件:STM32最小系统板、ESP8266 WiFi模块、DHT11温湿度传感器、人体红外传感器、LED、继电器模块。
- 软件:UART(与ESP8266通信)、TCP/IP协议栈、HTTP服务器、JSON数据格式、多线程/任务处理。
- 核心挑战:AT指令集的掌握,HTTP服务器的搭建,前后端数据交互的设计。
选题4:基于RTOS的无人机飞控系统(简化版)
- 功能描述:
- 使用MPU6050六轴传感器(陀螺仪+加速度计)获取无人机的姿态角(俯仰、横滚、偏航)。
- 通过STM32内部的PID算法解算出电机需要输出的PWM值,以保持无人机平衡(自稳模式)。
- 可通过遥控器(2.4G NRF24L01模块)接收控制指令,实现升降、前后左右飞行。
- 涉及知识点:
- 硬件:STM32F4系列(性能要求高)、MPU6050、NRF24L01、无刷电机电调、无刷电机。
- 软件:I2C(读取MPU6050)、SPI/UART(接收遥控信号)、FreeRTOS或RT-Thread(多任务管理:传感器数据读取、姿态解算、PID控制、PWM输出)、PID算法的深入理解与调参。
- 核心挑战:MPU6050的数据融合(DMP或Mahony互补滤波)、PID控制器的参数整定、实时系统的任务调度。
创新拓展型 (适合学有余力、追求创新的同学)
这类项目通常结合了物联网、人工智能或特定应用场景。
选题5:基于STM32的智能仓储小车

- 功能描述:
- 结合选题1的循迹功能和选题3的WiFi遥控功能。
- 在仓库地面铺设二维码或RFID标签,小车能够循迹并识别标签,从而知道自己的位置。
- 通过手机APP下达取货指令,小车自动规划路径(或按固定路线)前往指定货架,通过舵机控制机械臂抓取物品。
- 涉及知识点:
- 硬件:在智能小车基础上增加二维码/RFID识别模块、舵机、机械臂结构。
- 软件:图像处理(二维码识别)、串口通信(WiFi)、路径规划算法(简化版)、舵机控制。
- 核心挑战:多传感器融合、路径规划算法的实现、机械结构的搭建与控制精度。
选题6:基于STM32的便携式心电监测仪
- 功能描述:
- 通过高精度运放电路对心电信号进行采集和放大(硬件难点)。
- STM32通过ADC高速采样心电信号。
- 对采集到的原始数据进行数字滤波(如带通滤波、陷波滤波),去除基线漂移和工频干扰。
- 将滤波后的数据通过蓝牙(如HC-05)发送到手机APP,实时显示心电图波形。
- 涉及知识点:
- 硬件:STM32、高精度运放、ADC、滤波电路、蓝牙模块。
- 软件:高速ADC配置、数字信号处理(FIR/IIR滤波)、蓝牙通信、上位机APP开发(可使用MIT App Inventor简化)。
- 核心挑战:模拟前端电路的设计与调试、数字信号处理算法的实现。
详细开发流程(以“智能循迹小车”为例)
方案设计
- 系统框图:
[红外传感器组] -> [STM32F103C8T6] -> [L298N电机驱动模块] -> [直流减速电机] | -> [OLED显示屏] -> 显示速度 | -> [USB-TTL串口] -> 电脑调试 - 工作原理:
- 红外传感器组(通常5个)安装在小车底部,实时检测黑线位置。
- STM32通过GPIO读取传感器的数字信号(0或1),判断小车当前相对于黑线的位置(偏左、偏右、在中间等)。
- STM32根据位置信息,通过定时器产生两路PWM信号,控制L298N模块,从而左右轮电机产生转速差,实现转向。
- 使用PID算法,根据位置偏差的大小和变化趋势,动态调整PWM的占空比,使小车平稳地跟随黑线。
硬件选型
- 主控:STM32F103C8T6 "Blue Pill" 开发板(性价比高,资料丰富)
- 传感器:TCRT5000红外循迹传感器模块(5个)
- 电机驱动:L298N模块
- 电机:TT减速电机(带编码器更佳,可用于速度闭环)
- 显示:0.96寸 OLED屏(I2C接口)
- 电源:18650锂电池组(7.4V)配合降压模块给STM32和OLED供电(5V/3.3V)
- 结构:亚克力小车底盘或3D打印底盘
软件实现 (基于HAL库)
-
环境搭建:
- 安装Keil MDK或STM32CubeIDE。
- 使用STM32CubeMX生成初始工程,配置时钟、GPIO、TIM(PWM)、I2C(OLED)等。
-
模块化编程:
main.c: 主函数,负责初始化和主循环调度。sensor.c/h: 封装红外传感器的读取函数。motor.c/h: 封装L298N的初始化和PWM控制函数。pid.c/h: 封装PID算法的结构体和计算函数。oled.c/h: 封装OLED的驱动函数(可使用现成的库,如SSD1306)。
-
代码实现步骤:
-
传感器读取:编写一个函数,一次性读取5个传感器的状态,返回一个状态值(如
0b00100表示中间传感器在线)。 -
电机控制:编写函数
Motor_SetSpeed(uint8_t left_speed, uint8_t right_speed),通过设置左右两个定时器的CCR寄存器来控制PWM占空比,从而控制速度。 -
PID算法实现:
// pid.h typedef struct { float Kp, Ki, Kd; float error, last_error, integral; } PID; float PID_Calculate(PID *pid, float target, float current);error = target - current;(目标是中间位置,当前是偏左,error为正值)integral += error;output = pid->Kp * error + pid->Ki * integral + pid->Kd * (error - pid->last_error);pid->last_error = error;
-
主循环逻辑:
while (1) { // 1. 读取传感器状态 uint8_t sensor_status = Get_Sensor_Status(); // 2. 计算位置偏差(最左边为-4,最右边为+4) int position_error = Calculate_Error(sensor_status); // 3. 使用PID计算控制量 float pid_output = PID_Calculate(&pid, 0.0, (float)position_error); // 4. 将PID输出转换为左右轮的速度差 int base_speed = 50; // 基础速度 int left_speed = base_speed - pid_output; int right_speed = base_speed + pid_output; // 5. 限制速度范围 left_speed = constrain(left_speed, 0, 100); right_speed = constrain(right_speed, 0, 100); // 6. 设置电机速度 Motor_SetSpeed(left_speed, right_speed); // 7. 显示当前速度到OLED Display_Speed((left_speed + right_speed) / 2); HAL_Delay(10); // 控制循环频率 }
-
系统联调与测试
- 硬件检查:上电前检查电路连接是否正确,有无短路。
- 分模块测试:
- 单独测试传感器,看是否能正确识别黑线。
- 单独测试电机,看是否能正反转和调速。
- 单独测试OLED,看是否能正常显示。
- 整体联调:将所有模块组合,下载程序。
- PID参数整定:这是最关键的一步。
- 先调
Kp,从小到大,直到小车能大致跟随黑线,但可能会有抖动。 - 再调
Ki,用于消除稳态误差(比如小车一直偏在一边),但过大会导致震荡。 - 最后调
Kd,用于抑制震荡,让小车更平滑。 - 反复试验,找到最佳参数组合。
- 先调
设计报告与答辩
- 设计报告应包含:
- 摘要:项目概述、功能、创新点。
- 目录。
- 第一章:绪论:项目背景、意义、国内外研究现状。
- 第二章:系统总体方案设计:系统框图、功能模块划分。
- 第三章:硬件系统设计:元器件选型及理由、硬件原理图、PCB设计(如果做了)。
- 第四章:软件系统设计:开发环境、软件流程图、各模块代码实现与讲解(附关键代码)。
- 第五章:系统测试与结果分析:测试方法、测试数据(图表)、结果分析、遇到的问题及解决方案。
- 第六章:总结与展望:项目总结、不足之处、未来可改进的方向。
- 参考文献。
- 附录:完整电路图、完整代码清单。
- 答辩准备:
- 制作清晰的PPT,突出重点。
- 准备好实物演示。
- 预想老师可能提出的问题(如:为什么选择这个STM32型号?PID参数怎么调的?项目最大的难点是什么?)。
学习资源推荐
- 开发工具:
- IDE:STM32CubeIDE (官方推荐,集成了代码生成和调试)、Keil MDK (经典商业软件)、VS Code + PlatformIO (开源,插件丰富)。
- 代码生成:STM32CubeMX (图形化配置,自动生成初始化代码)。
- 核心库:
- 标准库:早期常用,直接寄存器操作,效率高但麻烦。
- HAL库:目前主流,抽象层次高,可移植性好,推荐初学者使用。
- LL库:介于标准库和HAL库之间,效率高,封装较好。
- 学习资料:
- B站/YouTube:江协科技、野火、正点原子等有大量免费且高质量的STM32入门教程。
- 官方文档:STM32F1/F4系列的数据手册、参考手册、应用笔记,是解决问题的终极武器。
- 开源项目:在GitHub上搜索相关项目,学习别人的代码架构和实现方式。
希望这份详细的课程设计指南能帮助你顺利完成项目!祝你学习愉快,取得好成绩!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。