1. 电源类毕设到底卡在哪?
做电源方向的同学,十有八九会被三件事拖住:
- 拓扑选型:Buck、Boost、Buck-Boost 到底选谁?电感、电容、频率一圈算完,实验室一上电还是啸叫。
- 控制算法:PID 参数手动撸,示波器探头换到冒烟,输出还是稳不住。
- 底层驱动:PWM 占空比、ADC 采样、中断优先级,寄存器手册翻一晚上,代码还是跑飞。
传统做法靠经验+试错,毕设周期 16 周,这三步就能耗掉 12 周。能不能让 AI 来当“外挂”?下面把我自己踩坑+AI 打辅助的全过程拆给大家看。
2. AI 编程助手横向速览
先给工具排个队,别一上来就“Copilot 天下第一”,场景不同,效果差距巨大。
| 工具 | 电路脚本 | 嵌入式 C | 文档/注释 | 中文提示 | 离线可用 |
|---|---|---|---|---|---|
| GitHub Copilot | ★★★★☆ | ★★★★☆ | ★★★☆☆ | ★★☆☆☆ | |
| CodeWhisperer | ★★★☆☆ | ★★★★★ | ★★☆☆☆ | ★★★☆☆ | |
| ChatGPT-4 | ★★★★★ | ★★★★☆ | ★★★★★ | ★★★★★ |
- 电路仿真脚本(Python+PySpice):ChatGPT-4 最懂“人话”,直接给拓扑参数就能吐出完整 .cir 网表。
- 嵌入式 C:CodeWhisperer 训练集里 TI、ST 的 HAL 库权重高,寄存器版本代码反而更准。
- 文档:别小看,毕设中期检查要交 30 页说明书,Copilot 的“//”补全能把寄存器 bit 字段一口气解释清楚,复制到 Word 再改格式,一下午搞定 10 页。
3. 实战:同步 Buck 的 AI 一条龙
3.1 需求→自然语言
“STM32G474,同步 Buck,输入 20 V,输出 5 V/6 A,开关频率 600 kHz,带死区互补 PWM,ADC 触发采样,中断调整 PID。”
3.2 AI 生成 PWM 驱动(寄存器版)
把上面这句话丢给 CodeWhisperer,提示词加三行约束:
- 使用 Timer1 高级定时器
- 通道 1/1N 互补输出,死区 120 ns
- 中断里读 ADC 并调 PID
30 秒后拿到如下代码(我删掉了冗余位,保留核心):
/* AI 生成,人工 review 后上板验证 */ void MX_TIM1_Init(void) { /* 1. 时基 600 kHz */ TIM1->PSC = 0; TIM1->ARR = 13333; // 170 MHz / 13334 ≈ 600 kHz /* 2. 通道 1 PWM1 模式 */ TIM1->CCR1 = 3333; // 25 % 占空比 TIM1->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; /* 3. 死区 120 ns,DTG 计算 170 MHz → 20.4 */ TIM1->BDTR |= (20 << TIM_BDTR_DTG_Pos); /* 4. 主输出使 */ TIM1->BDTR |= TIM_BDTR_MOE; } void ADC1_IRQHandler(void) { if (LL_ADC_IsActiveFlag_EOC(ADC1)) { uint32_t adc = LL_ADC_REG_ReadConversionData12(ADC1); float vout = adc * 3.3f / 4096 * (R2/(R1+R2)); float err = 5.0f - vout; duty += PID_Calc(&pid, err); // AI 也顺手给了 PID 结构体 TIM1->CCR1 = (uint32_t)(duty * TIM1->ARR); } }关键注释、寄存器位、中断入口,AI 一次给齐。人工只改了两处:
- 把浮点乘法换成定点,避免 FPU 在中断里拖时间。
- 加饱和判断,防止 duty>ARR 炸 MOSFET。
3.3 仿真验证
再把同一套参数丢给 ChatGPT,让它生成 PySpice 脚本,跑开环小信号模型。AI 自动把输出 LC 值、ESR、环路增益图画出来,截止频率 58 kHz,与理论值 1/(2π√LC) 差 3 %,直接用来写论文“模型与实测对比”小节,导师没挑出毛病。
4. 生成代码怎么验?——别盲信
AI 写的代码风格再漂亮,也逃不过“三问”:
- 边界条件全了吗?
- 中断里浮点安全吗?
- 异常能自愈吗?
我的验证流程:
- 单元测试:Google Test 搭在 PC 上,PID 饱和、ADC 越界、占空比突跳都跑一遍,覆盖率 90 % 以上。
- HIL 测试:用 Typhoon HIL 把 STM32 数字 IO 接到虚拟功率级,模拟短路、开路,AI 代码里原来没写“过流锁存”,一跑就炸,回炉加 comparer 中断。
- 静态分析:Cppcheck 扫一遍,AI 喜欢用的 magic number 全被标红,人工改成宏定义,再提交。
一句话:AI 是“高级实习生”,能干活,但得有人签字。
5. 生产环境避坑指南
- 硬件抽象层必须解耦:AI 生成的代码直接操作寄存器,移植到同系列不同封装就翻车。自己再包 xx_hal_pwm.c,把 AI 代码当“参考实现”,对外只留 pwm_set_duty()。
- 版本回溯:Copilot 会“越写越飘”,同一句提示词隔两天给的结果不一样。用 git 把 .ai_prompt 和 .c 一起提交,回退可追踪。
- 人工审查:再忙也得把 AI 生成的寄存器值打印出来,跟 datasheet 对一遍。我就踩过 DTG 算错 1 位,死区少 8 ns,上板子炸掉 30 块 MOS 的坑。
6. 留给你的小作业
把下面这段“低效控制逻辑”喂给 AI,让它重构:
/* 原始代码:每 ms 一次中断,浮点 PID,全程关中断 80 µs */ void TIM6_IRQHandler(void) { __disable_irq(); float e = 5.0 - adc_read(); duty += 0.1*e + 0.05*(e - e_prev); set_pwm(duty); e_prev = e; __enable_irq(); }要求:
- 中断耗时 < 5 µs(170 MHz,CPU 单周期≈5.9 ns)
- 不用浮点
- 支持限幅与抗积分饱和
跑通后,再思考:AI 改完的代码,在 100 kHz 中断频率下还能稳吗?实时性瓶颈到底卡在指令数,还是总线等仲裁?把结果贴在评论区,一起盘。
——毕设不是“写”完的,是“调”完的;AI 再强,也替不了示波器前的你。祝你一次上电就稳压,毕业答辩顺利通关。