找回密码
 立即注册

QQ登录

只需一步,快速开始

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

飞控代码

[复制链接]
跳转到指定楼层
楼主
ID:253045 发表于 2017-11-24 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • /*
  • ******************* (C) COPYRIGHT 2015 Air Nano Team ***************************
  • * 模块名称 : 主程序模块
  • * 文件名   :main.c
  • * 描述     :系统初始化
  • * 实验平台 :HT_Hawk
  • * 库版本   :ST3.5.0
  • * 作者     :Air Nano Team
  • *********************************************************************************
  • */
  • #include "board_config.h"
  • /*
  • *********************************************************************************************************
  • *        函 数 名: main
  • *        功能说明: c程序入口
  • *        形    参:无
  • *        返 回 值: 错误代码(无需处理)
  • *********************************************************************************************************
  • */
  • int main(void)
  • {
  •         // boot_loader 相关配置
  •     Bootloader_Set();              //单片机引导程序
  •         // 硬件初始化
  •         InitBoard();
  •         // 传感器初始化
  •         Sensor_Init();
  •         // 加载参数
  •         paramLoad();
  •         /* 开定时中断 */
  •     EnTIMER;
  •         while(1)
  •         {
  •      loop();   //主函数循环执行部分  与上位机通讯  刷新OLED屏  保存修改的PID数据
  •         }
  • }
  • 复制代码MultiRotor_app.c
  • /******************** (C) COPYRIGHT 2014 Air Nano Team ***************************
  • * 文件名  :INIT.c
  • * 描述    :系统初始化
  • * 实验平台:HT_Hawk
  • * 库版本  :ST3.5.0
  • * 作者    :Air Nano Team
  • **********************************************************************************/
  • #include "include.h"
  • #include "MultiRotor_app.h"
  • fp32 Battery_Voltage;
  • Flag_t flag;    //【标志的结构体定义】 此处可以分开定义
  • ////*************************************************
  • ////********* struct {
  • ////              u8 MpuExist;      // MPU存在
  • ////              u8 MagExist;      // MAG存在
  • ////              u8 NrfExist;      // NRF存在
  • ////              u8 MagIssue;      // MAG有问题
  • ////
  • ////          u8 ARMED;         // 电机解锁
  • ////              u8 LockYaw;       // 航向锁定
  • ////          u8 calibratingA;  // 加速度采集
  • ////              u8 calibratingM;  // 磁力计采集
  • ////              u8 calibratingM_pre; //磁力计预采集
  • ////
  • ////              u8 ParamSave;     // 参数保存标志
  • ////
  • ////              u8 Loop_250Hz;
  • ////              u8 Loop_100Hz;
  • ////              u8 Loop_10Hz;
  • ////********* }Flag_t;
  • ////************************************************
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函数 : Bootloader_Set
  • **功能 : BOOT相关设置
  • **输入 : None
  • **輸出 : None
  • **备注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void Bootloader_Set(void)
  • {
  •          u16 i;
  •         // 设置偏移量
  •         SCB->VTOR = FLASH_BASE | FLASH_EXCURSION ;
  •         i=0x0505;
  •         STMFLASH_Write(pro_FALG_ADD,&i,1);
  • }
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函数 : Sensor_Init
  • **功能 : ===============================【硬件初始化】===============================================//
  • **输入 : None
  • **輸出 : None
  • **备注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void InitBoard(void)
  • {
  •         delay_init(72);     //延时函数初始化  使用SYSCLK  分为  【ms级延时  us级延时 普通软件延时】
  •         Nvic_Init();        //中断初始化      time.c中 配置     【TIM5-系统时基  TIM2 TIM3输入捕捉 提供八通道】
  •         /* 初始化USB设备 */
  •     bsp_InitUsb();      //与上位机通讯使用
  •         ADC1_Init();
  •         OLED_Init();
  •         I2C_INIT();
  •     LED_GPIO_Config();
  •         USART1_Config();
  •         TIM5_Config();      //TIM5 2ms中断一次 提供系统时基
  •         PWM_OUT_Config();   //PWM输出控制无刷电机 【TIM1 TIM4 提供八路PWM输出】
  •         PWM_IN_Config();    //PWM输入捕捉初始化 使用TIM2输入捕捉
  •         NRF24L01_Init();
  •          LED_SHOW();
  •          FLASH_Unlock();
  •          EE_Init();          //EEPROM掉电保存数据
  • }
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函数 : Sensor_Init
  • **功能 : ================================【传感器初始化】============================================//
  • **输入 : None
  • **輸出 : None
  • **备注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void Sensor_Init(void)
  • {
  •         flag.MpuExist = InitMPU6050();     //读取初始化成功标志
  •         flag.MagExist = Init_HMC5883L();   //传感器初始化成功   传感器存在的标志
  •     flag.NrfExist = NRF24L01_Check();
  •     NRF24L01_Mode(1);                  //设置24l01为发送模式
  •         OLED_P6x8Str(0,1,"ROLL:");         //OLED显示三个姿态欧拉角数值
  •         OLED_P6x8Str(0,2,"PITCH:");
  •         OLED_P6x8Str(0,3,"YAW:");
  •         OLED_P6x8Str(0,5,"YAW:");          //四个遥控器通道数据
  •         OLED_P6x8Str(0,6,"THR:");
  •         OLED_P6x8Str(56,5,"ROLL:");
  •         OLED_P6x8Str(56,6,"PITCH:");
  • }
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函数 : Screen_Update
  • **功能 : 屏幕数据更新
  • **输入 : None
  • **輸出 : None
  • **备注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void Screen_Update(void)
  • {
  •         Dis_Float(1,40,AngE.Roll,1);
  •         Dis_Float(2,40,AngE.Pitch,1);
  •         Dis_Float(3,40,AngE.Yaw,1);
  •     OLED_4num(4,5,RC_Data.YAW);
  •         OLED_4num(4,6,RC_Data.THROTTLE);
  •         OLED_4num(57,5,RC_Data.ROLL);
  •         OLED_4num(58,6,RC_Data.PITCH);
  • }
  • //***********************************【划分时间片,分配任务】******************************************//
  • //======================================【主循环执行函数】============================================//
  • void loop(void)
  • {                               //姿态解算 串级PID控制 在中断函数中执行 每2ms执行一次
  •         // 250HZ
  •         if(flag.Loop_250Hz){
  •                 flag.Loop_250Hz=0;
  •                 UsbCmdPro();                //USB接收上位机数据 【4ms执行一次】
  •     FailSafeLEDAlarm();         //闪烁灯
  •         }
  •         // 100HZ
  •         if(flag.Loop_100Hz){
  •                 flag.Loop_100Hz=0;
  •     mavlink();                  //飞控板循环发送数据到上位机 【10ms执行一次】
  •                 Screen_Update();            //更新OLED三个欧拉角和四个通道遥控器数据
  •         }
  •                 if(flag.Loop_10Hz){
  •                 flag.Loop_10Hz=0;
  •     EE_SAVE_Attitude_PID();     //如果调节了PID参数则用EEPROM保存数据 【100ms执行一次】
  •         }
  • }
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函数 : Time_slice
  • **功能 :【时间片】
  • **输入 : None
  • **輸出 : None
  • **备注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void Time_slice(void)      //每中断一次执行一次本函数
  • {
  •   static u16 tick[3]={0,0,0};
  •         tick[0]++;tick[1]++;tick[2]++;
  •         if(tick[0]>=2){          //4ms    2次中断  一次2ms
  •                  tick[0] = 0;
  •                  flag.Loop_250Hz = 1;
  •         }
  •   if(tick[1]>=5){          //10ms   5次
  •                 tick[1] = 0;
  •                 flag.Loop_100Hz = 1;
  •         }
  •   if(tick[2] >= 50)        {      //100ms  50次
  •                 tick[2] = 0;
  •                 flag.Loop_10Hz = 1;
  •         }
  • }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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