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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32四軸飛控源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:347767 發(fā)表于 2018-9-25 22:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
編譯,下載,運行,連接飛控串口和FTDI串口,串口波特率500K,上位機打開高級收碼,在上位機飛控狀態(tài)標簽可以看到變化的傳感器數(shù)據(jù),3D顯示可以跟隨roll和pitch的變化而變化,因為沒有寫yaw的上傳,所以yaw保持零度...此時打開飛控波形按鈕,打開波形顯示頁面,并打開相應波形開關,1到3為加速度,4到6為陀螺儀,10和11為roll和pitch,就可以看到變化的波形.

單片機源程序如下:
  1. #include "uart1.h"
  2. #include "app/rc/rc.h"
  3. #include "bsp/MPU6050.h"
  4. #include "bsp/led.h"
  5. #include "app/imu/imu.h"
  6. #include "control.h"
  7. #include "bsp/bsp.h"
  8. #define BYTE0(dwTemp)       (*(char *)(&dwTemp))
  9. #define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))
  10. #define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
  11. #define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))
  12. u8 ARMED = 0;
  13. char flag_send;

  14. RC_GETDATA Rc_Get;//接收到的RC數(shù)據(jù),1000~2000
  15. float RC_Target_ROL=0,RC_Target_PIT=0,RC_Target_YAW=0;
  16. //void RC_FUN(void)
  17. //{
  18. ////判斷解鎖
  19. //        if(ARMED==0 && Rc_Get.THROTTLE < 1100 && Rc_Get.YAW <1100)
  20. //  {ARMED = 1;LED2_ON;}                //解鎖
  21. //        if(ARMED==1 && Rc_Get.THROTTLE <1100 && Rc_Get.YAW >1900)
  22. //        {ARMED = 0;LED2_OFF;}                //鎖定
  23. //}
  24. void BlueToothDeal(u8 buf_num)
  25. {
  26.         if(Rx_Buf[buf_num][1]==0x80)                //藍牙上位機指令
  27.         {               
  28.                 ARMED=1;
  29.                 if(Rx_Buf[buf_num][2]==0x81)flag_send=1;
  30.                 //16位數(shù)據(jù)  低位在前
  31.                                 Rc_Get.THROTTLE = Rx_Buf[buf_num][2]  ;Rc_Get.THROTTLE <<= 8;Rc_Get.THROTTLE += Rx_Buf[buf_num][3];
  32.                                 Rc_Get.YAW      = Rx_Buf[buf_num][4]  ;Rc_Get.YAW      <<= 8;Rc_Get.YAW      += Rx_Buf[buf_num][5];
  33.                                 Rc_Get.ROLL     = Rx_Buf[buf_num][6]  ;Rc_Get.ROLL     <<= 8;Rc_Get.ROLL     += Rx_Buf[buf_num][7];
  34.                                 Rc_Get.PITCH    = Rx_Buf[buf_num][8]  ;Rc_Get.PITCH    <<= 8;Rc_Get.PITCH    += Rx_Buf[buf_num][9];
  35.                                 Rc_Get.AUX1     = Rx_Buf[buf_num][10] ;Rc_Get.AUX1     <<= 8;Rc_Get.AUX1     += Rx_Buf[buf_num][11];
  36.                                 Rc_Get.AUX2     = Rx_Buf[buf_num][12] ;Rc_Get.AUX2     <<= 8;Rc_Get.AUX2     += Rx_Buf[buf_num][13];
  37.                                 Rc_Get.AUX3     = Rx_Buf[buf_num][14] ;Rc_Get.AUX3     <<= 8;Rc_Get.AUX3     += Rx_Buf[buf_num][15];
  38.                                 Rc_Get.AUX4     = Rx_Buf[buf_num][16] ;Rc_Get.AUX4     <<= 8;Rc_Get.AUX4     += Rx_Buf[buf_num][17];
  39.                                 Rc_Get.AUX5     = Rx_Buf[buf_num][18] ;Rc_Get.AUX5     <<= 8;Rc_Get.AUX5     += Rx_Buf[buf_num][19];
  40.                
  41.                         //RC_FUN();
  42.                
  43.                                 RC_Target_ROL = (Rc_Get.ROLL-1500)/30;
  44.                                 RC_Target_PIT = (Rc_Get.PITCH-1500)/30;
  45.                                 RC_Target_YAW = (Rc_Get.YAW-1500)/30;
  46.                                 LED2_ONOFF();
  47.         }
  48.         else if(Rx_Buf[buf_num][1]==0x77)        //加鎖解鎖
  49.         {
  50.                 Rc_Get.THROTTLE = Rx_Buf[buf_num][2]  ;Rc_Get.THROTTLE <<= 8;Rc_Get.THROTTLE += Rx_Buf[buf_num][3];
  51.                 Rc_Get.YAW      = Rx_Buf[buf_num][4]  ;Rc_Get.YAW      <<= 8;Rc_Get.YAW      += Rx_Buf[buf_num][5];
  52.                         //判斷解鎖
  53.                 if(ARMED==0 && Rc_Get.THROTTLE < 1100 && Rc_Get.YAW <1100)
  54.                 {ARMED = 1;LED2_ON;}                //解鎖
  55.                 if(ARMED==1 && Rc_Get.THROTTLE <1100 && Rc_Get.YAW >1900)
  56.                 {ARMED = 0;LED2_OFF;}                //鎖定
  57.         }
  58.         else if(Rx_Buf[buf_num][1]==0x70)        //保存PID數(shù)據(jù)
  59.         {
  60.                         PID_ROL.P = (float)((vs16)(Rx_Buf[buf_num][2]<<8) |Rx_Buf[buf_num][3])/100;
  61.                         PID_ROL.I = (float)((vs16)(Rx_Buf[buf_num][4]<<8) |Rx_Buf[buf_num][5])/100;
  62.                         PID_ROL.D = (float)((vs16)(Rx_Buf[buf_num][6]<<8) |Rx_Buf[buf_num][7]) /10000;
  63.                         PID_PIT.P = (float)((vs16)(Rx_Buf[buf_num][8]<<8) |Rx_Buf[buf_num][9])/100;
  64.                         PID_PIT.I = (float)((vs16)(Rx_Buf[buf_num][10]<<8)|Rx_Buf[buf_num][11])/100;
  65.                         PID_PIT.D = (float)((vs16)(Rx_Buf[buf_num][12]<<8)|Rx_Buf[buf_num][13])/10000;
  66.                         PID_YAW.P = (float)((vs16)(Rx_Buf[buf_num][14]<<8)|Rx_Buf[buf_num][15])/100;
  67.                         PID_YAW.I = (float)((vs16)(Rx_Buf[buf_num][16]<<8)|Rx_Buf[buf_num][17])/100;
  68.                         PID_YAW.D = (float)((vs16)(Rx_Buf[buf_num][18]<<8)|Rx_Buf[buf_num][19])/10000;
  69.                         EE_SAVE_PID();       
  70.                         Uart1_Put_Char(0x71);//幀頭       
  71.                         Uart1_Put_Char(0x88);//幀頭
  72.                
  73.         }
  74.         else if(Rx_Buf[buf_num][1]==0x71)                //發(fā)送PID數(shù)據(jù)給上位機
  75.         {
  76.                 //反饋數(shù)據(jù)
  77.                 EE_READ_PID_Send();
  78.         }
  79. }
  80. void Uart_DataAnl(u8 buf_num)                //串口緩存數(shù)據(jù)分析
  81. {
  82. if(Rx_Buf[buf_num][1]==0x8A)                //串口收到的是上位機的遙控數(shù)據(jù)
  83.         {
  84.                 Uart1_Put_Char(0x30+buf_num);
  85.         }
  86. }
  87. void BlueToothCheckEvent(void)
  88. {
  89.         //0-9位 校驗和
  90.         if(Rx_Ok0)
  91.         {
  92.                 Rx_Ok0 = 0;
  93. //                u8 sum = 0;
  94. //                for(int i=0;i<20;i++)
  95. //                        sum += Rx_Buf[0][i];
  96. //                if(sum == Rx_Buf[0][20])                //和校驗通過
  97. //                {
  98.                         BlueToothDeal(0);
  99. //                }
  100.                
  101.         }
  102.         if(Rx_Ok1)
  103.         {
  104.                 Rx_Ok1 = 0;
  105. //                u8 sum = 0;
  106. //                for(int i=0;i<20;i++)
  107. //                        sum += Rx_Buf[1][i];
  108. //                if(sum == Rx_Buf[1][20])                //和校驗通過
  109. //                {
  110.                         BlueToothDeal(1);
  111. //                }
  112.         }       
  113. }
  114. void Uart_CheckEvent(void)
  115. {
  116.         if(Rx_Ok0)
  117.         {
  118.                 Rx_Ok0 = 0;
  119.                 u8 sum = 0;
  120.                 for(int i=0;i<31;i++)
  121.                         sum += Rx_Buf[0][i];
  122.                 if(sum == Rx_Buf[0][31])                //和校驗通過
  123.                 {
  124.                         Uart_DataAnl(0);
  125.                 }
  126.         }
  127.         if(Rx_Ok1)
  128.         {
  129.                 Rx_Ok1 = 0;
  130.                 u8 sum = 0;
  131.                 for(int i=0;i<31;i++)
  132.                         sum += Rx_Buf[1][i];
  133.                 if(sum == Rx_Buf[1][31])                //和校驗通過
  134.                 {
  135.                         Uart_DataAnl(1);
  136.                 }
  137.         }
  138. }

  139. void Uart1_Send_Buf(u8 *buf,u8 len)                //發(fā)送buf,長度len,返回字節(jié)和sum
  140. {
  141.         while(len)
  142.         {
  143.                 Uart1_Put_Char(*buf);
  144.                 buf++;
  145.                 len--;
  146.         }
  147. }
  148. void Uart1_Send_RCdata(void)
  149. {
  150.         uint8_t sum = 0;
  151.         sum += Uart1_Put_Char(0x88);
  152.         sum += Uart1_Put_Char(0xAE);
  153.         sum += Uart1_Put_Char(28);
  154.         sum += Uart1_Put_Int16(Rc_Get.THROTTLE);
  155.         sum += Uart1_Put_Int16(Rc_Get.YAW);
  156.         sum += Uart1_Put_Int16(Rc_Get.ROLL);
  157.         sum += Uart1_Put_Int16(Rc_Get.PITCH);
  158.         sum += Uart1_Put_Int16(Rc_Get.AUX1);
  159.         sum += Uart1_Put_Int16(Rc_Get.AUX2);
  160.         sum += Uart1_Put_Int16(Rc_Get.AUX3);
  161.         sum += Uart1_Put_Int16(Rc_Get.AUX4);
  162.         sum += Uart1_Put_Int16(0);
  163.         sum += Uart1_Put_Int16(0);
  164.         sum += Uart1_Put_Int16(0);
  165.         sum += Uart1_Put_Int16(0);
  166.         sum += Uart1_Put_Int16(0);
  167.         sum += Uart1_Put_Int16(0);
  168.         Uart1_Put_Char(sum);
  169. }

  170. void PC_Debug_Show(u8 num,u16 sta)//sta=0 熄滅 sta=1 點亮  >1 取反
  171. {
  172.         static uint8_t led_s[6] = {0,0,0,0,0,0};
  173.         uint8_t sum = 0;
  174.         if(0<num && num<7)
  175.         {
  176.                 sum += Uart1_Put_Char(0x88);
  177.                 sum += Uart1_Put_Char(0xAD);
  178.                 sum += Uart1_Put_Char(0x02);
  179.                 sum += Uart1_Put_Char(num);
  180.                 if(sta==0)
  181.                         sum += Uart1_Put_Char(0x00);
  182.                 else if(sta==1)
  183.                         sum += Uart1_Put_Char(0x01);
  184.                 else
  185.                 {
  186.                         if(led_s[num])        led_s[num] = 0;
  187.                         else                         led_s[num] = 1;
  188.                         sum += Uart1_Put_Char(led_s[num]);
  189.                 }
  190.                 Uart1_Put_Char(sum);
  191.         }
  192.         else if(6<num && num<13)
  193.         {
  194.                 sum += Uart1_Put_Char(0x88);
  195.                 sum += Uart1_Put_Char(0xAD);
  196.                 sum += Uart1_Put_Char(0x03);
  197.                 sum += Uart1_Put_Char(num);
  198.                 sum += Uart1_Put_Int16(sta);
  199.                 Uart1_Put_Char(sum);
  200.         }
  201. }
  202. void Uart1_Send_AF(void)
  203. {
  204.         uint8_t sum = 0;
  205.         uint16_t _temp;
  206.         sum += Uart1_Put_Char(0x88);
  207.         sum += Uart1_Put_Char(0xAF);
  208.         sum += Uart1_Put_Char(0x1c);
  209.         sum += Uart1_Put_Char(BYTE1(MPU6050_ACC_LAST.X));
  210.         sum += Uart1_Put_Char(BYTE0(MPU6050_ACC_LAST.X));
  211.         sum += Uart1_Put_Char(BYTE1(MPU6050_ACC_LAST.Y));
  212.         sum += Uart1_Put_Char(BYTE0(MPU6050_ACC_LAST.Y));
  213.         sum += Uart1_Put_Char(BYTE1(MPU6050_ACC_LAST.Z));
  214.         sum += Uart1_Put_Char(BYTE0(MPU6050_ACC_LAST.Z));
  215.         sum += Uart1_Put_Char(BYTE1(MPU6050_GYRO_LAST.X));
  216.         sum += Uart1_Put_Char(BYTE0(MPU6050_GYRO_LAST.X));
  217.         sum += Uart1_Put_Char(BYTE1(MPU6050_GYRO_LAST.Y));
  218.         sum += Uart1_Put_Char(BYTE0(MPU6050_GYRO_LAST.Y));
  219.         sum += Uart1_Put_Char(BYTE1(MPU6050_GYRO_LAST.Z));
  220.         sum += Uart1_Put_Char(BYTE0(MPU6050_GYRO_LAST.Z));
  221.         sum += Uart1_Put_Char(0);
  222.         sum += Uart1_Put_Char(0);
  223.         sum += Uart1_Put_Char(0);
  224.         sum += Uart1_Put_Char(0);
  225.         sum += Uart1_Put_Char(0);
  226.         sum += Uart1_Put_Char(0);
  227.        
  228.         _temp = (int)(Q_ANGLE.X*100);
  229.         sum += Uart1_Put_Char(BYTE1(_temp));
  230.         sum += Uart1_Put_Char(BYTE0(_temp));
  231.         _temp = (int)(Q_ANGLE.Y*100);
  232.         sum += Uart1_Put_Char(BYTE1(_temp));
  233.         sum += Uart1_Put_Char(BYTE0(_temp));
  234.   _temp = (int)(Q_ANGLE.Z*100);
  235.         sum += Uart1_Put_Char(BYTE1(_temp));
  236.         sum += Uart1_Put_Char(BYTE0(_temp));
  237.        
  238.         //sum += Uart1_Put_Char(0);
  239.   //sum += Uart1_Put_Char(0);
  240.         sum += Uart1_Put_Char(0);
  241.         sum += Uart1_Put_Char(0);
  242.         sum += Uart1_Put_Char(0);
  243.         sum += Uart1_Put_Char(0);
  244.         Uart1_Put_Char(sum);
  245. }

  246. void Uart1_Send_AE(void)
  247. {
  248.         uint8_t sum=0;
  249.         uint16_t _temp;
  250.         sum = 0;       
  251.         sum =  Uart1_Put_Char(0x88);
  252.         sum += Uart1_Put_Char(0xAE);
  253.         sum += Uart1_Put_Char(0x1c);
  254.         sum += Uart1_Put_Char(0);
  255.         sum += Uart1_Put_Char(0);
  256.         sum += Uart1_Put_Char(0);
  257.         sum += Uart1_Put_Char(0);
  258.         sum += Uart1_Put_Char(0);
  259.         sum += Uart1_Put_Char(0);
  260.         sum += Uart1_Put_Char(0);
  261. ……………………

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

所有資料51hei提供下載:
bee_source.rar (386.55 KB, 下載次數(shù): 13)


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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲一区 | 亚洲精品视频在线播放 | 亚洲精品自在在线观看 | 精品福利av导航 | 国产日韩在线观看一区 | va精品| 狠狠干夜夜草 | 亚洲国产精品人人爽夜夜爽 | 久久久久久久久久久久久久av | 国产高清精品在线 | 欧美日本韩国一区二区 | 国产高清视频在线 | 亚洲综合视频 | 波波电影院一区二区三区 | 欧美一区二区在线播放 | 久久激情五月丁香伊人 | 亚洲欧美一区二区三区国产精品 | 亚洲成人av在线播放 | 夜色www国产精品资源站 | 国产一区二区三区视频 | 亚洲小视频在线播放 | 欧美日韩国产三级 | www亚洲精品 | 免费一级大片 | 久久91精品 | 国产精品久久久久久久久久久免费看 | 久久久久久久久久久久久91 | 亚洲午夜电影 | 国产在线观看一区二区 | 欧美在线视频网 | 国产精品区二区三区日本 | 久久在线 | 久久久久国产精品 | 在线看亚洲| 精品福利在线 | 亚洲第一色站 | 在线一区| 欧美亚洲国产一区二区三区 | www.一级片 | 天天色图 | 久久精品中文字幕 |