久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4109|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩三级电影一区二区 | 久久久久国产 | 青青久在线视频 | 日韩国产一区二区三区 | 操人网站| 亚洲第一成年免费网站 | 日韩成人在线播放 | 久久三级av | 国产中文视频 | 九九亚洲精品 | 国精产品一品二品国精在线观看 | 精品国产乱码久久久久久丨区2区 | 日本天堂视频 | 国产免费av在线 | 色橹橹欧美在线观看视频高清 | av一区二区三区四区 | 国产一区二区三区四 | 久久精品一 | 欧美二区三区 | 亚洲综合无码一区二区 | 欧美精品一区二区三区蜜臀 | dy天堂| 羞羞网站在线观看 | 欧美一区二区三区精品 | 女人夜夜春 | 亚洲精选一区二区 | 色婷婷精品久久二区二区蜜臂av | 久久精品色欧美aⅴ一区二区 | 欧美在线a| 国产一区二区三区免费 | 狠狠的日 | 国产小视频在线看 | 亚洲视频二区 | 婷婷五月色综合 | 中文字幕成人av | 欧美综合一区二区 | 日韩区| 日韩精品视频在线免费观看 | 成人在线视频免费播放 | 国产精品一区二区精品 | 中文字幕一区二区三区在线观看 |