找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2035|回复: 0
收起左侧

stm32四轴飞控源程序

[复制链接]
ID:347767 发表于 2018-9-25 22:33 | 显示全部楼层 |阅读模式
编译,下载,运行,连接飞控串口和FTDI串口,串口波特率500K,上位机打开高级收码,在上位机飞控状态标签可以看到变化的传感器数据,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数据,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位数据  低位在前
  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数据
  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)                //发送PID数据给上位机
  75.         {
  76.                 //反馈数据
  77.                 EE_READ_PID_Send();
  78.         }
  79. }
  80. void Uart_DataAnl(u8 buf_num)                //串口缓存数据分析
  81. {
  82. if(Rx_Buf[buf_num][1]==0x8A)                //串口收到的是上位机的遥控数据
  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)                //发送buf,长度len,返回字节和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, 下载次数: 13)


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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