找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5331|回复: 3
收起左侧

风力摆控制系统赛题解析与stm32源代码

[复制链接]
ID:161768 发表于 2017-8-11 02:54 | 显示全部楼层 |阅读模式
第一步,控制系统选型:刚才说了,我们需要做一个伺服随动控制系统,通常衡量伺服系统
性能的指标有“带宽”、“精度”、“抗干扰能力”等。先说系统带宽,带宽反映风力摆跟踪的快 速性。带宽越大,快速性越好。风力摆控制系统的带宽主要受到控制对象和执行机构的惯性 的限制。惯性越大,带宽越窄。根据题目要求做“自由摆运动”,由单摆周期公式可以求得风 力摆的摆动周期 T 在 1.3-1.6 秒之间,换算成频率 f 在 0.625-0.77Hz 之间,大家可以自己掐 表计算一下摆动的周期。由此可知我们需要设计出一个带宽大于 0.77Hz 的控制系统(取0.8Hz)即可完成题目的要求。出题的专家制定的这个指标还是简单的,要知道现代伺服控 制系统带宽已经超过了 50Hz。角度采样率根据奈奎斯特采样定理,理论上选取 fs>2f 即可, 但是题目中要求了系统最大调节时间,为了使得控制效果更好,需要取 fs>10f 甚至更高, 在本次设计中采样率选取 200Sa/s,控制周期 5ms。


第二步,电机选型:这是本题的最大争议,在此我也不想把这个争议扩大,所以我不讨论电 机是否违规的问题。现在从实现效果这个角度来讨论电机的选型,不管黑猫白猫,抓到老鼠 就是好猫!
我把轴流电机、空心杯电机、无刷电机做成一个表格。
电机
重量
推重比
频率响应
机动性
抗干扰能力


轴流电机




<0.5


<2Hz


较低




空心杯




3~8


4-8Hz


较高


很弱
无刷电机
7~12
3-7Hz
适中
主要看推重比和机动性这一栏,推重比、机动性是航空器的专业术语,发动机在水平面上的
最大推力和发动机的净重之比称为推重比。机动性是指风力摆在一定时间内改变运动速度、 方向的能力。


从这个表格来看,推重比是我们选择电机的重要指标,而机动性是整个风力摆灵活性的重要 指标。注意到赛题目说明部分的第 9 条:“赛题中要求的各项动作完成时间越短越好”。毫无 疑问,出题人已经说明了要尽可能的提高系统的机动性。从最优实现效果来看,无刷电机和 空心杯电机是更优的选择。但是为什么有人用轴流电机也能完成题目要求呢?答案就在频率 响应上,第一步已经分析了系统带宽 0.8Hz 即可满足题目要求。如果题目规定 15 秒内完成20 个单摆运动,这个难度就上来了,因为用轴流电机的系统带宽不够了。但是采用轴流电 机有个好处,在圆周运动时即使做开环控制风扇干扰几乎吹不动。

第三步,传感器选型:我们再说说精度(检测误差),检测误差包括传感器的误差和机械误 差,是传感器和机械本身所固有的,控制系统无法克服。根据题目给出的±2.5cm 偏差可以知传感器精度只要达到 0.5°就可以了,所以用 MPU6050 传感器是可以达到题目要求的。机 械误差则要求机械完美的对称,所有的东西都要对称,机械做的越好,最后出来的效果就越 好。至于传感器的数据融合、滤波器设计部分请看程序贴图:计算三次角度然后求平均值, 再经过卡尔曼滤波器滤波的角度值就可以使用了。角度数据一定要稳定,无高频干扰![/hide]
1.005.jpg

算法设计
当硬件 OK 以后算法就是整个系统的核心灵魂了,俗话说条条大路通罗马,能够达到题目要 求的方法有很多,这次比赛童鞋们用的算法大概有几种方式:逻辑判断法、查表法,定点 PID 法,力合成法,矢量方程法等等。有的队直接采用查表法开环控制也能取得不错的成绩, 只要能够达到要求的算法都是OK 的。

说一下我的算法设计吧,出题人在第一问就告诉了要做自由摆运动,从自由摆可以联想到
2011 年的 B 题——基于自由摆的平板控制系统。这是一个单摆,但是单摆是非线性运动, 我们通常会把非线性的东西通过某种思路去近似成线性的(如二极管的伏安特性曲线等效模 型),在单摆中,当采样率足够高时两个采样点之间的连线可以近似看成是线性的,有木有 感到很熟悉?在高中物理学过了简谐运动,物体所受的力跟位移成正比,并且总是指向平衡 位置。这是一种由自身系统性质决定的周期性运动。(如单摆运动和弹簧振子运动)实际上简谐振动就是正弦振动!其数学方程为θ(t)=Asin(ωt+ψ),A 是振幅,ω是频率,ψ是相位。

好!说到这,来直接看一下题目第二问的要求(第一问直接跳过)。题目要求幅度可控,幅 度可控是啥?不就是振幅 A 可控嘛,可控范围是多少?30-60cm 换成角度。好了,分析完 了,第二问就是一个 A 可设置的正弦运动,OK。至于线性度偏差,只要你机械搭对称了, 这都不是问题,况且别忘了有 X,Y 两个方向的电机呢。
把第二问的程序贴图出来:
1.007.jpg
第三问,摆动方向可设置。这里需要介绍一个知识点了:李萨茹图形。当风力摆同时参与两
个相互垂直方向的简谐振动,风力摆的位移是这两个振动的位移的矢量和,如果两个振动的 频率具有整数比关系时,风力摆的运动路径是稳定的封闭的曲线,这些曲线即李萨如图形。 具体的理论推导和计算这里就不贴出来了,可以自行百度,现在直接把结论贴出来,李萨茹 图形由以下参数方程定义:
x(θ)=Asinθ y(θ)=Bsin(θ+ψ)
若 A=B,ψ=任意,则曲线是椭圆;

1.008.jpg

若 A=B,ψ=π/2 或 3π/2,则曲线是圆;
1.010.jpg

若ψ=0 或π,则曲线是直线段。

1.011.jpg
直接看图清晰明了,第三问我们只需要在 X,Y 方向分别进行频率相同,相位ψ=0 或π,振幅A,B 可设置的简谐运动即可很好的完成题目的要求。 例如,想要 45°怎么办?tan45=1,设置振幅 A/B=1 即可:
x(θ)=10*sinθ y(θ)=10*sinθ
例如,想要 60°怎么办?tan60=根号 3,设置振幅 A/B=根号 3 即可:
x(θ)=根号 3*sinθ y(θ)= 1*sinθ
例如,想要 120°怎么办?tan120=-根号 3,设置振幅 A/B=-根号 3 即可:
x(θ)=-根号 3*sinθ y(θ)= 1*sinθ 细心的童鞋一定会发现,出题人对第三问的要求简单了,只要求摆动角度可控,但是通过上 述方法不仅角度可控,摆长也是可控的!

把第三问的程序贴图出来:
1.013.jpg

第四问,5 秒内能够制动。这个没有什么运动路径可言,纯粹是考察大家的 PID 是否熟练掌
握,PID 目标值设为 0°即可。注意 D 要给大一些,不要有积分。 第四问的程序图:
1.014.jpg

第五问,画圆。出题人通过基础部分一步一步引导完成画圆,真是用心良苦。如果能够领 会出题人的想法,把第二问、第三问完成好,这一问是水到渠成的事情。再次把第三问的图 贴出来,如何画圆?
若 A=B,ψ=π/2 或 3π/2,则曲线是圆! OK!完成了,这是圆,而且画出来很圆!如果画出了椭圆,一定是相位ψ有偏差,调节一下 相位即可!
第五问的程序贴图:
1.016.jpg
细心的童鞋会发现,题目做到这一步,θ(t)=Asin(ωt+ψ)这个方程就是贯穿本题的核 心!如果你的系统做得足够好,就会发现这个方程的每一个参数你都可以自由的控制,结果 就是你不仅可以让摆幅可控、摆动周期可控、摆动方向可控,而且可以画出以下这些曲线:
1.017.jpg

1.019.jpg
第六问:画圆抗干扰。考察伺服系统的抗扰动能力,出题人用这一问来把开环,半开环控制
1.020.jpg 和闭环控制的队伍拉开距离。当一个干扰过来的时候,风力摆的运动方程肯定不是 θ(t)=Asin(ωt+ψ)了,题目给出了系统最大调节时间为 5 秒,能够在 5秒内恢复 Asin(ωt+ψ) 即可。这就牵扯到了伺服控制系统的重要指标——快速跟踪和准确定位。有很多种算法可以 选择,例如常见的 LQR、自适应、模糊控制、神经网络等等。相信绝大部分还是用了经典 的 PID 算法,简单,快速,效果尚可!就看谁的 PID 调得熟练了,这个需要功夫在平时, 多调多想多看就 OK!PID 需要调成大概是这样的波形,能够在一个周期之内快速跟踪正弦 运动:
如果你调成这样的波形是不行的,需要把 K 降下来,D 调高:

1.021.jpg
如果调成这样,波形相似相位跟不上,系统惯性大,请把 D 调高。

1.023.jpg
第七问:其他部分,今年出题人给其他项分配了 10 分,想拿高分的队伍是必须拿下这 10 分的。前面说了,如果你的控制器做得足够好,是能够画出花样百出的图形的,有很大的发 挥余地。有的队伍是画三角形、正方形、画 8 字,有的是做跟踪物体、手写写字、画斜直线, 做漂亮的 GUI 界面等等都有。根据以往经验,在有限的时间内建议不要把时间花在漂亮的 GUI 界面上,要放在更多的运动控制上,牢牢把握题目考察的侧重点拿分!

总的来看,今年这道题目难度适中,出题人还是考虑得比较周全的,让各种风机各种算法都 能够达到要求,众口难调,确实不简单。同时也反映了电赛控制类的趋势。从 2011 年的小 车这种纯逻辑判断的题目到 2013 年倒立摆这种定点稳态系统再到 2015 年风力摆的动态跟 踪系统,实现了从逻辑到算法、从静态到动态、从二维到三维的转变,准备 2017 年电赛控 制类的同学要多多留心了。个人感觉功夫还需在平时,搞突击是不行的,多参加比赛,多接 触实际的项目好处多多,机会留给有准备的人,相信你也可以!

0.png
stm32单片机源程序如下(主程序):
  1. /*-------------------------------------------------------------------------------------------
  2.                                                    风力摆控制系统(2015-8-12)

  3. 硬件平台:
  4.                          主控器: STM32F103VET6 64K RAM 512K ROM
  5.                         驱动器: LMD18200T
  6.                     电源:   DC +12V

  7. 软件平台:
  8.                          开发环境: RealView MDK-ARM uVision4.10
  9.                         C编译器 : ARMCC
  10.                         ASM编译器:ARMASM
  11.                         连接器:   ARMLINK
  12.                         底层驱动: 各个外设驱动程序      

  13. 时间: 2015年8月12日      

  14. 作者: BoX
  15. -------------------------------------------------------------------------------------------*/   
  16. #include "stm32f10x.h"
  17. #include "usart1.h"                                         
  18. #include "delay.h"
  19. #include "led.h"
  20. #include "timer.h"
  21. #include "motor_control.h"
  22. #include "motor_pwm.h"
  23. #include "motor_pid.h"
  24. #include "stdlib.h"
  25. #include "indkey.h"
  26. #include "mpu6050.h"
  27. #include "ahrs.h"
  28. #include "math.h"
  29. #include "usart2.h"
  30. /*------------------------------------------
  31.                                  全局变量                                
  32. ------------------------------------------*/
  33. extern uint8_t Q1_Start;
  34. extern uint8_t Q2_Start;
  35. extern uint8_t Q3_Start;
  36. extern uint8_t Q4_Start;
  37. extern uint8_t Q5_Start;
  38. extern uint8_t Q6_Start;
  39. extern uint8_t CurMode;
  40. /*-----------------------------------------
  41.                             初始化外设
  42. ------------------------------------------*/
  43. void BSP_Init(void)
  44. {
  45.         DelayInit();
  46.         LED_GPIO_Config();
  47.         Key_IO_Init();        
  48.         PID_M1_Init();
  49.         PID_M2_Init();
  50.         M1TypeDef_Init();
  51.         M2TypeDef_Init();        
  52.         PWM_Init();
  53.         TIM1_Config(10000-1,71);  /* TIM1 10ms Inturrupt  */
  54.         TIM5_Config(5000-1,71);   /* TIM5 5ms Inturrupt 采样率200Hz 不能更改*/
  55.         USART1_Config();
  56.         USART1_printf(USART1," 系统启动成功!");
  57.         USART2_Config();
  58.         Display_Title();
  59.         MPU6050_Init();                  //MPU6050                                                                           
  60.         TIM_Cmd(TIM5,ENABLE);            //电机控制都在TIM5完成
  61.         TIM_Cmd(TIM1,ENABLE);
  62. }
  63. /*-----------------------------------------
  64.                                 主 函 数
  65. ------------------------------------------*/
  66. int main(void)   
  67. {   
  68.         BSP_Init();
  69.         //角度采样和运动控制都在TIM5_IRQHandler()中完成
  70.         while(1)  
  71.         {         
  72.                 if(Q1_Start == 1)
  73.                 {
  74.                         CurMode = 1;
  75.                 }
  76.                 else if(Q2_Start == 1)
  77.                 {
  78.                         CurMode = 2;
  79.                 }
  80.                 else if(Q3_Start == 1)
  81.                 {
  82.                          CurMode = 3;
  83.                 }
  84.                 else if(Q4_Start == 1)
  85.                 {
  86.                          CurMode = 4;
  87.                 }
  88.                 else if(Q5_Start == 1)
  89.                 {
  90.                         CurMode = 5;
  91.                 }
  92.                 else if(Q6_Start == 1)
  93.                 {
  94.                         CurMode = 6;
  95.                 }
  96.                 else
  97.                 {
  98.                         CurMode = 0;
  99.                 }        
  100.         }     
  101. }

  102.         
复制代码
0.png
所有资料51hei提供下载地址(完整源码+pdf):
http://www.51hei.com/bbs/dpj-92234-1.html





回复

使用道具 举报

ID:405033 发表于 2019-4-10 16:36 | 显示全部楼层
楼楼,请问这个主控板是什么型号的呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表