简介:2011年全国大学生电子设计竞赛F题帆板控制系统论文,面向参加电子设计竞赛的高校学生及电子控制技术学习者。文档以MC9S12XS128为主控芯片,围绕直流风扇风速控制实现帆板转角调整,完整呈现系统方案论证、帆板受力分析、倾角传感器原理、数字PID电机调速算法,以及基于光电编码器与倾角传感器的闭环反馈设计。同时包含电路设计、软件设计和调试手段等工程实践细节,适合想进阶自动控制与嵌入式应用开发的读者参考。压缩包仅含1个doc文档,文件大小1.31MB,内容集中且结构完整,便于按章节研读。已有101人学习浏览,可用于备赛复盘、课程设计或项目预研。 2011年国赛F题“帆板转角控制系统”,在我带过的所有控制类题目里,属于那种看着人畜无害、做起来全是坑的典型。题目本身很朴素:一个直流风扇吹一块可以在转轴上摆动的帆板,通过调节风扇转速让帆板转到指定角度,角度用传感器读回来,构成一个闭环控制系统。可恰恰是这种“朴素”,把不少队伍挡在了国奖门外——机械结构没装好,传感器标定不准,PID调不出来,论文又写成流水账,每个环节都在丢分。这篇文章用参赛队员加上后来带队辅导的双重视角,把这道题从题目拆解、硬件选型、控制算法到论文成稿完整复盘一遍。正在备战国赛控制题的同学,或者想搞明白“一个闭环系统从零开始到底怎么做”的人,都可以把这份记录当参考。
1. 先拆题:F题到底在考什么
1.1 题目任务与系统构成
F题给出的基础条件,就是一套最原始的“风力摆”模型:一个转轴支架,一块轻质帆板,一个12V直流风扇。风扇固定在支架的一头,帆板装在转轴上,改变风扇电压就改变了风速,帆板在风力作用下绕轴转动,转过的角度由装在转轴上的角度传感器检测。
参赛队伍要做的,是在这套裸件上搭建完整的控制系统:通过按键输入目标转角,系统自动调节风扇风力,让帆板转到目标位置并稳定保持,同时在显示模块上同时看到设定值和实时值。系统拆开看就是一条标准闭环链路:传感器测量、主控计算、功率驱动、风扇执行。每一环看着都不难,串在一起就到处都是坑。当年不少组把精力全砸在算法上,结果传感器读数本身都有好几度误差,算法再漂亮也是白搭。
1.2 基本要求与发挥部分的评分逻辑
按当年题目给出的阶梯式要求,基本部分主要考察“稳态性能”:从任意角度开始,系统能够快速把帆板带到设定角度,误差要压进题目规定的范围,并且长时间保持不漂移。发挥部分则考察“动态性能”:帆板需要跟随设定的角度曲线运动,常见的是正弦波或三角波,在帆板上加负载后系统依然要能维持角度,这是对鲁棒性的直接考验。
我听不少评委私下聊过评分思路,这类控制题的分数分配往往不是“功能有没有”,而是分层次的:能稳定停住拿基本分,停得准再拿一部分,跟得上曲线、扛得住扰动,才是冲国奖的关键。所以备赛重点很清楚:先保证静差达标,再谈动态跟踪,别一上来就搞花哨算法,把基本功丢了。
2. 系统方案设计与关键选型
2.1 整体架构:为什么必须闭环
这个系统的核心矛盾是:风扇风速和帆板角度之间没有可靠的对应关系。同样一个占空比,第一次吹是35度,第二次可能变到38度,风向稍微偏一点、环境气流变一下,角度就不一样。如果把系统做成开环——按键设置多少角度就给多少占空比——那只能凭运气,没有任何实用价值。
所以必须做成闭环:把角度传感器实时值读回来,和目标值比较得到误差,控制器根据误差输出PWM占空比去驱动风扇,误差大就使劲吹,误差小就减风,这就是负反馈。闭环的好处在于,它不要求风速和角度一一对应,只要传感器读数准、控制器调得好,系统就能自动逼近目标值。这也是为什么F题本质上是一道控制理论基础应用题,而不是一道风扇驱动题。
2.2 核心硬件选型与避坑
先列一份当年我们组最终确定的硬件清单和选型理由,这里面有几个地方是真正决定成败的。
| 模块 | 选型 | 关键点 |
|---|---|---|
| 角度传感器 | 多圈导电塑料电位器(WDD35一类) | 便宜、线性度好、只需一路ADC |
| 主控 | STM32F103 | 12位ADC、PWM资源足、调试方便 |
| 风扇驱动 | N沟道MOS管(如IRF540N)+互补PWM驱动 | 低导通电阻,PWM调速线性好 |
| 风扇 | 12V直流无刷风扇 | 风量够大,电流0.2A左右 |
| 显示/输入 | 1602LCD + 4×4矩阵键盘 | 满足参数设置和状态显示需求 |
| 供电 | 12V稳压电源 + 5V/3.3V两路DC-DC | 电机和主控隔离供电,防止风扇反电动势干扰 |
角度传感器这里多说两句。当年可选方案有电位器、增量编码器、MPU6050姿态传感器。电位器的优势是模拟直读,接一个ADC通道就能用,线性度好,价格也便宜;缺点是机械磨损、有接触噪声,而且转轴不能无限转。编码器精度高,但增量式要自己处理方向和计数,比赛时间这么紧容易折腾;MPU6050免安装,但要处理零点漂移和振动干扰,融合算法复杂。对F题这种摆动范围小、精度要求又不算变态的场合,电位器是最稳的答案。我后来带队伍时也一直推荐:能用一块钱解决的可靠性问题,不要去赌一块贵的传感器一定好用。
机械结构是最容易被低估的扣分点。转轴要顺滑,但不能旷量太大,否则角度读数会晃;帆板重心要尽量靠近转轴,不然不同角度下重力矩不一样,风扇控制会左右不对称;转动范围两端要加限位,防止电位器超行程损坏。这些看着都是“手工活”,但直接影响后面PID能不能调出来。
2.3 风扇非线性的处理思路
直流风扇有一个特别坑的特性:低占空比下有明显的死区。我们实测过手里那只12V风扇,占空比低于12%左右时转子根本不转,从12%到30%这段转速上升又特别陡,再往上反而趋于平缓。整条“占空比-转速”曲线是严重非线性的。
这给PID调试会造成一个现象:系统在小误差时,PID输出落在死区内,风扇不动,积分项越积越多,等累积到越过死区,风扇突然猛转一下,角度一下就冲过头,接着又进入死区……表现出来就是帆板来回一顿一顿地爬,永远稳不下来。处理上最实用的办法是两段式补偿:先把风扇的“占空比-角度”开环特性标定出来,做成一张表;实际控制时,给PID的输出叠加上一个死区补偿量,让输出平滑跨过非线区。当年我们做了一张32点的标定表,效果立竿见影。
3. 控制算法:F题的核心战场
3.1 被控对象的近似模型
在写控制代码之前,有必要先把被控对象“画出来”。帆板被风吹动的过程,粗略看是一个一阶惯性环节,风力转换成帆板角速度要克服转动惯量和阻尼,可以用 G(s) = K / (Ts + 1) 近似;由于风扇转速响应和气流传播都有延迟,还要再串一个 e^(-Ls) 的延迟环节。
这个模型不用建得多精确,但能帮你想明白两件事:时间常数T大,说明系统反应慢,PID的微分项要适当加强去抵消延迟;纯延迟L的存在,决定了Kp不能取得过大,否则系统必然振荡。我当时把这两个参数粗估出来后,调参方向就非常明确了:先用纯比例把系统推到临界稳定,记下临界增益和振荡周期,再用工程经验公式给出PID初值,省了无穷无尽的瞎试。
3.2 PID结构与工程细节
F题的控制律用位置式PID就够了,公式很经典:
u(k) = Kp * e(k) + Ki * Σe(j)*Ts + Kd * (e(k)-e(k-1))/Ts
这里的输出u(k)是PWM占空比百分比,e(k)是当前角度误差。工程实现时,有几个细节直接决定成不成。
第一是采样周期。角度采样和控制周期我们取20ms,比风扇响应快很多,又不会太频繁导致计算抖动;PWM频率取20kHz,避开可听噪声区间。第二是积分限幅。没有限幅的积分项会在启动阶段疯狂累积,导致第一次冲过目标后半天拉不回来,一定要把积分项限制在输出范围的10%以内。第三是输出限幅,占空比0到100%必须写死,防止计算溢出损伤MOS管。第四,启动时给一个阶跃式的前馈补偿,比如先把占空比一下提到40%,让帆板快速接近目标角,再交给PID精细调节,能显著缩短稳定时间。
核心代码逻辑不长,写出来大概是这个感觉:
float pid_process(float target, float current) { float err = target - current; integral += err * Ts; if (integral > INT_LIMIT) integral = INT_LIMIT; if (integral < -INT_LIMIT) integral = -INT_LIMIT; derivative = err - last_err; last_err = err; float out = Kp * err + Ki * integral + Kd * derivative / Ts; if (out > 100.0f) out = 100.0f; if (out < 0.0f) out = 0.0f; return out; }实际控制时,把pid_process返回的占空比叠加上死区补偿值,再给到定时器的比较寄存器就行。
3.3 调参实战记录
调参数我没有用玄学,用的是“频域思想指导下的时域试凑”。第一步先让PID里只剩P,Kp从很小开始逐步增加,观察角度阶跃响应曲线,直到出现等幅振荡,记录临界增益和振荡周期;第二步按Ziegler-Nichols公式算一组初值,再把I放进去压掉静差;第三步加D抑制超调,最后在整定好的参数附近微调。
因为不同队伍机械结构不同,参数不能照抄,但可以给个量级参考:如果误差按“度”算、输出按“占空比百分比”算,Kp大概在0.8到1.5,Ki在0.03到0.08,Kd在1到2。我当时的最终参数大约在这个区间,配合死区补偿后,从按下启动到稳定在目标角误差正负1度以内,2秒左右就能完成。这个过程中最重要的一件事,是用串口把设定值、实时角度、PID输出三路数据发到上位机画曲线,光盯LCD猜状态,效率实在太低了。
4. 从调通到成稿:F题论文怎么写
4.1 设计报告的评分逻辑
一个“论文(F题).doc”文件,其实对应的是竞赛官方要求的设计报告,不是学术论文。评委要在很短时间里读完几百份报告,你的结构必须清晰到他们可以快速找到得分点。标准结构一般是:摘要、方案设计与论证、理论分析与计算、电路与程序设计、测试方案与结果、总结。
摘要是最重要的部分,200到300字,必须把“做了什么、关键指标、亮点”写清楚。方案论证要说清“为什么选这个”,而不是只罗列选了什么。理论分析和计算要有公式推导,比如PID参数的依据、传感器标定的曲线。程序部分放流程图和核心代码,篇幅不用长,但要能看出程序逻辑清晰。测试结果用表格和曲线截图说话,最后一定要有误差分析。
4.2 数据、图表与测试方案怎么呈现
另一个高频丢分点是测试数据质量。很多队伍只放一组“最好成绩”的数据,评委一看就觉得不完整。正确的做法是设计一组有梯度、可重复的测试:设定角取0、15、30、45、60、75、90度,每个点测3次,记录稳态误差和稳定时间;跟踪测试选正弦波和三角波两种波形,给跟踪误差的统计值。把原始测试记录整理成表格,配上系统框图、程序流程图、实物照片、示波器波形截图,整篇报告的说服力一下子就不一样了。
4.3 论文中最容易丢分的低级错误
我每年评审季都会看到一些硬伤:图表没有编号和标题,电路图和实物对不上,程序参数和测试结果自相矛盾,摘要写了一页纸还没进入正题,方案论证部分全在抄资料。这些问题单看都不致命,但累积起来,会让评委产生“这支队伍不严谨”的整体印象,在打分时非常吃亏。所以写完报告之前,一定要互相找茬:让一个没参与调试的队友拿报告对着系统实物逐步核对,数据和流程有任何对不上,就返工改掉,这类错误很蠢但每年都有人犯。
5. 问题排查实录与独家心得
5.1 帆板抖动、来回扫
现象是帆板在目标角附近不停小幅震荡,甚至发散成大幅来回摆动。优先检查比例项是否过大,这是震荡最直接的原因;然后看传感器ADC采样值是否跳动,如果有毛刺,先做滑动平均滤波再看PID输出;最后确认PWM频率是不是太低,风扇转速波动会持续激励系统。排查顺序按“软、固、硬”来:先软件降增益,再看采样,最后检查风扇供电和机械松动。
5.2 静差压不下去
角度离目标总差2到3度,怎么调Kp都没用。别急着加Ki,先检查传感器标定:是不是零点和满量程线性不对,导致读回来的“准”其实是假的。把角度传感器转到机械零度处,看ADC读数和软件映射值是否对应,确认无误后再看积分项是否被限幅限制住了。风扇死区也会制造静差,PID输出落在死区里,积分再大也推不动,这时候要做死区补偿。
5.3 角度上不去或失控飞车
角度上不去,先看机械阻力、帆板位置、风扇距离,再查PWM输出限幅是否太小,最后确认供电电压是否被拉低。飞车往往是角度传感器接线松动、ADC读数跳变,或者PID输出符号搞反了,一定要思考“风扇越吹越远”是不是控制方向反了——这种低级错误我们当时也犯过,把误差定义成目标减实际还是实际减目标搞反,排查了整整一个上午。
| 现象 | 首要排查点 | 次要排查点 | 原因归类 |
|---|---|---|---|
| 小幅震荡 | Kp过大、PWM频率低 | ADC噪声、积分饱和 | 控制参数、传感器 |
| 大幅来回扫 | 积分饱和后冲击 | 死区补偿失效 | 控制参数、非线性 |
| 静差明显 | 传感器标定 | 积分限幅、风扇死区 | 测量、非线性 |
| 角度上不去 | 机械阻力、供电 | PWM限幅太小 | 执行机构 |
| 飞车失控 | 控制方向反了 | 传感器断线 | 低级错误、接线 |
5.4 最后再分享一点备赛心得
带过几届队伍之后,我越来越确认一个规律:控制类题目本质是“测控一体”的综合工程题,算法只是最后一块拼图。传感器标不准,机构不顺滑,风扇非线性不处理,再高级的控制器也救不回来。反过来,如果把这些基础工作做扎实,一个标准PID就能拿到相当好的分数。另外强烈建议提前做好串口调试上位机和标定工具,比赛那四天时间紧张,调试工具顺手,等于给全队节省至少半天时间。这篇复盘写下来,也算是对当年那份《论文(F题).doc》的一个交代,希望对正在备赛的你有帮助。
本文还有配套的精品资源,点击获取