找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8920|回复: 25
收起左侧

2015年电赛控制类—STM32风力摆控制系统资料+源程序

  [复制链接]
ID:313027 发表于 2019-7-19 13:49 | 显示全部楼层 |阅读模式
15年电赛已经过去四年了,19年电赛将至,在新一年的电赛到来之前给大家分享一份风力摆控制系统的全套资料(包括代码、上位机、设计报告等)。在此我要感谢我的指导教师王师傅,您是我见过最负责的教师,下面我们切入正题。
风力摆控制系统主要应用了一个物理知识——李萨如图形,李萨如图形贯穿整个风力摆设计的始终。无论是画直线还是画圆都应用到了李萨如图形,风力摆可以看成是XY两个方向上的简谐运动。当两个简谐运动的相位和周期相等、幅值不等时,风力摆会在下方画出不同长度不同角度的直线;当两个简谐运动的幅值和周期相等、相位相差Π/2时,风力摆会在下方画出不同半径的圆(具体请多了解一下李萨如图形)。风力摆的各种注意事项请大家仔细阅读代码中的READEME.txt文件,代码框架和STM32F1的源代码格式相同,方便大家理解。最后祝大家19年电赛都能取得一个好成绩!

接线方式:
        OLED:
                SCL------PB5
                SDA------PB4
                RST------PB3
                D/C------PA15
        MPU6050:
                SCL------PB8
                SDA------PB9
        L298N:
                PWM1----PB1
                R_EN1----PB12
                L_EN1----PB13
                PWM2----PA1
                R_EN2----PB14
                L_EN2----PB15
        KEY:
                KEY1-----PA11
                KEY2-----PA12
                KEY3-----PB6
                KEY4-----PB7

如有疑问请QQ联系:1183092619(注明来意否者不予通过验证)

风力摆图片:
IMG_20190719_133305.jpg

上位机图片:
~J1$N(7BL$RPOHVIO2)2UOP.png

风力摆控制系统是一种利用风力控制物体做简谐运动的系统,风力的利用和控制技术在我国的发展尚未完善,国内正处于起步阶段。风力摆的工作原理具有较为典型的自动化控制理论特点,其控制方法多种多样。深入研究,在许多工程技术领域都有着广阔的开发前景。风力摆系统的摆体由风扇构成,通过调整风扇的转速实现摆动位置及摆动路线的控制,由于摆动机构的滞后性,实现精确控制具有一定难度。通过合理的摆结构设计,并利用摆线理论建模,设计并优化控制策略,利用闭环结构提升摆的轨迹运动准确性。其中的控制原理对于人们处理工业工程,同样存在借鉴。系统对风摆控制参数设定、抗扰因素测试等惯性滞后问题解决具有借鉴意义,同时也为分析该类问题建立了直观的测试平台。风力摆是一种通过风机作为唯一动力驱动的装置,深入研究该系统对空间飞行器、四旋翼无人机的运动状态和卫星姿态控制具有重大意义。

三、主要研究内容

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) 其他。


四、总体思路与研究方案

1. 总体思路
风力摆控制系统是一个极其不稳定的系统,摆杆的长度、风机的安装位置、万向节的阻力等因素都会引起系统产生误差,该系统中应用了一个物理知识——李萨如图形。李萨如图形贯穿整个风力摆控制系统的始终,画直线时两个方向上的简谐运动相位相等,幅值不同就会画出不同角度不同长度的直线;画圆时两个方向上的简谐运动相位相差Π/2,幅值相同就会画出不同半径的圆。
设计整个系统时将角度传感器mpu6050固定在摆杆上,传感器返回的数据通过串口显示在上位机上。在程序里设置两条目标值曲线,根据上位机显示的实际值波形与目标值曲线之间的差异进行PID参数的整定。实际上整个系统的目的就是让实际值曲线沿着目标值曲线的轨迹运动。
2. 实施方案
(1)电机的论证和选择
方案1:采用驱动、风机一体化的轴流风机
驱动、风机一体化的轴流风机有可以免去驱动的设计、节省结构空间、控制方法简单,散热快等优点,但是他的风力较小而且重量大,响应速度和其他电机相比也比较慢。
方案2:采用空心杯电机
空心杯电机重量小,风力大,起动、制动迅速,响应极快,能量转换效率很高。但是他的抗干扰能力较弱容易受到很多外界因素的影响。

综合以上两种方案选择方案2。
(2)驱动模块的论证和选择
方案1:采用TB6612FNG驱动模块
TB6612FNG驱动模块双通道输出,可同时驱动两个电机。每个通道可以输出最高1A的驱动电流,启动峰值电流达2A。TB6612FNG是基于MOSFET的H桥集成电路,效率远高于晶体管H桥驱动器。
方案2:采用L298N驱动模块
L298N驱动模块是一种高电压、大电流的驱动模块,它采用L298N双H桥直流电机驱动芯片,单桥可以输出的最大驱动电流为2A,驱动部分端子供电范围为5V~35V。
综合以上两种方案选择方案2。
(3)主控模块的论证与选择
方案1:采用STC89C51单片机
STC89C51单片机最高工作时钟频率为80MHz,内含8K Bytes的可反复擦写1000次的Flash只读程序存储器,芯片内集成了通用8位 中央处理器和ISP Flash 存储单元。
方案2:采用STM32单片机
STM32单片机是ST公司使用arm公司的cortex-M3为核心生产的32bit系列的单片机,他的内部资源非常丰富,基本上接近于计算机的CPU了,最高工作频率72MHz。
综合以上两种方案选择方案2。
(4)角度检测模块的论证与选择
方案1:采用角度传感器
由UZZ9001和KMZ41组成角度测量模块,并使用矩形磁铁进行配合测量磁铁与KMZ41芯片之间的角度。UZZ9001将KMZ41输出的正余弦角度信号转换为数字信号,并通过SPI串口输出。但KMZ41调试比较困难,不方便用于测量倾角。
方案2:采用MPU6050模块
MPU6050测量角度集成了三轴MEMS陀螺仪,三轴MEMS加速度计。MPU6050对陀螺仪和加速度计分别用了3个16位的ADC,将其测量的模拟量转化为可输出的数字量。测量范围可控,通信采用I2C总线,操作简单。
综合以上两种方案选择方案2。
(5)电源的论证和选择
方案1:采用航模电池,
航模电池可以输出12V的电压,可反复充电。此方案的优点是风力摆与外界无需电源连线统安装方便,但电压会有波动,不能长时间稳定工作。
方案2:采用开关电源
利用开关电源虽然系统安装较复杂,但功率较大,电压稳定。
综合以上两种方案选择方案2
五、主要研究结果

经过我们团队的不懈努力,风力摆控制系统现在可以完成一下要求:
(1) 从静止开始,15s 内控制风力摆做类似自由摆运动,使激光笔稳定地
在地面画出一条长度不短于 50cm 的直线段,其线性度偏差不大于±
2.5cm,并且具有较好的重复性;
(2) 从静止开始,15s 内完成幅度可控的摆动,画出长度在 30~60cm 间可设置,长度偏差不大于±2.5cm 的直线段,并且具有较好的重复性;
(3) 可设定摆动方向,风力摆从静止开始,15s 内按照设置的方向(角度)
摆动,画出不短于 20cm 的直线段;
(4) 将风力摆拉起一定角度(30°~45°)放开,5s 内使风力摆制动达到静止状态。
(5) 以风力摆静止时激光笔的光点为圆心,驱动风力摆用激光笔在地面画圆,30s 内需重复 3 次;圆半径可在 15~35cm 范围内设置,激光笔画出的轨迹应落在指定半径±2.5cm 的圆环内;
(6) 在发挥部分(1)后继续作圆周运动,在距离风力摆 1~2m 距离内用一台 50~60W 台扇在水平方向吹向风力摆,台扇吹 5s 后停止,风力摆能
够在 5s 内恢复要求(5)规定的圆周运动,激光笔画出符合要求的轨迹;
六、存在的问题及今后努力方向

这个风力摆控制系统在画圆的时候画出来的圆不是太完美,即使理论值我都算出来了并且按照理论值设定各参数但是理论和实际之间总有差距,引起这一现象可能的因素有万向节阻力、激光束是否和摆杆在一条直线上、MPU6050的安放位置等。我尝试着改变两个简谐运动曲线的幅值和相位差,如果这几个因素改变的程度过低风力摆表现得不太明显,如果过高风力摆画出来的就是一个椭圆,很难找到一个非常非常完美的参数。今后我会更加刻苦的学习PID算法、信号的分析和处理等知识,致知于行,学以致用,让理论能很好的应用到实践中。

单片机源程序如下:
  1. #include "sys.h"

  2. int Position_Pwm,Moto_qb1,Moto_qb2,Count_Moto;
  3. double Count_qb;


  4. int myabs(int a)
  5. {                    
  6.           int temp;
  7.                 if(a<0)  temp=-a;  
  8.           else temp=a;
  9.           return temp;
  10. }

  11. int Position_PID1 (float Angle,float Target)
  12. {         
  13.          Last_Bias1=Bias1;                                        //保存上一次偏差
  14.          Bias1=Target-Angle;                                   //计算偏差
  15.          Integral_bias1+=Bias1;                                          //求出偏差的积分
  16.    Pwm1=-KP1*Bias1+KI1*Integral_bias1-KD1*(Bias1-Last_Bias1)*10;   //位置式PID控制器
  17.          return Pwm1;                                            //增量输出        
  18. }

  19. int Position_PID2 (float Angle,float Target)
  20. {         
  21.          Last_Bias2=Bias2;                                                                                                                                                         //保存上一次偏差
  22.          Bias2=Target-Angle;                                   //计算偏差
  23.          Integral_bias2+=Bias2;                                          //求出偏差的积分
  24.    Pwm2=-KP2*Bias2+KI2*Integral_bias2-KD2*(Bias2-Last_Bias2)*10;   //位置式PID控制器                                       
  25.          return Pwm2;                                            //增量输出        
  26. }

  27. void Set_Pwm1(int moto)
  28. {
  29.             if(moto<0)                        AIN2=1,                        AIN1=0;        
  30.                         else                   AIN2=0,                        AIN1=1;
  31.             TIM_SetCompare4(TIM3,myabs(moto));
  32. }
  33. void Set_Pwm2(int moto)
  34. {
  35.             if(moto<0)                        BIN2=1,                        BIN1=0;
  36.                         else                   BIN2=0,                        BIN1=1;  
  37.                         TIM_SetCompare2(TIM2,myabs(moto));
  38. }
  39. void balance(void)
  40. {
  41.         float balance1,balance2;
  42.         balance1=Position_PID1(500,500);
  43.         balance2=Position_PID2(500,500);
  44.         Set_Pwm1(balance1);Set_Pwm2(balance2);
  45. }
  46. void control(void)
  47. {
  48.         static float Count_Big_Angle=0.019635;
  49.                                           Count_qb+=Count_Big_Angle;   //自变量
  50.         
  51.                                                 Target_Position1=A*sin(Count_qb+X)+495-m;  //运动公式        
  52.                                                 Target_Position2=B*sin(Count_qb+Y)+500-n;  //运动公式
  53.         
  54.                                                  Moto_qb1=Position_PID1((Roll-42.4)*10,Target_Position1);  //位置闭环控制
  55.                                                 Moto_qb2=Position_PID2((Pitch+50)*10,Target_Position2);  //位置闭环控制
  56.                                                 Set_Pwm1(Moto_qb1);Set_Pwm2(Moto_qb2); //赋值给PWM寄存器

  57. }
复制代码
  1. #include "sys.h"

  2. float Pitch,Roll,Yaw;
  3. float KP1=0,KD1=0,KI1=0,KP2=0,KD2=0,KI2=0;
  4. float Menu=1,A=0,B=0,X=0,Y=0,m=0,n=0;
  5. int EN=0;
  6. float Target_Position1=500,Target_Position2=500,Last_Bias1,Bias1,Pwm1,Integral_bias1,Last_Bias2,Bias2,Pwm2,Integral_bias2;
  7. int main(void)
  8. {        
  9.         delay_init();
  10.         IIC_Init();        
  11.         JTAG_Set(SWD_ENABLE);
  12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  13.         uart_init(9600);         //串口初始化为9600
  14.         DMP_Init();
  15.         KEY_Init();
  16.         TIM4_Int_Init(49,7199);//10Khz的计数频率,计数到30为3ms
  17.         TIM3_PWM_Init(1499,0);         //不分频。PWM频率=72000000/900=80Khz
  18.         TIM2_PWM_Init(1499,0);         //不分频。PWM频率=72000000/900=80Khz
  19.         OLED_Init();
  20.         LED_Init();
  21.         EXTIX_Init();
  22.         
  23.         while(1)
  24.         {        
  25.         DataScope();
  26.         oled_show();
  27.         }
  28.         
  29. }
复制代码

所有资料51hei提供下载:
15年电赛控制类——风力摆.7z (2.84 MB, 下载次数: 429)

评分

参与人数 2黑币 +55 收起 理由
1339337425 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:463405 发表于 2019-7-21 15:12 | 显示全部楼层
拿走了,表示非常感谢
回复

使用道具 举报

ID:435708 发表于 2019-7-21 17:08 | 显示全部楼层
好资料
回复

使用道具 举报

ID:570384 发表于 2019-7-22 10:49 | 显示全部楼层
给力
回复

使用道具 举报

ID:445996 发表于 2019-7-22 10:57 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:589206 发表于 2019-7-23 20:12 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:555142 发表于 2019-7-25 18:33 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:411729 发表于 2019-7-27 15:35 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:428195 发表于 2019-7-27 21:34 | 显示全部楼层
谢谢,挺好的看起来
回复

使用道具 举报

ID:590486 发表于 2019-7-29 14:56 | 显示全部楼层
今年准备做电设 ,作为参考不错
回复

使用道具 举报

ID:590486 发表于 2019-7-29 14:56 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:32305 发表于 2019-7-30 21:12 | 显示全部楼层
程序下载后解压不了。解压有错误!
回复

使用道具 举报

ID:592923 发表于 2019-7-31 10:26 | 显示全部楼层
这个是51的板写的吗?
回复

使用道具 举报

ID:313027 发表于 2019-7-31 21:12 | 显示全部楼层
1951075938 发表于 2019-7-31 10:26
这个是51的板写的吗?

stm32f1
回复

使用道具 举报

ID:593598 发表于 2019-8-2 09:22 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:593792 发表于 2019-8-2 16:30 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:300443 发表于 2019-8-5 12:03 | 显示全部楼层
你的OLED多大的喔
回复

使用道具 举报

ID:313027 发表于 2019-8-6 14:27 | 显示全部楼层

0.96 六线SPI
回复

使用道具 举报

ID:382816 发表于 2019-9-5 16:12 | 显示全部楼层
楼主当年是东北赛区的吗,同款架子
回复

使用道具 举报

ID:698986 发表于 2020-4-3 19:01 | 显示全部楼层
想问一下 波形上位机用的是什么呀
回复

使用道具 举报

ID:89217 发表于 2020-4-7 23:57 | 显示全部楼层
太给力了  楼主威武
回复

使用道具 举报

ID:643165 发表于 2020-4-30 09:28 | 显示全部楼层


pb什么意思
回复

使用道具 举报

ID:770154 发表于 2020-6-9 21:02 | 显示全部楼层

感谢分享
回复

使用道具 举报

ID:555142 发表于 2020-6-27 21:44 | 显示全部楼层
靠着楼主的代码,19年电赛拿了区二,哈哈哈
回复

使用道具 举报

ID:899778 发表于 2021-7-12 00:35 | 显示全部楼层
拿走了,表示非常感谢
回复

使用道具 举报

ID:955477 发表于 2021-7-28 09:45 | 显示全部楼层
没看明白,k1、k2、k3按键的作用是什么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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