我发现《四轴飞行器DIY-基于STM32微控制器》,还有crazypony,还有无名,这类没有用操作系统的都是靠定时器来弄的。
飞控的程序大体可以分类两类,有操作系统和没有操作系统的。
怪不得无名的那些主要功能都没有写在main函数里面,写在time.c里面
莫非他们都是在中断里面实现姿态控制的么
是不是还可以把匿名的代码也拿来分析一下。
之前在这篇文章总结过
https://blog.csdn.net/sinat_16643223/article/details/107295403?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160148049619725222408940%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=160148049619725222408940&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-3-107295403.pc_v1_rank_blog_v1&utm_term=%E8%BD%AF%E4%BB%B6%E6%A1%86%E6%9E%B6&spm=1018.2118.3001.4187
看了下匿名的代码,它也是分为不同频率的任务,当然虽然他这里面说“线程”,但匿名是没有用操作系统的。
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},
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)