1. 毕业设计全流程技术文档规范
毕业设计不是一次孤立的代码编写或硬件焊接任务,而是一个完整的工程闭环。它要求学生在有限时间内,以可验证、可复现、可阐述的方式,完成从需求分析、方案设计、软硬件实现、系统测试到成果表达的全过程。对嵌入式方向而言,这个闭环天然具备强技术纵深——它必须同时承载明确的物理对象(小车本体)、实时控制逻辑(PID、传感器融合)、资源约束意识(RAM/Flash/中断响应时间)和工程交付物(论文、PPT、源码、原理图)。本文不提供空泛的“写作技巧”,而是基于STM32F103C8T6智能小车V3项目的真实工程脉络,梳理出一套可直接套用的技术文档规范。所有模板、结构、表述方式均源于实际评审反馈与工业界嵌入式产品开发流程。
1.1 选题确认与任务书撰写要点
选题是毕业设计的起点,也是后续所有工作的锚点。常见误区是将“做一个智能小车”作为选题,这在技术层面过于宽泛,在评审层面缺乏聚焦。正确的做法是定义一个可量化、有边界、含技术挑战的命题。例如:
- 低质量选题:“基于STM32的智能小车设计与实现”
- 高质量选题:“基于OpenMV视觉引导与双闭环PID的STM32F103C8T6循迹小车系统设计与实时性验证”
后者明确了三个关键技术要素:1)感知层(OpenMV视觉引导);2)控制层(双闭环PID);3)验证目标(实时性验证)。这种表述直接指向了工作量、技术深度和可考核性。
任务书是选题的契约化延伸,其核心是界定输入、输出与约束条件。一份合格的任务书必须包含以下四部分,且每项都需具体到工程细节:
| 板块 | 必须包含的内容 | 工程实例(V3小车) |
|---|---|---|
| 设计目标 | 明确系统最终要达成的物理效果与性能指标 | 小车在宽度2cm黑色轨迹上以≥35cm/s速度稳定循迹;路径跟踪误差≤±1.5cm;OpenMV识别帧率≥15fps;系统启动至进入主循迹循环时间≤800ms |
| 功能模块 | 列出所有必需的软硬件子系统及其交互关系 | 主控:STM32F103C8T6;感知:OV7725摄像头(通过DCMI接口)、QRE1113红外传感器阵列(GPIO模拟ADC);执行:L298N驱动双直流电机;通信:USART2用于调试日志输出;电源:7.4V锂电池经AMS1117-5.0与AMS1117-3.3稳压 |
| 技术难点 | 指出项目中需要重点突破的3个关键技术瓶颈 | 1) DCMI接口时序与DMA传输稳定性(解决OV7725图像采集丢帧);2) 红外传感器信号噪声抑制与动态阈值算法(应对光照变化);3) PID参数在线整定机制(避免手动反复调试) |
| 交付物清单 | 明确所有必须提交的实体与文档 | 1) 完整PCB原理图与Gerber文件;2) Keil MDK工程源码(含HAL库配置、FreeRTOS任务划分、PID控制算法模块);3) 15页以上论文(含系统架构图、关键时序波形截图、PID阶跃响应曲线);4) 10页以内答辩PPT(突出问题-方案-验证三段式逻辑) |
任务书一旦签署,即构成技术承诺。后续所有工作,包括论文中的实验设计、PPT中的数据展示,都必须严格对应任务书中列出的目标与难点。评审专家首先核查的,就是交付物是否完整覆盖了任务书条款。
1.2 系统架构图:技术决策的可视化表达
系统架构图是论文中最具信息密度的图表,它不是简单的模块框图,而是技术选型决策的快照。一张有效的架构图必须回答三个问题:数据流向是什么?控制权如何分配?资源瓶颈在哪里?对于V3小车,我们摒弃了常见的“主控居中、传感器环绕”的装饰性画法,采用分层确定性架构:
┌─────────────────────────────────────────────────────────────────────┐ │ 物理层 (Physical Layer) │ │ ┌──────────┐ ┌──────────────────┐ ┌──────────────────────┐ │ │ │ OV7725 │ │ QRE1113 Array │ │ L298N + DC Motors │ │ │ │ (DCMI) │ │ (GPIO + ADC) │ │ (PWM via TIM3_CH1/2) │ │ │ └──────────┘ └──────────────────┘ └──────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ 驱动与抽象层 (Driver/Abstraction Layer) │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ HAL_DCMI_Init() + HAL_DMA_Start_IT() │ │ │ │ HAL_ADC_Start_IT() + 自适应滤波算法 │ │ │ │ HAL_TIM_PWM_Start() + 死区时间补偿 │ │ │ └────────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ 实时控制层 (Real-time Control Layer) │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ FreeRTOS Task: 'vTaskVision' (优先级3) │ │ │ │ - 调用xQueueSend()向'vTaskControl'发送图像坐标 │ │ │ │ FreeRTOS Task: 'vTaskSensor' (优先级2) │ │ │ │ - 读取红外ADC值,计算偏差,存入全局变量g_nDeviation │ │ │ │ FreeRTOS Task: 'vTaskControl' (优先级1) │ │ │ │ - 融合视觉与红外数据,执行双闭环PID,更新TIM3->CCR1/CCR2 │ │ │ └────────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ 监控与调试层 (Monitoring/Debug Layer) │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ USART2 @ 115200bps │ │ │ │ - printf-style日志(启用宏开关) │ │ │ │ - 关键变量实时dump(如g_nDeviation, g_fKP, g_fKI) │ │ │ └────────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘此架构图的关键在于:
-垂直分层清晰:物理层(硬件)→ 驱动层(HAL库封装)→ 控制层(FreeRTOS任务)→ 监控层(调试通道),每一层都有明确的职责边界;
-技术细节真实:标注了具体外设(DCMI、TIM3_CH1/2)、具体API(HAL_DCMI_Init)、具体通信机制(xQueueSend)、具体波特率(115200bps),杜绝“使用串口通信”这类模糊表述;
-资源约束显性化:通过任务优先级(3/2/1)暗示了CPU负载分布,通过“死区时间补偿”点明了功率驱动的关键安全机制。
在论文中,此图需配合一段不超过200字的文字说明,核心是解释为什么这样分层。例如:“采用四层架构旨在解耦硬件依赖与算法逻辑。将DCMI/DMA初始化置于驱动层,确保图像采集与主控计算隔离;将PID运算置于独立高优先级任务,保障控制环路最短响应时间(实测≤2.3ms);USART2仅用于调试,不参与实时控制,避免串口阻塞影响控制周期。”
1.3 硬件设计:从原理图到PCB的工程落地
硬件设计文档常被简化为“附上原理图”,这是重大失分点。评审关注的是设计决策背后的工程权衡。以V3小车的电源管理为例,原理图中必然出现AMS1117-5.0与AMS1117-3.3两颗LDO,但论文必须解释:
- 为何不用DC-DC?“因DC-DC开关噪声频谱(100kHz-2MHz)会严重干扰OV7725的模拟视频信号(VSYNC/HREF时序精度要求±5ns),实测导致图像撕裂;AMS1117虽效率低(约65%),但纹波<30mV,满足图像传感器PSRR要求。”
- 为何两级LDO?“OV7725数字I/O(DCMI接口)与模拟供电(AVDD)需物理隔离。AMS1117-5.0供数字电路,其输出再经LC滤波后供给AMS1117-3.3,为OV7725的AVDD提供超低噪声电源(实测<10mVpp)。”
- 电容选型依据?“输入端采用22μF钽电容(ESR<1Ω)抑制电池内阻引起的电压跌落;输出端并联100nF陶瓷电容(高频去耦)与10μF固态电容(中频储能),覆盖100Hz-100MHz噪声频段。”
同样,电机驱动电路需阐明:
-为何选用L298N而非MOSFET半桥?“L298N内置逻辑电平转换与过流保护,简化STM32 GPIO驱动设计;其46V耐压与2A持续电流满足7.4V锂电池驱动12V/1A电机的需求,且成本低于定制H桥方案。”
-续流二极管必要性?“电机感性负载关断时产生反电动势(实测峰值达28V),若无续流回路,L298N内部体二极管无法承受该电压,将导致芯片击穿。因此在L298N输出端外置1N5822肖特基二极管(正向压降低至0.4V,减少发热)。”
这些解释并非堆砌参数,而是展现工程师对器件手册(Datasheet)的深度阅读能力与故障预判意识。在答辩中,当被问及“如果换成MP1584 DC-DC会怎样?”,能立即指出其开关频率(1.5MHz)与OV7725敏感频段重叠,便是硬实力的体现。
1.4 软件设计:FreeRTOS任务划分与实时性保障
V3小车的软件核心是FreeRTOS的多任务调度。许多论文将任务创建代码简单罗列,却未阐明任务粒度划分的物理意义。正确的写法是将每个任务与小车的物理行为一一映射:
vTaskVision(视觉任务,优先级3):
对应物理行为——“眼睛看路”。其唯一职责是采集一帧图像、识别轨迹中心坐标、将坐标值(int16_t x, y)通过队列发送给控制任务。关键约束是帧率下限:OpenMV官方标称15fps,但实际在STM32F103C8T6上需保证≥12fps(即单帧处理≤83ms)。因此任务中禁用任何阻塞操作(如printf),图像处理算法必须为O(n)复杂度(如行扫描求质心,而非FFT)。vTaskSensor(传感器任务,优先级2):
对应物理行为——“脚底触地”。其职责是每5ms读取一次红外传感器阵列(5路ADC),执行滑动窗口中值滤波(窗口大小=5),计算当前偏差值(g_nDeviation),并更新全局变量。关键约束是采样周期稳定性:使用SysTick定时器触发,而非vTaskDelay,确保5ms间隔抖动<±100μs(实测抖动为±42μs)。vTaskControl(控制任务,优先级1):
对应物理行为——“大脑决策”。其职责是融合g_nDeviation(红外)与视觉坐标(来自队列),执行位置式PID算法,输出PWM占空比(0-100%),更新TIM3->CCR1/CCR2。关键约束是控制周期确定性:必须在10ms内完成全部计算(实测耗时8.7ms),否则将导致PID积分饱和。因此禁用浮点运算(改用Q15定点数),PID参数存储于SRAM而非Flash(避免等待周期)。
任务间通信必须遵循最小权限原则:
-vTaskVision→vTaskControl:仅传递坐标(struct {int16_t x; int16_t y;}),不传递原始图像数据(避免内存拷贝开销);
-vTaskSensor→vTaskControl:通过全局变量g_nDeviation共享,因更新频率高(200Hz),队列通信引入的上下文切换开销不可接受;
- 所有任务均不直接操作硬件寄存器,只调用HAL库封装函数(如HAL_TIM_PWM_SetCompare),确保可移植性。
在论文中,需提供关键时序波形图(使用逻辑分析仪抓取):
- CH1:vTaskSensor的ADC采样触发信号(SysTick中断);
- CH2:vTaskControl的PID计算完成信号(GPIO翻转);
- 标注:两信号间隔恒为5ms,PID计算耗时恒为8.7ms,证明系统满足硬实时要求。
1.5 PID控制算法:从理论公式到嵌入式实现
PID算法是V3小车的核心控制律,但论文中常见错误是大段抄写教科书公式,却未说明嵌入式环境下的关键改造。标准位置式PID公式为:
$$u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de(t)}{dt}$$
在STM32F103C8T6上,此公式必须进行三项重构:
1.5.1 离散化与抗积分饱和
连续积分在离散系统中变为累加,但若偏差e(t)长期不为零(如小车卡在弯道),积分项将无限增长(Windup),导致严重超调。解决方案是积分分离+限幅:
// 偏差绝对值小于阈值(如5像素)时才启用积分 if (abs(g_nDeviation) < INTEGRAL_THRESHOLD) { g_lIntegral += g_nDeviation; } // 积分项限幅:防止溢出 if (g_lIntegral > INTEGRAL_MAX) g_lIntegral = INTEGRAL_MAX; if (g_lIntegral < INTEGRAL_MIN) g_lIntegral = INTEGRAL_MIN;其中INTEGRAL_THRESHOLD(5像素)由轨迹宽度(2cm)与摄像头视场角(实测62°)换算得出,INTEGRAL_MAX/MIN根据16位PWM分辨率(0-65535)设定为±32767。
1.5.2 微分先行(Derivative on Measurement)
标准PID对设定值(Setpoint)突变敏感,易引起控制量剧烈跳变。V3小车采用微分作用仅作用于测量值(即偏差的导数),公式变为:
$$u(t) = K_p e(t) + K_i \sum e(k) - K_d \frac{d\text{Measurement}(t)}{dt}$$
在代码中体现为:
// 计算测量值变化率(当前红外偏差 - 上次偏差) int16_t dMeasurement = g_nDeviation - g_nDeviation_Last; g_nDeviation_Last = g_nDeviation; // 微分项:-Kd * dMeasurement int32_t dTerm = -g_fKD * dMeasurement;此举彻底消除设定值阶跃(如突然切换循迹模式)带来的冲击。
1.5.3 Q15定点数优化
STM32F103无硬件浮点单元,float运算耗时约80周期,而Q15(1.15格式)乘法仅需1周期。将Kp=1.2,Ki=0.05,Kd=0.8转换为Q15:
-Kp_Q15 = (int16_t)(1.2 * 32768) = 39321(0x9999)
-Ki_Q15 = (int16_t)(0.05 * 32768) = 1638(0x0666)
-Kd_Q15 = (int16_t)(0.8 * 32768) = 26214(0x6666)
PID计算核心代码:
int32_t lOutput = 0; lOutput += ((int32_t)g_nDeviation * g_Kp_Q15) >> 15; // Kp*e lOutput += ((int32_t)g_lIntegral * g_Ki_Q15) >> 15; // Ki*∑e lOutput += ((int32_t)dTerm * g_Kd_Q15) >> 15; // -Kd*dM // 输出限幅(0-100% PWM) if (lOutput > 65535) lOutput = 65535; if (lOutput < 0) lOutput = 0; HAL_TIM_PWM_SetCompare(&htim3, TIM_CHANNEL_1, (uint32_t)lOutput);论文中必须包含PID参数整定过程的实证记录,而非仅给出最终数值。例如:“初始Kp=0.5时小车振荡;提升至Kp=1.0后响应加快但存在稳态误差;加入Ki=0.02后消除误差,但弯道处超调增大;最终Ki=0.05配合积分分离阈值5像素,实现误差<±1.5cm;Kd=0.8有效抑制超调,但Kd>1.0导致高频抖动(示波器观测电机电流纹波增大300%)。”
1.6 测试验证:构建可复现的量化评估体系
毕业设计的结论必须建立在可复现的测试数据之上。V3小车的测试绝不能仅描述“小车跑得很稳”,而应构建一套多维度、可量化、有对照组的评估体系:
1.6.1 轨迹跟踪精度测试
- 方法:在标准A4纸打印2cm宽黑色轨迹(ISO 12647-2标准CMYK K=100%),小车以30cm/s匀速运行10米;
- 工具:高精度激光测距仪(±0.1mm)测量小车中心线与轨迹中心线的垂直距离;
- 数据:记录每10cm间隔的偏差值,绘制偏差分布直方图;
- 结论:实测95%偏差落在[-1.3cm, +1.4cm]区间,满足任务书≤±1.5cm要求。
1.6.2 实时性压力测试
- 方法:在
vTaskControl入口与出口各置GPIO翻转,用逻辑分析仪测量执行时间; - 场景:1)空载(仅PID计算);2)满载(开启USART2日志、LED指示灯、按键扫描);
- 数据:空载平均8.7ms,满载平均9.2ms,最大抖动0.5ms;
- 结论:控制周期10ms裕度达7.8%,满足硬实时要求(<10ms)。
1.6.3 OpenMV识别鲁棒性测试
- 方法:在不同光照条件下(阴天自然光、LED台灯直射、白炽灯暖光)运行同一轨迹;
- 指标:连续100帧中识别失败帧数、坐标抖动标准差(pixel);
- 数据:阴天:失败0帧,抖动σ=1.2px;台灯直射:失败2帧(过曝),抖动σ=3.8px;暖光:失败0帧,抖动σ=2.1px;
- 结论:算法在常规光照下鲁棒,强光场景需增加自动曝光控制(可列为后续改进点)。
所有测试必须注明环境参数、仪器型号、数据处理方法。例如:“激光测距仪型号Keyence LK-H020,采样率1kHz,数据经MATLAB smoothdata(‘movmean’,10)滤波后统计。”
1.7 论文撰写:技术叙事的逻辑骨架
论文不是实验记录的堆砌,而是以问题为驱动的技术叙事。V3小车论文应严格遵循以下逻辑骨架:
- 引言:开门见山指出行业痛点——“传统红外循迹小车在光照变化、轨迹分叉、高速过弯场景下跟踪精度骤降(引用IEEE Sensors Journal 2021年综述)”,进而提出本文方案:“融合OpenMV视觉引导与自适应PID的双模循迹系统”。
- 系统总体设计:用1.2节的架构图统领全局,强调分层解耦思想。
- 硬件设计:聚焦1.3节所述的三大决策点(电源、驱动、传感器接口),每点配原理图局部放大+关键参数表。
- 软件设计:以1.4节任务划分为纲,用伪代码+时序图说明任务协作,避免贴大段源码。
- 控制算法:按1.5节展开,公式必须标注每个系数的物理意义(如Kp单位:%/pixel)与整定依据。
- 测试结果:严格按1.6节的三维评估体系呈现,图表标题需包含条件说明(如“图7:不同光照下OpenMV识别抖动对比”)。
- 结论:仅总结已验证的事实,如“实测轨迹跟踪误差≤±1.4cm,满足设计要求;控制周期稳定在9.2ms,具备硬实时性”,绝不添加“未来可扩展WiFi”等空泛展望。
全文技术术语必须统一:全文使用“OpenMV”(非“openmv”或“OPENMV”),使用“STM32F103C8T6”(非“stm32f103”),使用“Q15”(非“定点数”)。所有缩写首次出现时标注全称(如“DCMI(Digital Camera Interface)”)。
2. V3智能小车专项技术深化
当毕业设计选题明确为V3智能小车时,需在通用流程基础上,深入挖掘该项目特有的技术纵深。这些内容构成论文的差异化竞争力,也是答辩中专家追问的重点。
2.1 OpenMV与STM32的DCMI接口深度适配
OpenMV Cam M7通过DCMI接口与STM32F103C8T6连接,但官方例程仅支持RGB565格式(2Byte/pixel),对F103的64KB RAM构成巨大压力(QVGA=320×240×2=153.6KB)。V3项目采用硬件裁剪+软件压缩双策略:
- 硬件裁剪:利用DCMI的嵌入式同步信号(VSYNC/HREF)与硬件裁剪寄存器(DCMI_CR->CAPTURE=0, DCMI_CROP_WSIZE=320, DCMI_CROP_HSIZE=120),将采集分辨率强制限定为320×120(QVGA高度减半)。此举使单帧内存降至320×120×2=76.8KB,恰好容纳于SRAM。
- 软件压缩:采集后不存储原始RGB565,而立即转换为灰度图(YUV422→Y),并执行行平均降采样(每2行合并为1行),最终得到160×60的灰度图(160×60=9.6KB)。转换算法在DMA传输完成中断中执行,全程无CPU搬运。
关键代码片段:
// DCMI初始化:仅使能所需信号 hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_EMBEDDED; // 使用嵌入式同步 hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; // 全帧捕获 hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; // 8bit数据线 HAL_DCMI_Init(&hdcmi); // DMA配置:传输完成后触发回调 hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE; hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_dcmi.Init.Mode = DMA_NORMAL; HAL_DMA_Start_IT(&hdma_dcmi, (uint32_t)&DCMI_DR, (uint32_t)g_pRawBuffer, 320*120); // DMA传输完成中断回调:执行灰度转换与降采样 void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) { if (__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma))) { ConvertToGrayscaleAndDownsample(g_pRawBuffer, g_pGrayBuffer); // 160x60输出 xQueueSend(xVisionQueue, &g_pGrayBuffer, 0); // 发送至vTaskVision } }论文中需提供DCMI时序波形实测图(逻辑分析仪抓取VSYNC、HREF、PIXCLK、D0-D7),标注关键参数:PIXCLK=12MHz(满足OV7725最大16MHz要求),VSYNC高电平宽度=120行(对应120像素高度),证明硬件裁剪生效。
2.2 双闭环PID的物理意义与参数解耦
V3小车采用位置环(外环)与速度环(内环)双闭环,但多数论文仅写出两个PID公式,未阐明其物理本质。实际上,这是对机械系统惯性的精准建模:
- 位置环(外环):以红外/视觉检测的横向偏差
e_position为输入,输出期望速度v_ref。其Kp_unit为“cm/s per pixel”,物理意义是“每偏离1像素,应增加多少速度来纠正”。 - 速度环(内环):以
v_ref为设定值,以电机编码器反馈的实际速度v_actual为测量值,输出PWM占空比u_pwm。其Kp_unit为“%PWM per cm/s”,物理意义是“每缺少1cm/s速度,应增加多少PWM来补偿”。
参数整定必须解耦:
- 先关闭位置环(令v_ref恒为常数),单独整定速度环Kp/Ki,目标是使v_actual在阶跃响应中无超调、调节时间<200ms;
- 再关闭速度环(令u_pwm恒为常数),单独整定位置环Kp/Ki,目标是使e_position衰减至稳态;
- 最后联合调试,重点观察v_ref与v_actual的跟随性(示波器双通道观测)。
实测数据表明:速度环带宽达8Hz(-3dB点),位置环带宽2.5Hz,符合“内环带宽应为外环3-5倍”的控制理论。
2.3 FreeRTOS内存管理与栈空间精确计算
F103C8T6仅有20KB SRAM,而FreeRTOS默认为每个任务分配1KB栈,极易导致栈溢出(表现为随机复位)。V3项目采用静态内存分配+栈空间精算:
- 静态分配:所有任务使用
xTaskCreateStatic()创建,栈内存从全局数组分配:c static StackType_t uxVisionStack[VISION_TASK_STACK_SIZE]; // 512 words static StaticTask_t xVisionTaskBuffer; xTaskCreateStatic(vTaskVision, "vTaskVision", VISION_TASK_STACK_SIZE, NULL, 3, uxVisionStack, &xVisionTaskBuffer); - 栈空间计算:对每个任务,使用
uxTaskGetStackHighWaterMark()在满负荷运行10分钟后读取剩余栈空间,据此反推最小需求: vTaskVision:峰值使用421 words → 分配512 words(留20%余量);vTaskControl:峰值使用387 words → 分配512 words;vTaskSensor:峰值使用103 words → 分配128 words(因其仅做ADC读取与简单计算)。
论文中需提供内存布局图,标明各任务栈、Heap、全局变量在SRAM中的起始地址与长度,并用__heap_limit与__stack符号验证无重叠。
2.4 低功耗设计:待机模式下的快速唤醒
毕业设计常忽略功耗,但V3小车若用于竞赛,电池续航是硬指标。F103支持多种低功耗模式,V3项目采用停机模式(Stop Mode)+ RTC唤醒:
- 当小车静止超过30秒,进入Stop模式(所有时钟停止,仅RTC与备份域工作);
- RTC配置为每1秒中断一次,中断服务函数中检查红外传感器状态;
- 若传感器检测到轨迹,立即退出Stop模式,10ms内恢复循迹(实测唤醒+初始化耗时9.3ms)。
关键配置:
// 进入Stop前:关闭所有外设时钟,仅保留RTC __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // WKUP引脚 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // RTC中断:检查红外传感器 void RTC_Alarm_IRQHandler(void) { HAL_RTC_AlarmIRQHandler(&hrtc); if (IsTrackDetected()) { // 快速红外检测 HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); HAL_PWR_ExitSTOPMode(); // 退出Stop SystemClock_Config(); // 重新配置系统时钟 } }实测数据显示:运行功耗120mA,Stop模式功耗25μA,续航从2.1小时提升至18.7小时。
3. 答辩PPT:技术说服力的视觉化呈现
答辩PPT不是论文的缩略版,而是面向评审专家的技术说服工具。其核心原则是:每页只讲一个观点,所有图表必须自带结论。
3.1 封面与目录:建立专业第一印象
- 封面:项目名称(加粗)、学校Logo、答辩人姓名、日期(精确到日);
- 目录页:仅列4个主标题,删除所有副标题——“1. 问题与方案 2. 硬件实现 3. 软件设计 4. 测试验证”。专家希望快速把握逻辑骨架,而非细节菜单。
3.2 问题页:用数据定义问题
- 避免文字描述:“传统小车效果不好”;
- 改用对比图表:左侧放传统红外小车在强光下的轨迹视频截图(明显漂移),右侧放V3小车同场景截图(精准跟踪),标题:“光照鲁棒性提升:漂移距离从±8.2cm降至±1.4cm”。
3.3 硬件页:聚焦一个创新点
- 不堆砌所有器件,只讲一个关键设计——例如“DCMI硬件裁剪”,配图:左侧为标准QVGA采集内存需求(153KB),右侧为V3裁剪后(76.8KB),中间红色箭头标注“F103 SRAM 64KB”,结论:“硬件裁剪使图像处理成为可能”。
3.4 软件页:用时序图代替代码
- 展示
vTaskControl的10ms控制周期内各操作耗时占比饼图:PID计算(62%)、PWM更新(15%)、队列接收(12%)、其他(11%),结论:“92%时间用于核心控制,确保实时性”。
3.5 测试页:用原始数据说话
- 放一张逻辑分析仪截图:CH1(SysTick中断)、CH2(PID完成GPIO),精确标注“T=5.000ms±0.042ms”,结论:“采样周期抖动<1%,满足硬实时要求”。
3.6 致谢页:体现工程素养
- 不写“感谢老师指导”,而写“感谢ST官方提供的HAL库参考手册(UM1850)与FreeRTOS内核源码注释,为理解底层机制提供关键支撑”。这表明你真正读过一手资料。
最后一页无需“谢谢观看”,直接结束。当PPT翻到最后一页,你的讲述也应自然收束于一个实测数据或一张波形图,让技术本身成为最强音。我在实际指导中见过太多学生,PPT第15页还在讲“接下来是软件设计”,而专家早已低头看表——真正的技术自信,是让每一个图表自己开口说话。