找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2330|回復: 1
打印 上一主題 下一主題
收起左側(cè)

stm32f103單片機自制飛控代碼分享

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:933779 發(fā)表于 2023-7-14 19:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
程序可以支持MPU6050數(shù)據(jù)讀取、SPL06氣壓計讀取、SBUS遙控數(shù)據(jù)讀取、最多可以控制8路電機或者電調(diào)。寫了PID算法,可以讓無人機在控制保持穩(wěn)定。
飛機是自制的,硬件和機械也是自己做的,
是本人設計一部分,硬件電路會在整理之后發(fā)出來。新人第一次發(fā)帖,還望各位大佬輕噴。
制作出來的實物圖如下:


單片機源程序如下:
  1. #include "sys.h"

  2. u8 report=0;                        //默認開啟上報
  3. int motor1,motor2,servo1,servo2;
  4. float Setpitch=0,Setroll=0;
  5. float pitch,roll,yaw;                 //歐拉角
  6. short aacx,aacy,aacz;                //加速度傳感器原始數(shù)據(jù)
  7. short gyrox,gyroy,gyroz;        //陀螺儀原始數(shù)據(jù)
  8. short temp;                                        //溫度       
  9. int main(void)
  10. {       
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
  12.         Usart_init();                 //串口初始化
  13.         delay_init();          //延時初始化 delay_ms(1000);
  14.         BEEP_GPIO_Init();
  15.         Motor_PWM_Init(20000-1, 72-1);
  16.         Servo_PWM_Init(20000-1, 72-1);
  17.         TIM2_Int_Init(100-1,720-1);
  18.         Motor_Unlock(1900,1100);
  19.         BEEP_GPIO_High();
  20.         FrSky_Uart2_Init(100000);
  21.         Adc_Init();
  22.         SPI1_Init();
  23.         SPL06_Init();
  24.         MPU_IIC_Init(); //MPU使用的IIC初始化
  25.         while(MPU_Init())
  26.         {
  27.                 printf("mpu error\n");
  28.                 delay_ms(200);
  29.         };                                        //初始化MPU6050
  30.        
  31.         while(mpu_dmp_init())
  32.         {
  33.                 printf("mpu dmp error\n");
  34.                 delay_ms(200);
  35.         }
  36.   PID_Init();
  37.         BEEP_GPIO_Low();

  38.         while(1)
  39.         {

  40.                 int i;
  41.                 static float Baro_Buf[20];
  42.                 Baro.Org_Alt = SPL06_Get_Altitude();
  43.                 //氣壓原始數(shù)據(jù)緩存
  44.     for(i=19;i>0;i--)
  45.     {
  46.         Baro_Buf[i]=Baro_Buf[i-1];
  47.     }
  48.     Baro_Buf[0]=Baro.Org_Alt;

  49. //                printf("%f\n",Baro.Org_Alt );
  50. //                delay_ms(100);
  51. /********測量電池電壓********/
  52.                
  53.                 Get_Bat_Voltage();
  54.                 if(Bat_Voltage<11)
  55.                 {
  56.                         BEEP_GPIO_High();
  57.                 }
  58.                 else
  59.                 {
  60.                         BEEP_GPIO_Low();
  61.                 }
  62. //////                printf("電池電壓為 %f \n",Bat_Voltage);
  63. ///**********陀螺儀數(shù)據(jù)輸出***************/               
  64. if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  65. {
  66. //        printf("%f,%f,%f\r\n",pitch,roll,yaw);
  67.         temp=MPU_Get_Temperature();        //得到溫度值
  68.         MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度傳感器數(shù)據(jù)
  69.         MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺儀數(shù)據(jù)
  70.         if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定義幀發(fā)送加速度和陀螺儀原始數(shù)據(jù)
  71.         if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));

  72. }
  73. /********     根據(jù)無線串口輸入并調(diào)整pid   ********/
  74.         PID_Update();       
  75.                
  76. /********更新遙控器數(shù)據(jù)********/               
  77.                 update_channels();
  78.                
  79. //                printf( "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",
  80. //                                channels[0],
  81. //                                channels[1],
  82. //                                channels[2],
  83. //                                channels[3],
  84. //                                channels[4],
  85. //                                channels[5],
  86. //                                channels[6],
  87. //                                channels[7],
  88. //                                channels[8],
  89. //                                channels[9],
  90. //                                channels[10],
  91. //                                channels[11]
  92. //                         );                                                                                       
  93. /********遙控器控制電機********/                       
  94.                 motor1=motor2=channels[0]/2+1000;       
  95.                 //printf("%d\r\n",channels[0]);
  96.                 Motor_PWM_Set(motor1,motor2);
  97. /********遙控器控制舵機********/               
  98. //                servo1=channels[1];
  99. //                servo2=channels[2];
  100. //    Servo_PWM_Set(servo1,servo2);

  101. Setpitch=(channels[1]-988)/30;
  102. if(channels[2]>1003 | channels[2]<1000){
  103. Setroll =(channels[2]-1002)/30;
  104. }

  105. /********測試舵機********/       
  106. //        Servo_PWM_Set(1050,950);

  107. //printf("%f,%f,%f,%f\n",Setroll,roll,Setpitch,pitch);
  108.         }        
  109. }

復制代碼

Keil代碼下載:
程序.7z (392.28 KB, 下載次數(shù): 24)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:336378 發(fā)表于 2023-8-4 12:19 | 只看該作者
這樣子能飛起來嗎??。
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表