找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

风力摆控制系统赛题解析与操作说明及STM32源码(重要的是PID算法)

查看数: 9808 | 评论数: 16 | 收藏 8
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-8-8 16:30

正文摘要:

电子竞赛题目《风力摆控制系统》 本人的课程设计; 重要的是PID算法。

回复

ID:328014 发表于 2021-3-14 15:21
可乐我要柠檬味 发表于 2021-3-14 14:58
为什么压缩包里面的程序没有看到PID部分哇

是这个吗Subject.c
  1. #include "Subject.h"
  2. #include "Data.h"
  3. #include "math.h"
  4. #include "moto_PWM.h"
  5. #include "math.h"
  6. #define H    79.0                  //万向节距离地面的高度
  7. float R=25.0;           //摆动弧度的大小半径
  8. #define T    1410.0   //摆动的周期
  9. float angle = 45.0;

  10. extern Data  PID_data;
  11. extern Data  PID_data1;
  12. uint8_t RoundDir=1;
  13. //const float Phase;
  14. void Subject_1(void)
  15. {
  16.         float A=0.0;
  17.         static uint32_t MoveTimeCnt = 0;
  18.         float set_y = 0.0;
  19.         float Normalization = 0.0;
  20.         float Omega = 0.0;
  21.         MoveTimeCnt+=5;
  22.         Normalization=(float)MoveTimeCnt/T;
  23.         Omega=2*3.1415926*Normalization;      //求一个角度 随时间变化的 每5毫秒加2*PI*5/T度   来求相位
  24.        
  25.         A=atan((R/79.0f))*57.2958f;                                                //最大角度 摆的最大高度
  26.        
  27.         set_y=A*sin(Omega);                        //轨迹函数
  28.        
  29.         PID_data.setPoint=0;
  30.         PID_data.P=170;
  31.         PID_data.I=5.8;
  32.         PID_data.D=500;
  33.        
  34.        
  35.         PID_data1.setPoint=set_y;
  36.         PID_data1.P=150;
  37.         PID_data1.I=6.8;
  38.         PID_data1.D=500;
  39.        
  40.         PID_data.PWM=PID_Calc1();
  41.         PID_data1.PWM=PID_Calc2();
  42.        
  43.         if(PID_data.PWM>1500)
  44.                 PID_data.PWM=1500;
  45.         /*else if(PID_data.PWM>0&&PID_data.PWM<450)
  46.                 PID_data.PWM=450;*/
  47.         if(PID_data.PWM<-1500)
  48.                 PID_data.PWM=-1500;
  49.                 /*else if(PID_data.PWM<0&&PID_data.PWM>-450)
  50.                 PID_data.PWM=-450;*/
  51.                
  52.         if(PID_data1.PWM>1500)
  53.                 PID_data1.PWM=1500;
  54.         if(PID_data1.PWM<-1500)
  55.                 PID_data1.PWM=-1500;
  56.        
  57.         moto_PWM(PID_data.PWM,PID_data1.PWM);
  58.        
  59. }



  60. void Subject_2(void)
  61. {
  62.         float A=0.0;
  63.         static uint32_t MoveTimeCnt = 0;
  64.         float set_x = 0.0;
  65.         float Normalization = 0.0;
  66.         float Omega = 0.0;
  67.         MoveTimeCnt+=5;
  68.         Normalization=(float)MoveTimeCnt/T;
  69.         Omega=2*3.1415926*Normalization;
  70.         A=atan((R/79.0f))*57.2958f;
  71.         set_x=A*sin(Omega);
  72.        
  73.         PID_data.setPoint=set_x;
  74.         PID_data.P=191;
  75.         PID_data.I=5.9;
  76.         PID_data.D=420;
  77.        
  78.        
  79.         PID_data1.setPoint=0;
  80.         PID_data1.P=100;
  81.         PID_data1.I=5.8;
  82.         PID_data1.D=500;
  83.        
  84.         PID_data.PWM=PID_Calc1();
  85.         PID_data1.PWM=PID_Calc2();
  86.        
  87.         if(PID_data.PWM>1500)
  88.                 PID_data.PWM=1500;
  89.         if(PID_data.PWM<-1500)
  90.                 PID_data.PWM=-1500;
  91.        
  92.         if(PID_data1.PWM>1500)
  93.                 PID_data1.PWM=1500;
  94.         if(PID_data1.PWM<-1500)
  95.                 PID_data1.PWM=-1500;
  96.        
  97.         moto_PWM(PID_data.PWM,PID_data1.PWM);
  98.        
  99. }


  100. void Subject_3(void)
  101. {
  102.         //const float priod = 1410.0;  //单摆周期(毫秒)
  103.                      //相位补偿 0, 10   20   30   40   50   60   70   80   90   100  110  120  130  140  150  160  170 180
  104.         const float Phase[19]= {0,-0.1,-0.05,0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,0.05,0.05,0.05,0.07,0};
  105.         static uint32_t MoveTimeCnt = 0;
  106.         float set_x = 0.0;
  107.         float set_y = 0.0;
  108.         float Ax = 0.0;
  109.         float Ay = 0.0;
  110.         float A = 0.0;
  111.         uint32_t pOffset = 0;
  112.         float Normalization = 0.0;
  113.         float Omega = 0.0;
  114.        
  115.         pOffset = (uint32_t)(angle/10.0f);                         //相位补偿数组下标
  116.         MoveTimeCnt += 5;                                                         //每5ms运算1次
  117.         Normalization = (float)MoveTimeCnt/T;         //对单摆周期归一化
  118.         Omega = 2.0*3.14159*Normalization;                         //对2π进行归一化处理
  119.         A = atan((R/79.0f))*57.2958f;//根据摆幅求出角度A,88为摆杆离地高度                                                                  
  120.         Ax = A*cos(angle*0.017453);         //计算出X方向摆幅分量0.017453为弧度转换
  121.         Ay = A*sin(angle*0.017453);         //计算出Y方向摆幅分量
  122.         set_x = Ax*sin(Omega);                  //计算出X方向当前摆角
  123.         set_y = Ay*sin(Omega+Phase[pOffset]); //计算出Y方向当前摆角
  124.                
  125.         PID_data.setPoint=set_y;
  126.         PID_data.P=180;
  127.         PID_data.I=6.5;
  128.         PID_data.D=500;
  129.        
  130.        
  131.         PID_data1.setPoint=set_x;
  132.         PID_data1.P=110;
  133.         PID_data1.I=5.9;
  134.         PID_data1.D=500;         
  135.        
  136.         PID_data.PWM=PID_Calc1();
  137.         PID_data1.PWM=PID_Calc2();
  138.        
  139.         if(PID_data.PWM>1700)
  140.                 PID_data.PWM=1700;

  141.         if(PID_data.PWM<-1700)
  142.                 PID_data.PWM=-1700;

  143.        
  144.         if(PID_data1.PWM>1700)
  145.                 PID_data1.PWM=1700;

  146.         if(PID_data1.PWM<-1700)
  147.                 PID_data1.PWM=-1700;

  148.         moto_PWM(PID_data.PWM,PID_data1.PWM);
  149. }
复制代码
ID:871474 发表于 2021-3-14 14:58
为什么压缩包里面的程序没有看到PID部分哇
ID:719608 发表于 2020-9-20 17:54
加油,不错!
ID:594722 发表于 2019-8-3 18:03
厉害了楼主
ID:444495 发表于 2019-8-3 17:14
感谢分享
ID:586030 发表于 2019-8-2 11:07
资料是好资料,但是希望你能够标明你是转载的,我正好刚看过原作者的帖子
ID:484435 发表于 2019-8-1 09:37
谢谢楼主分享
ID:484435 发表于 2019-8-1 09:25
谢谢楼主分享
ID:591400 发表于 2019-7-31 14:57
MPU6050有姿态融合吗?数据漂移情况如何?
ID:496604 发表于 2019-7-28 22:39
膜拜大佬
ID:567506 发表于 2019-7-26 10:57
膜拜大佬
ID:380985 发表于 2019-7-25 23:24
好资料,正好学习
ID:328014 发表于 2019-7-10 21:43
lxh666 发表于 2019-7-10 20:08
压缩包解压不了,显示压缩包损坏或文件格式未知。
这是怎么回事?

貌似我用winrar可以解压
ID:581864 发表于 2019-7-10 20:08
压缩包解压不了,显示压缩包损坏或文件格式未知。
这是怎么回事?
ID:250245 发表于 2018-8-11 20:52
谢谢楼主
ID:1 发表于 2018-8-9 01:56
好资料,51黑有你更精彩!!!

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

Powered by 单片机教程网

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