也是在网上找的一些资料,这个代码相当全面
主要针对无刷电机控制的可以一起学习一下
单片机源程序如下:
- #include "stm32f10x.h"
- #include "usart.h"
- #include "delay.h"
- #include "sys.h"
- #include <math.h>
- #include "mysystem.h"
- #include "mpu6050.h"
- #include "myiic.h"
- #include "led.h"
- #include "adc.h"
- #include "spi.h"
- #include "nrf24l01.h"
- #include "time.h"
- #include "motor.h"
- #include "rc.h"
- #include "pid_own.h"
- #include "myimu.h"
- #include "iwdg.h"
- u8 count=0;
- u8 Con_FLAG = 0;
- Int16_xyz Accel,Gyro; //两次综合后的传感器数据
- Int16_xyz Acc_Data_Con; //滤波后的加速度
- Float_angle Att_Angle; //ATT函数计算出的姿态角
- static u8 Count=0;
- static Int16_xyz mpu6050_dataacc1,mpu6050_dataacc2,mpu6050_datagyr1,mpu6050_datagyr2;
- int Arm_Count=0,Dis_Count=0;
- int main(void)
- {
- armed=0;//锁四轴
-
- delay_init();
- LED_Init();
- I2C_EE_Init();
- delay_ms(20);
- MPU6050_Init();
- ADC1_Init();
- Spi1_Init();
- Nrf24l01_Init(MODEL_TX2,40);
- delay_ms(10);
- Tim3_Init(499);
- TIM2_PWM_Init(999,72/24-1);
- USART1_Init(115200);
- Nvic_Init();
-
- if(Nrf24l01_Check())
- {
- USART1_Put_String("NRF IS OK !!!");
- }
- LED_FLASH();
- Tim3_Con(1);
- IWDG_Init(0,625);//1/16 S
-
- while(1)
- {
- RC_Rece();
-
- if(Receive.AD_YM < 500 && Receive.AD_PZ < 1500) Arm_Count++;
- else Arm_Count = 0;
- if(Receive.AD_YM < 500 && Receive.AD_PZ > 2500) Dis_Count++;
- else Dis_Count = 0;
-
- 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);}
- 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);}
-
- if(Receive.Fun == 0) LEDY_ON
- else LEDY_OFF
- }
- }
- void TIM3_IRQHandler(void) //0.5ms中断一次
- {
- if ( TIM_GetITStatus(TIM3 , TIM_IT_Update) != RESET )
- {
- TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update); //清除中断标志
- count++;
-
- IWDG_Feed();//防止卡死的关键
- Nrf_Check_Event();
-
- RC_Send();
- NRF_TxPacket(NRF24L01_TXDATA,32);
- if(count == 2)//1ms
- {
- count = 0;
- MPU6050_GetDate();
-
- Con_FLAG = 1;
- }
- if(Con_FLAG)//1ms
- {
- Con_FLAG = 0;
- Count ++;
-
- if(Count == 1)
- MPU6050_DataCon(&mpu6050_dataacc1,&mpu6050_datagyr1); //2ms
- else
- {
- Count = 0;
- MPU6050_DataCon(&mpu6050_dataacc2,&mpu6050_datagyr2); //2ms
- Accel.X = (mpu6050_dataacc1.X + mpu6050_dataacc2.X)/2;
- Accel.Y = (mpu6050_dataacc1.Y + mpu6050_dataacc2.Y)/2;
- Accel.Z = (mpu6050_dataacc1.Z + mpu6050_dataacc2.Z)/2;
- Gyro.X = (mpu6050_datagyr1.X + mpu6050_datagyr2.X)/2;
- Gyro.Y = (mpu6050_datagyr1.Y + mpu6050_datagyr2.Y)/2;
- Gyro.Z = (mpu6050_datagyr1.Z + mpu6050_datagyr2.Z)/2;
-
- Accel_Con(&Accel,&Acc_Data_Con);//加速度滤波
- IMUupdate(&Gyro,&Acc_Data_Con,&Att_Angle); //IMU姿态解算
- Pid_Con(Att_Angle.pit,Gyro.X,Att_Angle.rol,Gyro.Y,Att_Angle.yaw,Gyro.Z,Receive.AD_YM,armed);
- }
- }
- }
- }
- // if(Att_Angle.pit >= 0)
- // {
- // USART_SendData(USART1, '+');delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Att_Angle.pit % 1000/100);delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Att_Angle.pit % 100/10);delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Att_Angle.pit % 10);delay_ms(1);
- // USART_SendData(USART1, '\n');//Delay_ms_led(100);
- // }
- // else
- // {
- // USART_SendData(USART1, '-');delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Att_Angle.pit)/100);delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Att_Angle.pit)%100/10);delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Att_Angle.pit)%10);delay_ms(1);
- // USART_SendData(USART1, '\n');//Delay_ms_led(100);
- // }
- // if(Att_Angle.rol >= 0)
- // {
- // USART_SendData(USART1, '+');delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Att_Angle.rol % 1000/100);delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Att_Angle.rol % 100/10);delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Att_Angle.rol % 10);delay_ms(1);
- // USART_SendData(USART1, '\n');//Delay_ms_led(100);
- // }
- // else
- // {
- // USART_SendData(USART1, '-');delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Att_Angle.rol)/100);delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Att_Angle.rol)%100/10);delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Att_Angle.rol)%10);delay_ms(1);
- // USART_SendData(USART1, '\n');//Delay_ms_led(100);
- // }
- // if(Gyro.X >= 0)
- // {
- // USART_SendData(USART1, '+');delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Gyro.X % 1000/100);delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Gyro.X % 100/10);delay_ms(1);
- // USART_SendData(USART1, '0'+(int)Gyro.X % 10);delay_ms(1);
- // USART_SendData(USART1, '\n');//Delay_ms_led(100);
- // }
- // else
- // {
- // USART_SendData(USART1, '-');delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Gyro.X)/100);delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Gyro.X)%100/10);delay_ms(1);
- // USART_SendData(USART1, '0'+abs((int)Gyro.X)%10);delay_ms(1);
- // USART_SendData(USART1, '\n');//Delay_ms_led(100);
- // }
复制代码
所有资料51hei提供下载:
飞控基本版.rar
(323.32 KB, 下载次数: 167)
|