匿名飞控代码理解(自己理解的,自用,大家可以借鉴)

您所在的位置:网站首页 流控系统源码 匿名飞控代码理解(自己理解的,自用,大家可以借鉴)

匿名飞控代码理解(自己理解的,自用,大家可以借鉴)

2023-12-11 00:49| 来源: 网络整理| 查看: 265

*(奇学科技的后辈,都自己回去学,这不是正途)

主函数 flag.start_ok = All_Init(); //进行所有设备的初始化,并将初始化结果保存 Scheduler_Setup(); //调度器初始化,系统为裸奔,这里人工做了一个时分调度器

     初始化

定点启动 t=KEY_Scan(1); //得到键值 switch(t) { case KEY1_PRES: motorA_PWM_VALL=2003; motorB_PWM_VALL=2003; motorC_PWM_VALL=2003; motorD_PWM_VALL=2003; // // LED0=0; break; case KEY2_PRES: motorA_PWM_VALL=1003; motorB_PWM_VALL=1003; motorC_PWM_VALL=1003; motorD_PWM_VALL=1003; //LED1=0; break; /*case KEY3_PRES: motorA_PWM_VALL=1100 ; motorB_PWM_VALL=1100 ; LED0=1; break;*/ case KEY4_PRES: Scheduler_Run(); //运行任务调度器,所有系统功能,除了中断服务函数,都在任务调度器内完成 // LED1=1; // LED0=1; break;

按键一,二启动电调

按键四开启任务调度

任务调度函数

void Scheduler_Run(void) { uint8_t index = 0; //循环判断所有线程,是否应该执行 for(index=0;index < TASK_NUM;index++) { //获取系统当前时间,单位MS uint32_t tnow = SysTick_GetTick(); //进行判断,如果当前时间减去上一次执行的时间,大于等于该线程的执行周期,则执行线程 if(tnow - sched_tasks[index].last_run >= sched_tasks[index].interval_ticks) { //更新线程的执行时间,用于下一次判断 sched_tasks[index].last_run = tnow; //执行线程函数,使用的是函数指针 sched_tasks[index].task_func(); } } }

其中就是

//系统任务配置,创建不同执行频率的“线程” 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}, };

这个线程的流程;

 分别循环执行

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_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]) ; }

 循环执行。

就是先执行的一个里获得传感器数据,另外一个进行数据处理。

这个思路看这个视频,博主很牛逼;

有C语言和32基础看P1_哔哩哔哩_bilibili

 

然后代码来源是(4条消息) 匿名飞控代码解读汇总_匿名飞控源码_Yohaoa的博客-CSDN博客

顺便有没有路过的大神给我发个定高的程序。。。 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3