找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4139|回复: 1
打印 上一主题 下一主题
收起左侧

STM32平衡小车的代码 PID参数的调节和陀螺仪原始数据的处理

[复制链接]
跳转到指定楼层
楼主
ID:855478 发表于 2020-12-29 12:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主要是PID参数的调节和陀螺仪原始数据的处理
远离DMP这种速度慢消耗大的方法,希望有点帮助

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"
  7. #include "mpu6050.h"   
  8. #include "inv_mpu.h"
  9. #include "inv_mpu_dmp_motion_driver.h"
  10. #include "oled.h"
  11. #include "pwm.h"
  12. #include "function.h"
  13. #include "fuzzy.h"
  14. #include "time.h"
  15. #include "FTM.h"
  16. #include "rtu.h"

  17. char receive;
  18. float result;
  19. angle ress;
  20. p_angle res;
  21. speed_s spe_L;
  22. speed_ss speed_L;
  23. speed_s spe_R;
  24. speed_ss speed_R;
  25. out_b outt;
  26. out_c out;
  27. int ab;
  28. float roll;
  29. int ti=9;
  30. float ta;
  31. int ti_r;
  32. int ti_l;
  33. float CN_timer2;
  34. float CN_timer3;
  35. int time;
  36. int32_t rtu_send[6];
  37. int main(void)
  38. {       
  39.         float mm=0;
  40.         int P=64;
  41.         float I=0;
  42.         float D=0.005;
  43.         float i;
  44.         float d;
  45.         float e;
  46.         int integer,point;
  47.         float pitch,yaw;                 //欧拉角
  48.         short aacx,aacy,aacz;                  //加速度传感器原始数据
  49.         short gyrox,gyroy,gyroz;        //陀螺仪原始数据
  50.         short temp;                                              //温度       
  51.         int m;
  52.   out=&outt;
  53.   res=&ress;
  54.         speed_L=&spe_L;
  55.         speed_R=&spe_R;
  56.         speed_L->speed_last=0;
  57.         speed_R->speed_last=0;
  58.         ta=0;
  59.         ti=80;
  60.         res->angle_sum=0;
  61.         res->angle_error=0;
  62.         res->angle_last=0;
  63.   res->angle_now=0;
  64.         m=0;
  65.   delay_init();        //延时初始化
  66.         OLED_Init();       
  67.         pwm_init();
  68.         time1_init();
  69.         uart_init(115200);
  70.         Hardware_init();
  71.         ti=0;
  72.        
  73.   ab=1000;
  74.   OLED_ShowString(40,2 ,"Stop");
  75.         while(1)
  76.         {
  77. //                if(ti<0)  
  78. //                          ti=0;
  79. //          
  80. //                if(ab>100)
  81. //                        ab=100;
  82. //                  ti=ab;
  83. //       
  84.                 if(ti<0)  ti=0;
  85.                 if(ti>100)  ti=100;
  86.                 if(ab<0)   ab=0;
  87.                 if(ab>0)   ab=100;
  88.                
  89.                         OLED_ShowString(0,0 ,"Direction:");
  90.                 OLED_ShowString(0,4 ,"Speed:");
  91.                 OLED_ShowNum(40,6,100-ti,3,24);
  92.                 OLED_ShowString(96,6 ,"%");
  93.                 //  OLED_ShowNum(0,2,ta,3,32);
  94.    switch (receive)
  95.                         {
  96.                                 case 'A':
  97.                                             ti+=5;
  98.                                       receive='p';
  99.                                          break;
  100.                            case 'B':
  101.                                             ti-=5;
  102.                                       receive='p';
  103.                                       break;
  104.                                 case 'C':
  105.                                             forward();
  106.                                       OLED_Clear();
  107.                                             OLED_ShowString(40,2 ,"Forward");
  108.                                       receive='p';
  109.                                       break;
  110.                                         case 'D':
  111.                                             back();
  112.                                       OLED_Clear();
  113.                                             OLED_ShowString(40,2 ,"Back");
  114.                                       receive='p';
  115.                                       break;
  116.                                         case 'E' :
  117.                                                   stop();
  118.                                             ti=0;;
  119.                                             OLED_Clear();
  120.                                             OLED_ShowString(40,2 ,"Stop");
  121.                                             receive='p';
  122.                                       break;
  123.                                   case 'F' :
  124.                                                   left();
  125.                                             OLED_Clear();
  126.                                             OLED_ShowString(40,2 ,"Turn_left");
  127.                                             receive='p';
  128.                                       break;
  129.                                         case 'G' :
  130.                                                   right();
  131.                                             OLED_Clear();
  132.                                             OLED_ShowString(40,2 ,"Turn_right");
  133.                                             receive='p';
  134.                                       break;
  135.                                                 case 'H' :
  136.                                                   up();
  137.                                                 ti=50;
  138.                                             OLED_Clear();
  139.                                             OLED_ShowString(40,2 ,"up");
  140.                                             receive='p';
  141.                                       break;
  142.                                                 case 'I' :
  143.                                                   down();
  144.                                                 ti=50;
  145.                                             OLED_Clear();
  146.                                             OLED_ShowString(40,2 ,"down");
  147.                                             receive='p';
  148.                                       break;
  149.                                                 case 'J' :
  150.                                                   ab-=5;
  151.                                             OLED_Clear();
  152.                                             receive='p';
  153.                                       break;
  154.                                                 case 'K' :
  155.                                                   ab+=5;
  156.                                             OLED_Clear();
  157.                                             receive='p';
  158.                                       break;
  159.                                        
  160.                         }
  161.         }
  162.         Hardware_init();       
  163.         uart_init(115200);
  164.         //time4_init();
  165.         usart_init_();
  166.         time1_init();
  167.         Encoder_Init_TIM2();
  168.         Encoder_Init_TIM3();
  169.         while(mpu_dmp_init())
  170.         {
  171.         OLED_ShowString(0,2 ,"MPU6050 initting");
  172.         }
  173.   OLED_Clear();
  174.         res->angle_P=81;
  175.         res->angle_I=0.001;
  176.         res->angle_sum=0;
  177.         res->angle_D=18;
  178.         mm=0;
  179.         OLED_ShowString(0,2 ,"roll:");
  180.         OLED_ShowString(2,0 ,"L:");
  181.         OLED_ShowString(60,0 ,"R:");         
  182.         OLED_ShowString(100,2 ,".");
  183.         OLED_ShowString(0,6 ,"P:");
  184.         OLED_ShowString(46,6,"I:");       
  185.         OLED_ShowString(90,6 ,"D:");
  186.                          while(1)
  187.         {
  188.                   switch (receive)
  189.                         {
  190.                                 case 'T':
  191.                                             ta=ta+1;
  192.                                       receive='p';
  193.                                          break;
  194.                                 case 'J':
  195.                                               ta-=1;
  196.                                       receive='p';
  197.                                          break;   
  198.         case 'A':
  199.               res->angle_P+=1;
  200.                receive='p';       
  201.                break;
  202.                                 case 'C':
  203.               res->angle_P-=1        ;
  204.                receive='p';
  205.                break;
  206.          case 'D':
  207.               res->angle_D+=1;
  208.                receive='p';       
  209.                break;
  210.                                 case 'E':
  211.                res->angle_D-=1;
  212.                receive='p';
  213.                break;                       
  214.                                  case 'F' :
  215.                          res->angle_I+=0.001;
  216.                                        receive = 'p';
  217.                            break;
  218.                     case 'B':
  219.                     back();
  220.                                      res->angle_I-=0.001;
  221.                            break;
  222.                      case 'S':
  223.                                              stop();
  224.                                               receive = 'p';
  225.                            break;         
  226.                                 case 'M':
  227.                      ti+=1;
  228.                                        receive = 'p';
  229.                            break;
  230.                      case 'N':
  231.                                               receive = 'p';
  232.                            ti-=1;
  233.                            break;       
  234.                                
  235.                         }
  236.            if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  237.                  {       
  238.                         MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度传感器数据
  239.                         MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺仪数据         
  240.                   temp=roll*10;         
  241.                 if(temp<0)
  242.                                   {
  243.                                      OLED_ShowString(50,2 ,"-");
  244.                                                  temp=-temp;
  245.                                   } else               
  246.                                           OLED_ShowString(50,2 ,"+");
  247.         integer = temp/10;
  248.         point   = temp%10;       
  249.                 time=(2000-(res->angle_P*mm+res->angle_I*res->angle_sum-res->angle_D*res->angle_error));
  250.         if(time<1)
  251.                                  {
  252.                                                 time=1;
  253.                                  }                                                 
  254.                 if(res->angle_now<0)
  255.                 {
  256.              forward();
  257.                          mm=-res->angle_now;
  258.                  }
  259.                  else
  260.                  {       
  261.                            back();
  262.                            mm=res->angle_now;
  263.                  }
  264.                  OLED_ShowNum(60,2,integer,3,18);
  265.                           OLED_ShowNum(108,2,point,1,8);       
  266.                     OLED_ShowNum(12,6,(res->angle_P),3,18);
  267.                     OLED_ShowNum(60,6,(res->angle_I)*1000,3,18);
  268.         OLED_ShowNum(102,6,res->angle_D,3,18);
  269.                           OLED_ShowNum(0,4,mm,3,18);               
  270.                 if(res->angle_error<0.5)
  271.                 {
  272.                       OLED_ShowString(68,4 ,"-");
  273.                       OLED_ShowNum(76,4,-res->angle_error,4,20);       
  274.                 }
  275.                         else
  276.                         {
  277.                             OLED_ShowString(68,4 ,"+");
  278.                             OLED_ShowNum(76,4,res->angle_error,4,20);
  279.                         }                               
  280. //                    OLED_ShowNum(20,0,(int)((s16)(TIM2->CNT)),3,16);         
  281. //                    OLED_ShowNum(80,0,(int)((s16)(TIM3->CNT)),3,16);          //显示左右轮位置
  282.                         rtu_send[0]=res->angle_now*100;
  283.                         rtu_send[1]=2000-time;
  284.                         rtu_send_data(rtu_send,2);
  285.                   rtu_send_data(rtu_send,2);                    //上位机发送
  286.                         OLED_ShowNum(20,0,time,4,20);                    //显示左右论速度
  287.                   OLED_ShowNum(80,0,time,4,20);
  288.                         while(1)
  289.                         {
  290.             GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  291.                                         delay_ms(1000);                        //显示左右论速度
  292.                         GPIO_SetBits(GPIOC,GPIO_Pin_13);
  293.                         delay_ms(1000);
  294.                         }
  295.                  }
  296.         }

  297. }
复制代码

所有资料51hei提供下载:
两轮平衡车.7z (257.04 KB, 下载次数: 56)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:405802 发表于 2024-7-30 14:07 | 只看该作者
请问,为什么主函数里有2个while(1)呢? switch (receive),receive变量没给初值,怎么进的case语句呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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