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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3065|回復: 1
打印 上一主題 下一主題
收起左側

STM32F411+MPU6050控制平衡小車,在獲取姿態(tài)時,如果不加IF判斷,程序就會卡死在DMP...

[復制鏈接]
跳轉到指定樓層
樓主
ID:462642 發(fā)表于 2021-5-28 22:38 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 hgfhgfddd 于 2021-6-4 19:43 編輯

本人使用的是HAL庫來編程,在移植MPU6050的DMP庫時,遇到了一個問題,希望有大佬指導一下。

在獲取姿態(tài)時,如果不加IF判斷,程序就會卡死在DMP庫中的某個地方。
注意,不要打開文件中的STM32CUBEMX工程,那個是錯的,不能用。!
程序部分代碼如下
  1. #include "control.h"
  2. #include "inv_mpu.h"
  3. #include "inv_mpu_dmp_motion_driver.h"
  4. #include "mpu6050.h"
  5. #include "main.h"
  6. #include "stdio.h"
  7. #include "motor.h"
  8. #include "protocol.h"

  9. #define PID_ASSISTANT_EN    1   // 1:使用PID調試助手顯示波形,0:使用串口直接打印數(shù)據(jù)
  10. #define N 5
  11. #define turnzhi 1.5
  12.         
  13.         //float Turn_Kp = 3;
  14.         
  15.         float
  16.                 Turn_Kd=turnzhi,//轉向環(huán)KP、KD
  17.                 Turn_Kp=30;

  18.         #define SPEED_Y 600 //俯仰(前后)最大設定速度
  19.         #define SPEED_Z 80//偏航(左右)最大設定速度
  20.         
  21.         
  22.         int Vertical_out,Velocity_out = 0,Turn_out = 0;//直立環(huán)&速度環(huán)&轉向環(huán) 的輸出變量
  23.         
  24.         int i,j;
  25.                 int b = 5;
  26.         short Accel[3];
  27.         short Gyro[3];
  28.         float Temp;
  29.         
  30.         
  31.         char value_buff[N];
  32.         char k = 0;
  33.         
  34.         
  35. //        short filter()
  36. //        {
  37. //                int count;
  38. //                int sum = 0;
  39. //                value_buff[k++] = gyroz;
  40. //               
  41. //                if(k == N)
  42. //                        k = 0;
  43. //                for(count = 0;count < N;count ++)
  44. //                        sum += value_buff[count];
  45. //                return (short)(sum/N);
  46. //        }
  47. //        
  48.         
  49.         int Vertical(float Med,float Angle,float gyro_Y);//函數(shù)聲明
  50.         int Velocity(float Target_Speed,int encoder_left,int encoder_right);
  51.         int Turn(int gyro_Z,int RC);
  52.         

  53.         void angle_even(float pitch);

  54. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  55. {
  56.         unsigned long a = 20;
  57.         int PWM_out;
  58.         if(GPIO_Pin == GPIO_PIN_5)
  59.         {
  60.                 if(mpu_dmp_get_data(&pitch,&roll,&yaw) == 0)
  61.                 {                                       
  62.                         mpu_get_gyro_reg(Accel,&a);
  63.                         MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
  64.                         //Temp = MPU_Get_Temperature();
  65.                 }
  66.                 if(j >= 10)
  67.                 {
  68.                                 j = 0;
  69.                                 Encoder_Left = Read_Speed(3);
  70.                                 Encoder_Right = - Read_Speed(4);                        
  71.                 }
  72.                 j++;
  73.                
  74.         /*前后*/
  75.                 if((Fore==0)&&(Back==0))Target_Speed=0;//未接受到前進后退指令-->速度清零,穩(wěn)在原地
  76.                 if(Fore==1)Target_Speed-=5;//前進1標志位拉高-->需要前進
  77.                 if(Back==1)Target_Speed+=5;//
  78.                 Target_Speed=Target_Speed>SPEED_Y?SPEED_Y:(Target_Speed<-SPEED_Y?(-SPEED_Y):Target_Speed);//限幅
  79.                
  80.                 /*左右*/
  81.                 if((Left==0)&&(Right==0))Turn_Speed=0;
  82.                 if(Left==1)Turn_Speed+=1;        //左轉
  83.                 if(Right==1)Turn_Speed-=1;        //右轉
  84.                 Turn_Speed=Turn_Speed>SPEED_Z?SPEED_Z:(Turn_Speed<-SPEED_Z?(-SPEED_Z):Turn_Speed);//限幅( (20*100) * 100   )
  85.                
  86.                 /*轉向約束*/
  87.                 if((Left==0)&&(Right==0))Turn_Kd=turnzhi;//若無左右轉向指令,則開啟轉向約束
  88.                 else if((Left==1)||(Right==1))Turn_Kd=0;//若左右轉向指令接收到,則去掉轉向約束
  89.                
  90.                 Vertical_out=Vertical(Med_Angle,pitch,gyroy);                                //直立環(huán)
  91.                 Velocity_out=Velocity(Target_Speed,Encoder_Left,Encoder_Right);        //速度環(huán)
  92.                 Turn_out=Turn(gyroz,Turn_Speed);
  93.                 //轉向環(huán)
  94.                 PWM_out=Vertical_out-Vertical_Kp*Velocity_out;//最終輸出
  95.                
  96.                 MOTO1=PWM_out-Turn_out;//左電機
  97.                 MOTO2=PWM_out+Turn_out;//右電機
  98.                 Limit(&MOTO1,&MOTO2);         //PWM限幅
  99.                 angle_even(pitch);               
  100.                 Load(MOTO1,MOTO2);                 //加載到電機上。
  101.                
  102.                
  103.                 i ++;
  104.                 if(i >= 30)
  105.                 {
  106.                
  107.                                 i = 0;
  108.                                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
  109. //                        #if defined(PID_ASSISTANT_EN)
  110. //                                set_computer_value(SEND_PERIOD_CMD, CURVES_CH1, &b, 1);     // 給通道 1 目標值值
  111. //                        #endif
  112. //                        
  113. //                                a= (int)pitch;
  114. //                        #if defined(PID_ASSISTANT_EN)
  115. //                                set_computer_value(SEND_FACT_CMD, CURVES_CH1, &a, 1);     // 給通道 1 發(fā)送實際值
  116. //                        #endif
  117.                         printf("Pitch:%8.2f",pitch);
  118.                         printf(" YAW:%8.2f",yaw);
  119.                         printf(" Gyro:%8d Z:%8d",gyroy,gyroz);
  120.                         printf("     EL:%d, ER:%d",Encoder_Left,Encoder_Right);
  121.                         printf("     PWM:%d\r\n",MOTO1);        
  122.                         //printf("Temp: %2.2f\r\n",Temp);                        
  123.                 }

  124.                
  125.         }
  126. }


  127. /*********************
  128. 直立環(huán)PD控制器:Kp*Ek+Kd*Ek_D

  129. 入口:期望角度、真實角度、真實角速度
  130. 出口:直立環(huán)輸出
  131. *********************/
  132. //int Vertical(float Med,float Angle,float gyro1_Y)
  133. //{
  134. //        int PWM_out;
  135. //        
  136. //        PWM_out=Vertical_Kp*(Angle-Med)+Vertical_Kd*(gyro1_Y-0);
  137. //        return PWM_out;
  138. //}

  139. void angle_even(float pitch)
  140. {
  141.         if(pitch > (40) || pitch < (-40) )
  142.         {
  143.                 MOTO1 = 0;
  144.                 MOTO2 = 0;
  145.                 PB12(H);PB13(H);
  146.                 PB14(H);PB15(H);
  147.         }
  148.                
  149. }

  150. //int PI_Balance(int encoder_left,int encoder_right)
  151. //{
  152. //          static float Velocity,Encoder_Least,Encoder,Movement;
  153. //          static float Encoder_Integral;
  154. //        
  155. //                Movement = 0;
  156. //        
  157. //           //=============速度PI控制器=======================//        
  158. //                Encoder_Least =(Encoder_Left+Encoder_Right)-0;                    //===獲取最新速度偏差==測量速度(左右編碼器之和)-目標速度(此處為零)
  159. //                Encoder *= 0.8;                                                                //===一階低通濾波器      
  160. //                Encoder += Encoder_Least*0.2;                                            //===一階低通濾波器   
  161. //                Encoder_Integral +=Encoder;                                       //===積分出位移 積分時間:10ms
  162. //                Encoder_Integral=Encoder_Integral-Movement;                       //===接收遙控器數(shù)據(jù),控制前進后退
  163. //                if(Encoder_Integral>10000)          Encoder_Integral=10000;             //===積分限幅
  164. //                if(Encoder_Integral<-10000)                Encoder_Integral=-10000;            //===積分限幅        
  165. //                Velocity=Encoder*velocity_KP+Encoder_Integral*velocity_KI;        //===速度控制        
  166. //          if(pitch < -40 || pitch > 40)                         Encoder_Integral=0;                                                     //===電機關閉后清除積分
  167. //          return Velocity;

  168. //}
  169. /*********************
  170. 直立環(huán)PD控制器:Kp*Ek+Kd*Ek_D

  171. Med:機械中值
  172. Angle:真實角度
  173. gyro_Y:真實角度的加速度
  174. *********************/
  175. int Vertical(float Med,float Angle,float gyro_Y)
  176. {
  177.         int PWM_out;
  178.         PWM_out=Vertical_Kp*(Angle - Med)+Vertical_Kd*(gyro_Y-0);//【1】
  179.         return PWM_out;
  180. }



  181. /*********************
  182. 速度環(huán)PI:Kp*Ek+Ki*Ek_S
  183. *********************/
  184. int Velocity(float Target_Speed,int encoder_left,int encoder_right)
  185. {
  186.         static int PWM_out,Encoder_Err,Encoder_S,EnC_Err_Lowout,EnC_Err_Lowout_last;//【2】
  187.         float a=0.7;//【3】
  188.         
  189.         //1.計算速度偏差
  190.         Encoder_Err=(encoder_left+encoder_right)-Target_Speed;//舍去誤差
  191.         //2.對速度偏差進行低通濾波
  192.         //low_out=(1-a)*Ek+a*low_out_last;
  193.         EnC_Err_Lowout=(1-a)*Encoder_Err+a*EnC_Err_Lowout_last;//使得波形更加平滑,濾除高頻干擾,防止速度突變。
  194.         EnC_Err_Lowout_last=EnC_Err_Lowout;//防止速度過大的影響直立環(huán)的正常工作。
  195.         //3.對速度偏差積分,積分出位移
  196.         Encoder_S+=EnC_Err_Lowout;//【4】
  197.         //4.積分限幅
  198.         Encoder_S=Encoder_S>10000?10000:(Encoder_S<(-10000)?(-10000):Encoder_S);
  199.         //5.速度環(huán)控制輸出計算
  200.         PWM_out=Velocity_Kp*EnC_Err_Lowout+Velocity_Ki*Encoder_S;//【5】
  201.         
  202.         if(pitch < (-40) || pitch > (40)) Encoder_S = 0;
  203.         return PWM_out;
  204. }



  205. ///*********************
  206. //轉向環(huán):系數(shù)*Z軸角速度
  207. //*********************/
  208. //int Turn(int gyro_Z)
  209. //{
  210. //        int PWM_out;
  211. //        
  212. //        PWM_out=Turn_Kp*gyro_Z;
  213. //        return PWM_out;
  214. //}

  215. /*********************
  216. 轉向環(huán):系數(shù)*Z軸角速度+系數(shù)*遙控數(shù)據(jù)
  217. *********************/
  218. int Turn(int gyro_Z,int RC)
  219. {
  220.         int PWM_out;
  221.         //這不是一個嚴格的PD控制器,Kd針對的是轉向的約束,但Kp針對的是遙控的轉向。
  222.         PWM_out=Turn_Kd*gyro_Z + Turn_Kp*RC;
  223.         return PWM_out;
  224. }


復制代碼

硬件部分見附件 開發(fā)環(huán)境.docx (4.38 MB, 下載次數(shù): 18)



未命名.gif (6.29 MB, 下載次數(shù): 105)

未命名.gif

F411MPU6050.7z

7.73 MB, 下載次數(shù): 36

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:855730 發(fā)表于 2021-8-19 20:13 | 只看該作者
我也是調用MPU_Get_Gyroscope死機
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天插天天操 | 成人午夜视频在线观看 | 亚洲成人一级片 | 久久久国产一区二区三区 | 亚洲一区二区三区四区五区午夜 | 久久久精品一区二区 | 欧美福利视频 | 日韩精品免费一区二区在线观看 | 成人性视频免费网站 | 天天干夜夜拍 | 九色av | 日韩视频免费看 | 香蕉超碰 | 成人免费网站www网站高清 | 欧美黄色网| 久久精品久久精品久久精品 | 亚洲 欧美 在线 一区 | 天天射天天操天天干 | av网站在线播放 | 欧美成年黄网站色视频 | 精品毛片 | 99视频在线免费观看 | 午夜精品久久久久久久久久久久久 | 一起操网站 | 日本久久久久久久久 | 亚洲三区视频 | 91精品国产91久久久久久吃药 | 九九激情视频 | 男人的天堂亚洲 | 国产精品久久久久久久久久久久久久 | www国产成人免费观看视频,深夜成人网 | 日韩综合网 | 中文字幕二区三区 | 亚洲超碰在线观看 | 高清视频一区二区三区 | 波多野结衣电影一区 | 亚洲精品一区二区三区蜜桃久 | 中文字幕在线三区 | 在线视频成人 | 久久九| 国产成人精品一区二区三区四区 |