我发现《四轴飞行器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},
};