找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己写的stm32小四轴程序 用mpu6050 dmp直接输出姿态角 裸机代码

[复制链接]
跳转到指定楼层
楼主
  自己写的小四轴程序stm32f103c8t6,采用mpu6050中的dmp直接输出姿态角可不用了解四元数,通行模块为蓝牙模块,程序是裸机代码没有太多变量可以容易看懂,如果有这方面的爱好可以一起探讨qq1244450581,PID算法只用了串级PD(这个PID是由模电稳压的过程得到灵感)不过有引进PID死区,分为俩个PID调节

自己试了感觉挺稳,由于不能发太大文件遥控程序就不发了。




部分源程序预览:
  1. /*******************************************************************************
  2.                    gggi
  3.                                                                          四轴飞控程序
  4.                                                                          由mpu_dmp_get_data(&pitch,&roll,&yaw)这个函数引出欧拉角
  5.                                                                          由RCDataProcess(&exthrottle,&exroll,&expitch,&exyaw);这个引出期望角与油门
  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;//用于 判断是否进入加速剂调节模式
  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;                //加速度传感器原始数据
  27. //传送数据给匿名四轴上位机软件(V2.6版本)
  28. //fun:功能字. 0XA0~0XAF
  29. //data:数据缓存区,最多28字节!!
  30. //len:data区有效数据个数
  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字节数据
  36.         send_buf[len+3]=0;        //校验数置零
  37.         send_buf[0]=0X88;        //帧头
  38.         send_buf[1]=fun;        //功能字
  39.         send_buf[2]=len;        //数据长度
  40.         for(i=0;i<len;i++)send_buf[3+i]=data[i];                        //复制数据
  41.         for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];        //计算校验和        
  42.         for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);        //发送数据到串口1
  43. }        
  44. //匿名四轴上位机发送的数据格式
  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;//用于遥控油门数值
  74.         u8 a,b=0,x=0;//用于加速计的累加求平均值
  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里面塞东西,确定三个姿态的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.                 //////////////////////////////////油门保护程序////////////////////////////////
  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调节
  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);        //得到加速度传感器数据

  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. …………余下代码请下载附件…………
复制代码

资料下载:
四轴带遥控.zip (9.82 MB, 下载次数: 46)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:177825 发表于 2017-3-23 17:02 | 只看该作者
自己试了一下程序稳定性很差,怎么调也调不好,不知道为什么。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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