找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5003|回復(fù): 1
收起左側(cè)

自己寫的stm32小四軸程序 用mpu6050 dmp直接輸出姿態(tài)角 裸機(jī)代碼

[復(fù)制鏈接]
ID:177825 發(fā)表于 2017-3-21 20:22 | 顯示全部樓層 |閱讀模式
  自己寫的小四軸程序stm32f103c8t6,采用mpu6050中的dmp直接輸出姿態(tài)角可不用了解四元數(shù),通行模塊為藍(lán)牙模塊,程序是裸機(jī)代碼沒有太多變量可以容易看懂,如果有這方面的愛好可以一起探討qq1244450581,PID算法只用了串級PD(這個(gè)PID是由模電穩(wěn)壓的過程得到靈感)不過有引進(jìn)PID死區(qū),分為倆個(gè)PID調(diào)節(jié)

自己試了感覺挺穩(wěn),由于不能發(fā)太大文件遙控程序就不發(fā)了。

0.png
0.png

部分源程序預(yù)覽:
  1. /*******************************************************************************
  2.                    gggi
  3.                                                                          四軸飛控程序
  4.                                                                          由mpu_dmp_get_data(&pitch,&roll,&yaw)這個(gè)函數(shù)引出歐拉角
  5.                                                                          由RCDataProcess(&exthrottle,&exroll,&expitch,&exyaw);這個(gè)引出期望角與油門
  6.                                                                         
  7. *******************************************************************************/
  8. #include "public.h"
  9. #include "printf.h"
  10. #include "stdio.h"
  11. #include "delay.h"
  12. #include "dmp.h"
  13. #include "inv_mpu.h"
  14. #include "inv_mpu_dmp_motion_driver.h"
  15. #include "bt.h"
  16. #include "pwm.h"
  17. #include "time.h"  //把LED初始化的文件一塊放里面,恩,我沒有偷懶。!
  18. #include "pid.h"
  19.         float old;//用于 判斷是否進(jìn)入加速劑調(diào)節(jié)模式
  20. float exthrottle,roll_ex,pitch_ex,yaw_ex;
  21. u16 power1,power2,power3,power4;
  22. //S_FLOAT_ANGLE Q_ANGLE;
  23. float pitch,roll,yaw;                 //歐拉角
  24. float gyrox,gyroy,gyroz;
  25. float Gyrox,Gyroy,Gyroz;
  26.         float aacx,aacy,aacz;                //加速度傳感器原始數(shù)據(jù)
  27. //傳送數(shù)據(jù)給匿名四軸上位機(jī)軟件(V2.6版本)
  28. //fun:功能字. 0XA0~0XAF
  29. //data:數(shù)據(jù)緩存區(qū),最多28字節(jié)!!
  30. //len:data區(qū)有效數(shù)據(jù)個(gè)數(shù)
  31. void usart1_niming_report(u8 fun,u8*data,u8 len)
  32. {
  33.         u8 send_buf[32];
  34.         u8 i;
  35.         if(len>28)return;        //最多28字節(jié)數(shù)據(jù)
  36.         send_buf[len+3]=0;        //校驗(yàn)數(shù)置零
  37.         send_buf[0]=0X88;        //幀頭
  38.         send_buf[1]=fun;        //功能字
  39.         send_buf[2]=len;        //數(shù)據(jù)長度
  40.         for(i=0;i<len;i++)send_buf[3+i]=data[i];                        //復(fù)制數(shù)據(jù)
  41.         for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];        //計(jì)算校驗(yàn)和        
  42.         for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);        //發(fā)送數(shù)據(jù)到串口1
  43. }        
  44. //匿名四軸上位機(jī)發(fā)送的數(shù)據(jù)格式
  45. void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
  46. {
  47.         u8 tbuf[28];
  48.         u8 i;
  49.         for(i=0;i<28;i++)tbuf[i]=0;//清0
  50.         tbuf[0]=(aacx>>8)&0XFF;
  51.         tbuf[1]=aacx&0XFF;
  52.         tbuf[2]=(aacy>>8)&0XFF;
  53.         tbuf[3]=aacy&0XFF;
  54.         tbuf[4]=(aacz>>8)&0XFF;
  55.         tbuf[5]=aacz&0XFF;
  56.         tbuf[6]=(gyrox>>8)&0XFF;
  57.         tbuf[7]=gyrox&0XFF;
  58.         tbuf[8]=(gyroy>>8)&0XFF;
  59.         tbuf[9]=gyroy&0XFF;
  60.         tbuf[10]=(gyroz>>8)&0XFF;
  61.         tbuf[11]=gyroz&0XFF;        
  62.         tbuf[18]=(roll>>8)&0XFF;
  63.         tbuf[19]=roll&0XFF;
  64.         tbuf[20]=(pitch>>8)&0XFF;
  65.         tbuf[21]=pitch&0XFF;
  66.         tbuf[22]=(yaw>>8)&0XFF;
  67.         tbuf[23]=yaw&0XFF;
  68.         usart1_niming_report(0XAF,tbuf,28);//飛控顯示幀,0XAF
  69. }

  70. int main()
  71. {               

  72.          u8 i;
  73.         float j;//用于遙控油門數(shù)值
  74.         u8 a,b=0,x=0;//用于加速計(jì)的累加求平均值
  75.   u16 flag=0,gyro[3];
  76. float aac1[10],aac2[10];


  77.   SystemInit();
  78.         delay_init(72);
  79.                 LED_Init() ;
  80.          printf_init();
  81.         I2C_GPIO_Config();
  82.                 delay_ms(10);
  83.         PIDvalue();//往PID里面塞東西,確定三個(gè)姿態(tài)的p,i,d值
  84.         MPU_Init();
  85.   mpu_dmp_init();
  86. pwm_init();
  87. TIM2_Init();
  88.         
  89.         
  90.         while(1)
  91.         {

  92.                         mpu_dmp_get_data(&pitch,&roll,&yaw,&gyrox,&gyroy,&gyroz,&aacx,&aacy,&aacz);
  93.                 ////////////////////////////////////加速劑平滑濾波
  94. //                aac1[x]=aacx;
  95. //aac2[x]=aacy;
  96. //                x++;
  97. //                for(i=0;i<10;i++)
  98. //                aacx=(aacx+aac1[i])/2;
  99. //        
  100. //                for(i=0;i<10;i++)
  101. //                aacy=(aacy+aac2[i])/2;
  102. //                                if(x==10)
  103. //                        x=0;
  104.                 /////////////////////////////////////                        
  105.                                 
  106.                                 
  107.                                 
  108.                                 
  109.         if(timer==1)
  110.         {
  111.         timer=0;
  112.                         flag++;

  113.                
  114.       gyrox=gyrox/10;
  115.                          gyroy=gyroy/10;
  116.                          gyroz=gyroz/10;
  117. //     aacx=aacx/40-25;
  118. //      aacy=aacy/40+22.5;
  119. //                aacz=aacz/90-180;

  120. //       RCDataProcess(&exthrottle,&roll_ex,&pitch_ex,&yaw_ex);
  121.         
  122.                
  123.                 /////////////////////////翻滾程序/////////////////////

  124.                
  125.                 /////////////////////////////////////////////////////////////////////////
  126.                

  127.                
  128.                 //////////////////////////////////油門保護(hù)程序////////////////////////////////
  129. //                                        if((old-exthrottle)>400)
  130. //                        {
  131. //                                while(1)
  132. //                                {
  133. //                                        mpu_dmp_get_data(&pitch,&roll,&yaw,&gyrox,&gyroy,&gyroz);
  134. //                                         RCDataProcess(&nouse,&roll_ex,&pitch_ex,&yaw_ex);
  135. //                                exthrottle=old-10;
  136. //                                singlePIDupdate();
  137. //                                pwm_in(power1,power2,power3,power4);        
  138. //                                        if(nouse>300)break;
  139. //                                }
  140. //                        }
  141. //////////////////////////////////////////////////////////////////////////////////////        
  142.                     RCDataProcess(&exthrottle,&roll_ex,&pitch_ex,&yaw_ex);

  143. //                                if(roll_ex==170)
  144. //                {
  145. //                        pwm_in(power1+200,power2-200,power3-200,power4+200);
  146. //                        delay_ms(10);
  147. //                        pwm_in(power1-200,power2+400,power3+400,power4-200);
  148. //                        delay_ms(10);
  149. //                        
  150. //                        power2=power2+400;
  151. //                        if(power2>1000)
  152. //                                power2=1000;
  153. //                                power4=power4-200;
  154. //                        if(power4<0)
  155. //                                power4=0;
  156. //                        
  157. //                                power3=power3+400;
  158. //                        if(power3>1000)
  159. //                                power3=1000;
  160. //                                power1=power1-200;
  161. //                        if(power1<0)
  162. //                                power1=0;
  163. //                        while(1)
  164. //                        {
  165. //                pwm_in(power1,power2,power3,power4);
  166. //                        mpu_dmp_get_data(&pitch,&roll,&yaw,&gyrox,&gyroy,&gyroz,&aacx,&aacy,&aacz);
  167. //                                if(roll_ex>150)
  168. //                                {
  169. //                                        b=1;
  170. //                                delay_ms(500);
  171. //                                }
  172. //                                if((roll>(-40))&&(b==1))
  173. //                                {b=0;
  174. //                                break;
  175. //                                }
  176. //                        }
  177. //                           RCDataProcess(&exthrottle,&roll_ex,&pitch_ex,&yaw_ex);
  178. //                        mpu_dmp_get_data(&pitch,&roll,&yaw,&gyrox,&gyroy,&gyroz,&aacx,&aacy,&aacz);
  179. //                              gyrox=gyrox/10;
  180. //                         gyroy=gyroy/10;
  181. //                         gyroz=gyroz/10;
  182. //     aacx=aacx/40-25;
  183. //      aacy=aacy/40+22.5;
  184. //                aacz=aacz/90-180;
  185. //                }
  186.         //exthrottle=21;

  187.         if(exthrottle>20)
  188.         {
  189.                
  190. //                        Q_ANGLE.Pitch=(int)((pitch)*100)/100.0;
  191. //                        Q_ANGLE.Roll=(int)(roll*100)/100.0;
  192. //                        Q_ANGLE.Yaw=(int)(yaw*100)/100.0;
  193.                                 singlePIDupdate();   //PID調(diào)節(jié)
  194. pwm_in(power1,power2,power3,power4);         //油門輸出
  195.         
  196.                 //pwm_in(power1,0,power3,0);         //油門輸出
  197.         //        pwm_in(0,power2,0,power4);        

  198.         }
  199.         else if(exthrottle<20)
  200.         {
  201. //                Q_ANGLE.Pitch=(int)((pitch)*100)/100.0+1.5;
  202. //                Q_ANGLE.Roll=(int)(roll*100)/100.0+0.3;
  203. //                Q_ANGLE.Yaw=(int)(Q_ANGLE.Yaw*100)/100.0;
  204.                         pwm_in(0,0,0,0);  //油門輸出
  205.                
  206.                
  207.                
  208.         }
  209.         
  210.         
  211.         
  212.         
  213.                 if(flag==500)
  214.                 {
  215.                         led_display1();
  216.                
  217.                 //MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度傳感器數(shù)據(jù)

  218.                         //usart1_report_imu(exthrottle,roll_ex,pitch_ex,gyrox,gyrox,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  219. //           j=exthrottle+1000;
  220. //                i[0]=((int)j>>8)&0XFF;
  221. //                                        i[1]=(int)j&0XFF;
  222. //                                                        

  223. //                                usart1_niming_report(0xAE,i,24);
  224.                
  225.    }
  226.                         if(flag==1000)
  227.                         {
  228.                                 flag=0;
  229.                                 led_display2();
  230.                                  old=exthrottle;
  231.                                 
  232.                         }


  233.         if(pitch>75||pitch<-75||roll<-75||roll>75)
  234.         {
  235.                 pwm_in(0,0,0,0);
  236.                 while(1);
  237.         }
  238. //}
  239. //                        if(flag==30)
  240. //                {
  241. //                        //led_display1();
  242. //               
  243. //                flag=0;

  244. //                        usart1_report_imu(exthrottle,roll_ex,pitch_ex,gyrox,gyrox,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  245. ////           j=exthrottle+1000;
  246. ////                i[0]=((int)j>>8)&0XFF;
  247. ////                                        i[1]=(int)j&0XFF;
  248. ////                                                        

  249. ////                                usart1_niming_report(0xAE,i,24);
  250. //               
  251.    }
  252.                

  253. …………余下代碼請下載附件…………
復(fù)制代碼

資料下載:
四軸帶遙控.zip (9.82 MB, 下載次數(shù): 46)
回復(fù)

使用道具 舉報(bào)

ID:177825 發(fā)表于 2017-3-23 17:02 | 顯示全部樓層
自己試了一下程序穩(wěn)定性很差,怎么調(diào)也調(diào)不好,不知道為什么。。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表