找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STM32F103的飞控源程序(无刷电机控制)

[复制链接]
跳转到指定楼层
楼主
ID:387229 发表于 2018-8-17 13:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
也是在网上找的一些资料,这个代码相当全面
主要针对无刷电机控制的可以一起学习一下

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "delay.h"
  4. #include "sys.h"
  5. #include <math.h>
  6. #include "mysystem.h"
  7. #include "mpu6050.h"
  8. #include "myiic.h"
  9. #include "led.h"
  10. #include "adc.h"
  11. #include "spi.h"
  12. #include "nrf24l01.h"
  13. #include "time.h"
  14. #include "motor.h"
  15. #include "rc.h"
  16. #include "pid_own.h"
  17. #include "myimu.h"
  18. #include "iwdg.h"


  19. u8 count=0;
  20. u8 Con_FLAG = 0;
  21. Int16_xyz Accel,Gyro;           //两次综合后的传感器数据
  22. Int16_xyz        Acc_Data_Con;  //滤波后的加速度
  23. Float_angle  Att_Angle;         //ATT函数计算出的姿态角

  24. static u8 Count=0;
  25. static Int16_xyz mpu6050_dataacc1,mpu6050_dataacc2,mpu6050_datagyr1,mpu6050_datagyr2;

  26. int Arm_Count=0,Dis_Count=0;


  27. int main(void)
  28. {
  29.         armed=0;//锁四轴
  30.         
  31.         delay_init();
  32.         LED_Init();
  33.         I2C_EE_Init();
  34.         delay_ms(20);
  35.         MPU6050_Init();
  36.         ADC1_Init();
  37.         Spi1_Init();
  38.         Nrf24l01_Init(MODEL_TX2,40);
  39.         delay_ms(10);
  40.         Tim3_Init(499);
  41.         TIM2_PWM_Init(999,72/24-1);
  42.         USART1_Init(115200);
  43.         Nvic_Init();
  44.         
  45.         if(Nrf24l01_Check())
  46.         {
  47.                 USART1_Put_String("NRF IS OK !!!");
  48.         }

  49.         LED_FLASH();

  50.         Tim3_Con(1);
  51.         IWDG_Init(0,625);//1/16 S
  52.         
  53.         while(1)
  54.         {
  55.                 RC_Rece();
  56.                
  57.                 if(Receive.AD_YM < 500 && Receive.AD_PZ < 1500) Arm_Count++;
  58.                 else Arm_Count = 0;
  59.                 if(Receive.AD_YM < 500 && Receive.AD_PZ > 2500) Dis_Count++;
  60.                 else Dis_Count = 0;
  61.                
  62.                 if(Arm_Count > 20000) {Arm_Count=0; armed = 1; LEDY_ON delay_ms(300);LEDY_OFF delay_ms(300);LEDY_ON delay_ms(300);LEDY_OFF delay_ms(300);LEDY_ON delay_ms(300);LEDY_OFF delay_ms(300);}
  63.                 if(Dis_Count > 20000) {Dis_Count=0; armed = 0; LEDY_ON delay_ms(50);LEDY_OFF delay_ms(50);LEDY_ON delay_ms(50);LEDY_OFF delay_ms(50);LEDY_ON delay_ms(50);LEDY_OFF delay_ms(50);LEDY_ON delay_ms(50);LEDY_OFF delay_ms(50);}
  64.                         
  65.                 if(Receive.Fun == 0) LEDY_ON
  66.                 else LEDY_OFF
  67.         }
  68. }

  69. void TIM3_IRQHandler(void)                //0.5ms中断一次
  70. {        
  71.         if ( TIM_GetITStatus(TIM3 , TIM_IT_Update) != RESET )
  72.         {
  73.                 TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);   //清除中断标志

  74.                 count++;
  75.                
  76.                 IWDG_Feed();//防止卡死的关键
  77.                 Nrf_Check_Event();
  78.                
  79.                 RC_Send();
  80.                 NRF_TxPacket(NRF24L01_TXDATA,32);

  81.                 if(count == 2)//1ms
  82.                 {
  83.                         count = 0;
  84.                         MPU6050_GetDate();
  85.                         
  86.                         Con_FLAG = 1;
  87.                 }
  88.                 if(Con_FLAG)//1ms
  89.                 {
  90.                         Con_FLAG = 0;
  91.                         Count ++;
  92.                         
  93.                         if(Count == 1)
  94.                                 MPU6050_DataCon(&mpu6050_dataacc1,&mpu6050_datagyr1);        //2ms
  95.                         else
  96.                         {
  97.                                 Count = 0;
  98.                                 MPU6050_DataCon(&mpu6050_dataacc2,&mpu6050_datagyr2);        //2ms
  99.                                 Accel.X = (mpu6050_dataacc1.X + mpu6050_dataacc2.X)/2;
  100.                                 Accel.Y = (mpu6050_dataacc1.Y + mpu6050_dataacc2.Y)/2;
  101.                                 Accel.Z = (mpu6050_dataacc1.Z + mpu6050_dataacc2.Z)/2;
  102.                                 Gyro.X = (mpu6050_datagyr1.X + mpu6050_datagyr2.X)/2;
  103.                                 Gyro.Y = (mpu6050_datagyr1.Y + mpu6050_datagyr2.Y)/2;
  104.                                 Gyro.Z = (mpu6050_datagyr1.Z + mpu6050_datagyr2.Z)/2;
  105.                         
  106.                                 Accel_Con(&Accel,&Acc_Data_Con);//加速度滤波
  107.                                 IMUupdate(&Gyro,&Acc_Data_Con,&Att_Angle);        //IMU姿态解算
  108.                                 Pid_Con(Att_Angle.pit,Gyro.X,Att_Angle.rol,Gyro.Y,Att_Angle.yaw,Gyro.Z,Receive.AD_YM,armed);
  109.                         }
  110.                 }
  111.         }

  112. }

  113. //                if(Att_Angle.pit >= 0)
  114. //                {
  115. //                        USART_SendData(USART1, '+');delay_ms(1);
  116. //                        USART_SendData(USART1, '0'+(int)Att_Angle.pit % 1000/100);delay_ms(1);
  117. //                        USART_SendData(USART1, '0'+(int)Att_Angle.pit % 100/10);delay_ms(1);
  118. //                        USART_SendData(USART1, '0'+(int)Att_Angle.pit % 10);delay_ms(1);
  119. //                        USART_SendData(USART1, '\n');//Delay_ms_led(100);
  120. //                }
  121. //                else
  122. //                {
  123. //                        USART_SendData(USART1, '-');delay_ms(1);
  124. //                        USART_SendData(USART1, '0'+abs((int)Att_Angle.pit)/100);delay_ms(1);
  125. //                        USART_SendData(USART1, '0'+abs((int)Att_Angle.pit)%100/10);delay_ms(1);
  126. //                        USART_SendData(USART1, '0'+abs((int)Att_Angle.pit)%10);delay_ms(1);
  127. //                        USART_SendData(USART1, '\n');//Delay_ms_led(100);               
  128. //                }
  129. //                if(Att_Angle.rol >= 0)
  130. //                {
  131. //                        USART_SendData(USART1, '+');delay_ms(1);
  132. //                        USART_SendData(USART1, '0'+(int)Att_Angle.rol % 1000/100);delay_ms(1);
  133. //                        USART_SendData(USART1, '0'+(int)Att_Angle.rol % 100/10);delay_ms(1);
  134. //                        USART_SendData(USART1, '0'+(int)Att_Angle.rol % 10);delay_ms(1);
  135. //                        USART_SendData(USART1, '\n');//Delay_ms_led(100);
  136. //                }
  137. //                else
  138. //                {
  139. //                        USART_SendData(USART1, '-');delay_ms(1);
  140. //                        USART_SendData(USART1, '0'+abs((int)Att_Angle.rol)/100);delay_ms(1);
  141. //                        USART_SendData(USART1, '0'+abs((int)Att_Angle.rol)%100/10);delay_ms(1);
  142. //                        USART_SendData(USART1, '0'+abs((int)Att_Angle.rol)%10);delay_ms(1);
  143. //                        USART_SendData(USART1, '\n');//Delay_ms_led(100);               
  144. //                }
  145. //                if(Gyro.X >= 0)
  146. //                {
  147. //                        USART_SendData(USART1, '+');delay_ms(1);
  148. //                        USART_SendData(USART1, '0'+(int)Gyro.X % 1000/100);delay_ms(1);
  149. //                        USART_SendData(USART1, '0'+(int)Gyro.X % 100/10);delay_ms(1);
  150. //                        USART_SendData(USART1, '0'+(int)Gyro.X % 10);delay_ms(1);
  151. //                        USART_SendData(USART1, '\n');//Delay_ms_led(100);
  152. //                }
  153. //                else
  154. //                {
  155. //                        USART_SendData(USART1, '-');delay_ms(1);
  156. //                        USART_SendData(USART1, '0'+abs((int)Gyro.X)/100);delay_ms(1);
  157. //                        USART_SendData(USART1, '0'+abs((int)Gyro.X)%100/10);delay_ms(1);
  158. //                        USART_SendData(USART1, '0'+abs((int)Gyro.X)%10);delay_ms(1);
  159. //                        USART_SendData(USART1, '\n');//Delay_ms_led(100);               
  160. //                }

复制代码

所有资料51hei提供下载:
飞控基本版.rar (323.32 KB, 下载次数: 167)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:393919 发表于 2018-9-5 11:12 | 只看该作者
谢谢分享
!!111
回复

使用道具 举报

板凳
ID:451968 发表于 2020-1-3 23:30 | 只看该作者
大四轴吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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