2015年电赛国赛风力摆实例

题目

风力摆控制系统(B题).pdf

一、任务

一长约 60cm~70cm 的细管上端用万向节固定在支架上,下方悬挂一组(2~4 只)直流风机,构成一风力摆,如图 1所示。风力摆上安装一向下的激光笔,静止时,激光笔的下端距地面不超过 20cm。
设计一测控系统,控制驱动各风机使风力摆按照一定规律运动,激光笔在地面画出要求的轨迹。

二、要求

1、基本要求

  1. 从静止开始,15s 内控制风力摆做类似自由摆运动,使激光笔稳定地在地面画出一条长度不短于 50cm 的直线段,其线性度偏差不大于±2.5cm,并且具有较好的重复性
  2. 从静止开始,15s 内完成幅度可控的摆动,画出长度在 30~60cm 间可设置,长度偏差不大于±2.5cm 的直线段,并且具有较好的重复性
  3. 可设定摆动方向,风力摆从静止开始,15s 内按照设置的方向(角度)摆动,画出不短于20cm 的直线段
  4. 将风力摆拉起一定角度(30°~45°)放开,5s 内使风力摆制动达到静止状态

2、发挥部分

  1. 以风力摆静止时激光笔的光点为圆心,驱动风力摆用激光笔在地面画圆,30s 内需重复3次;圆半径可在 15~35cm 范围内设置,激光笔画出的轨迹应落在指定半径±2.5cm 的圆环内
  2. 在发挥部分(1)后继续作圆周运动,在距离风力摆 1~2m 距离内用一台 50~60W 台扇在水平方向吹向风力摆,台扇吹 5s 后停止,风力摆能够在5s 内恢复发挥部分(1)规定的圆周运动,激光笔画出符合要求的轨迹
  3. 其他。

四、说明

见pdf


成品展示


↑测评现场

↑万向节

↑测试场地

↑整体外观


方案确定

1.风机选用

读题可知, 题目要求使用风机将受控部分自身吹起
我们组事先备有一些风机, 但是由于过于笨重, 只能将自身吹起10°度左右, 只好放弃.
之后寻找替代方案, 想到尝试用空心杯电机, 测试发现3.5V/1.5A可将自身吹起25°左右, 还是略勉强.
只好狠心把手上现有的四轴飞行器拆了, 利用上面带齿轮组的空心杯电机做

2.传感器

这是需要控制一个风摆
要做到精确控制, 得做一个闭环系统, 控制的同时观测控制效果作为反馈改变控制量(常用算法是PID).
控制的是风摆上的风机, 需要测的是当前风摆的姿态, 自然能联想到陀螺仪, 使用它可以得知摆的当前姿态.
手上有现成的MPU6050

3.结构

设计结构时, 材料都尽量选了轻的, 将主控板/驱动板/电源都外置了,
摆子上, 只放置风机+MPU6050.
摆的竿子, 用了铝棒, 很轻, 容易加工, 运动中不会像塑料棒一样左摇右晃更不会自旋, 省了不少事.
支架嘛…东拼西凑来的, 找了一截粗铝棒, 拆了个抽屉取了轨道做支架, 借了个钻台的底座…
线材, 信号线统一用细的, 电机的线用了比较粗的2A的线, 用自紧塑料扎带整理好.

这个结构在后面的评测环节证明, 容易拆解, 还不容易出问题…

4.电机驱动电路

由于没有正反转的需求, 这里直接就用了mos管驱动.

5.电源

一开始用着实验室的稳压电源, 没考虑电源的问题.
后来换了自制的4A电源发现, 3个以上空心杯一起工作, 电源电压就明显下降了.
才意识到一个空心杯在3.5V时, PWM满调制电流会在2A以上.. 电源完全不达要求.
马上使用万能的TB找到了本市的某个角落有卖开关电源, 马上打飞的购回5V 10A(10%电压可调)的开关电源, 丙把电压调到3.8V.

6.主控

这种比赛当然是直接上平时用得多的..STM32F1.

P.S.完全确定这些架构的时候 已经是第三天的中午了…于是第三天的晚上只睡了3个小时…


程序部分

题目要求那么多, 总之就是: 摆直线/制动/画圆

风机调速

使用MCU的TIMER提供的PWM功能

PID算法

做这一题必须用到PID算法, 网上资料已经很多了.
我们发现, 做这题只用P参数就够.

角度传感器

这里选用的MPU6050, 网上资料很多.
我们使用别人从MSP430移植到STM32上的DMP库, 能直接读出四元数, 转换成欧拉角就能知道当前姿态.
详见interface_mpu6050.c

程序框架

这里使用一个平面状态机做框架.
每输入一个传感器数据, 都根据当前系统状态, 进行不同的处理.
制作了一个串口调试命令系统, 可以使用串口, 输入命令更改一些参数, 帮助调试.

P.S. 以上是比赛前就做好的准备工作

风机控制程序

风机控制程序控制PWM输出量,
以同在一个方向的1,3的电机为例,
当风机控制量为正, 1号转,3号停; 为负反之.

这里还有一个很必要的工作, 就是为每个电机设定一个运行时可调的系数, 每次运行时, 手动把四个电机的风速尽可能调平衡.

一般来说, 为了达到更好的控制效果, 会在这个程序中做一个PWM与风速的拟合, 使控制量与风速尽可能的呈线性关系.
我们没做是因为风速很难测.

摆直线

要求一.
画不定长直线段(超过50cm)
方案
开始时, 先给风摆动起来, 具体做法是让单边电机工作, 然后停止, 之后进入测控流程.

测控流程:
若当风摆角度为正时, PID目标角度值也设为正;
若当风摆角度为负时, PID目标角度值也设为负.

这样做的目的是:
速度方向朝向目标角位置时, 远离目标值时(就是底部)风机速度最快, 在目标值附近风机不起作用;
速度方向背向目标角位置时, 风摆由于重力会有向下的力, 风机使风摆下降速度变缓;

设定一个合适的目标角, 让画出的直线段超过50cm即可.

要求二.
画长度可控的直线段
方案
同要求一方案, 但是需要标定, 即确定目标角与实际画出的直线段间的关系.
根据用户输入长度, 查表即可.

要求三.
在底图上标注的任意角度上画直线
方案
依旧是方案一的扩展.
只不过现在需要用两个PID, 分别控制两个方向的两组螺旋桨.
然后依旧用标定的方式, 调整
以下是我们做的标定, 从0°测到40°(其余角度都可以根据这个推出来),

1
2
3
4
5
6
7
const uint32_t DATA_J3_pwm_table[][3] = {
{ 14000 , 0 , 11}, /* 0 */
{ 16000 , 5000 , 11}, /* 10 */
{ 16000 , 7000 , 11}, /* 20 */
{ 16000 , 9200 , 11}, /* 30 */
{ 13000 , 10000 , 11} /* 40 */
};

第一个值为x方向PID的P参量,
第一个值为y方向PID的P参量,
第三个值为目标角.

成功的关键, 是前面提到的电机必须调平衡….否则摆若干次后, 风摆会开始画明显的椭圆.

制动

题目要求5s内达到静止状态
方案
使用两路PID用来控制两个方向的两组风机, 将目标角设为0, p参数为负数(就是让风摆在下落时减速以趋向静止)即可.

单以这样的原理, 实际效果并不好, 在p参数不会引起自激的前提下, 只能做到在15s内静止.
于是我们让PID的p参数在不断接近静止的过程中下降, 最后基本能做到5s内静止.
我们的具体做法是: 角度低于某数值一段时间后, 确定下降到一定高度, 调低一次p值.

画圆

原理: 让风机产生的合力为定值, 且力的方向与当前风摆抬起的方向相同.
方案
我们用了一个投机取巧的方法, 我们叫它”PWM值传递画圆”
以初始PWM=3为例, 四个风机的PWM值这样变化:

风机1 风机2 风机3 风机4
3 0 0 0
2 1 0 0
1 2 0 0
0 3 0 0
0 2 1 0
0 1 2 0
0 0 3 0
0 0 2 1
0 0 1 2
0 0 0 3
1 0 0 2
2 0 0 1

不断循环执行.

用这个偷懒的方法, 需要确定三个变量: 初始PWM, 每隔多少时间传递一次PWM值, 每次传递多少PWM值
慢慢调整这三个参数, 就能调出不同直径的圆…
这是一个省事又有效的方法..
如果画的不够圆, 先把风机调平衡吧.


总结

这一题, 个人感觉最麻烦的几点是:

  1. 机械方案确定: 一些组失败在装置工作不稳定上, 我们组第三天才把装置完全搭好开始调程序.
  2. 风机调平衡: 如果调不平衡, 画圆和定角度摆直线都难以实现.
  3. 调试: 要有自己的一套调试方法, 一定设计有效的参数调整方案.

附上源程序吧:

prog.rar