本文共 1957 字,大约阅读时间需要 6 分钟。
我发现《四轴飞行器DIY-基于STM32微控制器》,还有crazypony,还有无名,这类没有用操作系统的都是靠定时器来弄的。
飞控的程序大体可以分类两类,有操作系统和没有操作系统的。
怪不得无名的那些主要功能都没有写在main函数里面,写在time.c里面
莫非他们都是在中断里面实现姿态控制的么
是不是还可以把匿名的代码也拿来分析一下。
之前在这篇文章总结过
看了下匿名的代码,它也是分为不同频率的任务,当然虽然他这里面说“线程”,但匿名是没有用操作系统的。
static void Loop_1000Hz(void) //1ms执行一次{ test_dT_1000hz[0] = test_dT_1000hz[1]; test_rT[3] = test_dT_1000hz[1] = GetSysTime_us (); test_dT_1000hz[2] = (u32)(test_dT_1000hz[1] - test_dT_1000hz[0]) ;// /*传感器数据读取*/ Fc_Sensor_Get(); /*惯性传感器数据准备*/ Sensor_Data_Prepare(1); /*姿态解算更新*/ IMU_Update_Task(1); /*获取WC_Z加速度*/ WCZ_Acc_Get_Task(); /*飞行状态任务*/ Flight_State_Task(1,CH_N); /*开关状态任务*/ Swtich_State_Task(1); /*姿态角速度环控制*/ Att_1level_Ctrl(1e-3f); /*电机输出控制*/ Motor_Ctrl_Task(1); /*数传数据交换*/ ANO_DT_Data_Exchange(); // test_rT[4]= GetSysTime_us (); test_rT[5] = (u32)(test_rT[4] - test_rT[3]) ; }static void Loop_500Hz(void) //2ms执行一次{ }static void Loop_200Hz(void) //5ms执行一次{ }static void Loop_100Hz(void) //10ms执行一次{ test_rT[0]= GetSysTime_us ();// /*遥控器数据处理*/ RC_duty_task(10); /*飞行模式设置任务*/ Flight_Mode_Set(10); /*获取姿态角(ROLL PITCH YAW)*/ calculate_RPY(); /*姿态角度环控制*/ Att_2level_Ctrl(10e-3f,CH_N); /*位置速度环控制(暂无)*/ Loc_1level_Ctrl(10,CH_N); /*高度数据融合任务*/ WCZ_Fus_Task(10); /*高度速度环控制*/ Alt_1level_Ctrl(10e-3f); /*高度环控制*/ Alt_2level_Ctrl(10e-3f); /*光流数据解析*/ AnoOF_DataAnl_Task(10); /*灯光控制*/ LED_Task(10);// test_rT[1]= GetSysTime_us (); test_rT[2] = (u32)(test_rT[1] - test_rT[0]) ; }static void Loop_50Hz(void) //20ms执行一次{ /*罗盘数据处理任务*/ Mag_Update_Task(20);}static void Loop_20Hz(void) //50ms执行一次{ /*TOF激光任务*/ Drv_Vl53_RunTask(); /*电压相关任务*/ Power_UpdateTask(50);}static void Loop_2Hz(void) //500ms执行一次{ /*延时存储任务*/ Ano_Parame_Write_task(500);}//系统任务配置,创建不同执行频率的“线程”static sched_task_t sched_tasks[] = { {Loop_1000Hz,1000, 0, 0}, {Loop_500Hz , 500, 0, 0}, {Loop_200Hz , 200, 0, 0}, {Loop_100Hz , 100, 0, 0}, {Loop_50Hz , 50, 0, 0}, {Loop_20Hz , 20, 0, 0}, {Loop_2Hz , 2, 0, 0},};
转载地址:http://ixlni.baihongyu.com/