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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

四旋翼源碼第7版軟啟動+藍牙源碼(串級PID控制)

[復制鏈接]
跳轉到指定樓層
樓主
這是我們調小四軸的源碼。主要用的串級PID控制。


STM32-DMP移植單片機源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "anbt_dmp_fun.h"
  5. #include "anbt_i2c.h"
  6. #include "anbt_dmp_mpu6050.h"
  7. #include "anbt_dmp_driver.h"
  8. #include "debug.h"
  9. #include "PWM.h"
  10. #define BYTE0(dwTemp)       (*(char *)(&dwTemp))
  11. #define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))
  12. #define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
  13. #define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))

  14. #define q30  1073741824.0f

  15. void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel);
  16. void Send_Data(int16_t *Gyro,int16_t *Accel);


  17. static void DMP_Delay ( __IO uint32_t nCount )
  18. {
  19.   for ( ; nCount != 0; nCount -- );
  20.        
  21. }


  22. int main(void)
  23. {               


  24. int a = 0;
  25.   float error_pitch=0.0;
  26.         static float Pitch_I_out=0.0;
  27.         float  error_pitch_old=0.0;
  28.         static float Pitch_I_shell_out=0.0;
  29.   float error_pitch_shell=0.0;
  30.         float pitch_shell_out=0.0;
  31.         float pitch_out=0.0;
  32.        
  33.   float error_roll=0.0;
  34.         static float roll_I_out=0.0;
  35.         float  error_roll_old=0.0;
  36.         static float roll_I_shell_out=0.0;
  37.   float error_roll_shell=0.0;
  38.         float roll_shell_out=0.0;
  39.         float roll_out=0.0;
  40.        
  41.         static float yaw_I_out=0.0;
  42.         float error_yaw=0.0;
  43.         float error_yaw_old=0.0;
  44.         float yaw_out=0.0;
  45.         int i=1000000;
  46.         float  m1=0,m2=0,m3=0,m4=0,m5=0.0;
  47.         unsigned long sensor_timestamp;
  48.         short gyro[3], accel[3], sensors;//陀螺儀存放數組,加速度存放數組,返回狀態量
  49.         unsigned char more;
  50.         long quat[4];//四元數存放數組
  51.         float Yaw=0.00,Roll,Pitch;//歐拉角
  52.         float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;//計算姿態過程用到的變量

  53.    
  54. ////       
  55.     pitch_SET = 7;
  56.           P_pitch_shell =-25;//-55
  57.           P_pitch = -0.72;        //-1.2
  58.     I_pitch= -0.015;//        -0.032
  59.                 D_pitch=-0.85;//-1.2       
  60.           I_pitch_shell =-0.00012;//-0.0002
  61.                
  62.                
  63.                 roll_SET = 9;
  64.                 P_roll_shell= -25;//-55
  65.                 P_roll = 0.72;//1.2
  66.                 I_roll= 0.015;//0.032
  67.                 D_roll= 0.85;//1.2
  68.                 I_roll_shell = 0.00012;//0.0002
  69.        
  70.         NVIC_Configuration();//設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  71.         uart_init(115200);         //串口初始化為115200
  72.         //引用圓點博士的I2C程序,這里跟我們平常沒有什么區別
  73.   PWM_Init();

  74.        
  75.         ANBT_I2C_Configuration();                //IIC初始化
  76. //        delay_ms(30);
  77.         DMP_Delay (300);//
  78.         AnBT_DMP_MPU6050_Init();                        //6050DMP初始化
  79.        
  80. //TIM2_Int_Init(4999,7199);//10Khz的計數頻率,計數到5000為500ms
  81. DMP_Delay (300);

  82. while(i--)
  83. {
  84.                 TIM_SetCompare3(TIM3,200);
  85.                 TIM_SetCompare4(TIM3,200);
  86.                 TIM_SetCompare3(TIM4,200);
  87.                 TIM_SetCompare4(TIM4,200);       
  88. }
  89. //a = ReceiveOneByte[0];

  90.         while(1)
  91.         {

  92.                 error_pitch_old = error_pitch;
  93.                 error_roll_old = error_roll;
  94.                 error_yaw_old = error_yaw;
  95.                  dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);       

  96.                  if ( sensors & INV_WXYZ_QUAT )
  97.                  {
  98.                          q0=quat[0] / q30;
  99.                          q1=quat[1] / q30;
  100.                          q2=quat[2] / q30;
  101.                          q3=quat[3] / q30;
  102.                          Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
  103.                          Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
  104.                          Yaw =         atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;                //感覺沒有價值,注掉
  105.                          
  106.                          

  107. //                         if(Pitch>15||Pitch<-15||Roll>15||Roll<-15)//stop
  108. //                         {
  109. //                                 TIM_SetCompare3(TIM3,0);
  110. //               TIM_SetCompare4(TIM3,0);
  111. //                TIM_SetCompare3(TIM4,0);
  112. //                TIM_SetCompare4(TIM4,0);
  113. //                                 while(1);
  114. //                         }
  115.                          //////////////////Pitch外環(PI)/////////////       
  116.                         error_pitch_shell = Pitch-pitch_SET;
  117.                         Pitch_I_shell_out+=error_pitch_shell;
  118.                          if(Pitch_I_shell_out>500)
  119.                          {
  120.                                  Pitch_I_shell_out = 500;
  121.                          }
  122.                          if(Pitch_I_shell_out<-500)
  123.                          {
  124.                                  Pitch_I_shell_out = -500;
  125.                          }
  126.                          pitch_shell_out = P_pitch_shell*error_pitch_shell+I_pitch_shell*Pitch_I_shell_out;
  127.                          //------------Pitch內環PID gyro[1]---------------//
  128.                          error_pitch = gyro[1]-pitch_shell_out;
  129.                          Pitch_I_out+=error_pitch;
  130.                          if(Pitch_I_out>500)
  131.                          {
  132.                                  Pitch_I_out = 500;
  133.                          }
  134.                           if(Pitch_I_out<-500)
  135.                          {
  136.                                  Pitch_I_out = -500;
  137.                          }
  138.              pitch_out = P_pitch*error_pitch+I_pitch*Pitch_I_out+D_pitch*(error_pitch-error_pitch_old);
  139.                          m1=pitch_out;
  140.                        
  141.                          
  142.                          //////////////////roll外環(PI)gyro[0]/////////////       
  143.                    error_roll_shell = Roll - roll_SET;
  144.                          roll_I_shell_out+=error_roll_shell;
  145.                          if(roll_I_shell_out>1000)
  146.                          {
  147.                                  roll_I_shell_out = 1000;
  148.                          }
  149.               if(roll_I_shell_out<-1000)
  150.                          {
  151.                                  roll_I_shell_out = -1000;
  152.                          }
  153.                    roll_shell_out = P_roll_shell*error_roll_shell+I_roll_shell*roll_I_shell_out;
  154.                           //////////////////roll內環PID/////////
  155.                          error_roll = gyro[0]-roll_shell_out;
  156.                          roll_I_out+=error_roll;
  157.                          if(roll_I_out>1000)
  158.                          {
  159.                                  roll_I_out = 1000;
  160.                          }
  161.                          if(roll_I_out<-1000)
  162.                          {
  163.                                  roll_I_out = -1000;
  164.                          }
  165.                          roll_out = P_roll*error_roll+I_roll*roll_I_out+D_roll*(error_roll-error_roll_old);
  166.                          m2 = roll_out;
  167.                          ////////////////gyro[2]  PD//////////
  168.                          error_yaw = gyro[2];
  169.                          yaw_out = 1.8*error_yaw+2.5*(error_yaw_old-error_yaw);
  170.                          
  171.                    m3 = yaw_out;
  172.                          /////////////////////yaw///////////
  173. //                                  error_yaw = Yaw;
  174. //                         yaw_I_out+=error_yaw;
  175. //                         if(yaw_I_out>200)
  176. //                         {
  177. //                                 yaw_I_out = 200;
  178. //                         }
  179. //                         if(yaw_I_out<-200)
  180. //                         {
  181. //                                 yaw_I_out = -200;
  182. //                         }
  183. //                        m4 = 0.0000025*error_yaw+0.000000025*yaw_I_out;
  184.                
  185.                
  186.                                     TIM_SetCompare3(TIM3,2500+m1+m2+m3+m4+m5);
  187.                TIM_SetCompare4(TIM3,2500+m1-m2-m3-m4+m5);
  188.                                  
  189.                TIM_SetCompare3(TIM4,2500-m1-m2+m3+m4+m5);
  190.                TIM_SetCompare4(TIM4,2500-m1+m2-m3-m4+m5);                  
  191.                        
  192.       Push(1,(int)pitch_out);
  193.                         Push(2,(int)Pitch);
  194.                          
  195.                         Push(3,(int)gyro[0]);
  196.                   Push(4,(int)gyro[1]);
  197.                   Push(5,(int)gyro[2]);
  198.                                 Push(6,(int)Yaw);
  199.        
  200.                        
  201.                        
  202.                        
  203.        SendDataToScope();       
  204.                        
  205.                  }          
  206.                
  207.         }
  208. }


  209. /*函數功能:根據匿名最新上位機協議寫的顯示姿態的程序
  210. *具體原理看匿名的講解視頻


  211. 發送基本信息(姿態、鎖定狀態)


  212. */

  213. void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel)
  214. {
  215.         unsigned char i=0;
  216.         unsigned char _cnt=0,sum = 0;
  217.         unsigned int _temp;
  218.         u8 data_to_send[50];

  219.         data_to_send[_cnt++]=0xAA;
  220.         data_to_send[_cnt++]=0xAA;
  221.         data_to_send[_cnt++]=0x01;
  222.         data_to_send[_cnt++]=0;
  223.        
  224.         _temp = (int)(Roll*100);
  225.         data_to_send[_cnt++]=BYTE1(_temp);
  226.         data_to_send[_cnt++]=BYTE0(_temp);
  227.         _temp = 0-(int)(Pitch*100);
  228.         data_to_send[_cnt++]=BYTE1(_temp);
  229.         data_to_send[_cnt++]=BYTE0(_temp);
  230.         _temp = (int)(Yaw*100);
  231.         data_to_send[_cnt++]=BYTE1(_temp);
  232.         data_to_send[_cnt++]=BYTE0(_temp);
  233.        
  234.         data_to_send[3] = _cnt-4;
  235.         //和校驗
  236.         for(i=0;i<_cnt;i++)
  237.                 sum+= data_to_send[i];
  238.         data_to_send[_cnt++]=sum;
  239.        
  240.         //串口發送數據
  241.         for(i=0;i<_cnt;i++)
  242.                 AnBT_Uart1_Send_Char(data_to_send[i]);
  243. }




  244. //發送傳感器數據
  245. void Send_Data(int16_t *Gyro,int16_t *Accel)
  246. {
  247.         unsigned char i=0;
  248.         unsigned char _cnt=0,sum = 0;
  249. //        unsigned int _temp;
  250.         u8 data_to_send[50];

  251. ……………………

  252. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


全部資料51hei下載地址:
第7版軟啟動+藍牙.rar (396.1 KB, 下載次數: 58)


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

使用道具 舉報

沙發
ID:405372 發表于 2018-11-30 17:22 | 只看該作者
下載試試看,最近在學
回復

使用道具 舉報

板凳
ID:70035 發表于 2019-8-29 12:57 | 只看該作者
最近在玩軟啟動,了解一下。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美啪啪| 国产香蕉视频 | 免费一区二区三区 | 91久久国产综合久久 | 色综合久久伊人 | 成人免费淫片aa视频免费 | 国产一区二区精品在线 | 国产乱xxav | 国产一区二区三区 | 久久久一区二区三区四区 | 国产区视频在线观看 | 欧美精品在线免费观看 | 日韩性生活网 | 亚洲国产精品一区二区第一页 | 午夜男人天堂 | 超碰精品在线观看 | 91久久国产 | 国偷自产av一区二区三区 | 亚洲一区二区三区免费观看 | 北条麻妃99精品青青久久主播 | 欧洲性生活视频 | 538在线精品 | 亚洲a级| 亚洲精品1 | 日韩无| 亚洲精品一 | 欧美一级欧美三级在线观看 | 欧美天堂在线观看 | 亚洲国产偷 | 成人国产精品久久 | 久久国产精品视频 | 国产精品久久久久久久久久久新郎 | av大片在线观看 | 91精品国产高清一区二区三区 | 7799精品视频天天看 | 一级a爱片性色毛片免费 | 一区二区视频 | 国产日韩欧美精品 | 亚洲福利av | 色婷婷综合久久久中字幕精品久久 | 国产精品国产三级国产aⅴ中文 |