**匿名飞控代码解读**

匿名飞控代码解读
/*************************************************************************************************
作者:不会写代码的菜鸟
时间:2019.7.24
源码:匿名TI板飞控源码
*************************************************************************************************/

(分析代码不要忘了一个很重要的点就是芯片的刷新频率是很快的,别只一句一句的往下分析代码。该代码没有跑操作系统,而是利用伪线程进行同时多任务操作,该部分代码在Ano_Scheduler.c里面)

/*************************************************************************************************
1.在main();函数的while(1)里面进行Main_Task(void); 函数的循环 //这个函数是执行伪线程的周期时间的处理
*************************************************************************************************/

/*************************************************************************************************
2.在Main_Task(void);里面执行的是一个imu1ms的中断,以及static sched_task_t sched_tasks[] 这个数组里面的线程任务设置了每个线程任务的周期,以及上一次执行的时间, //利用指针进入这个数组里面的线程任务
*************************************************************************************************/

/*************************************************************************************************
3.RC_duty_task(11)函数是用来处理遥控器数据
解锁标志位:
【flag.unlock_cmd,这个标志位的值是由stick_function_check_longpress(dT_ms,&unlock_f,unlock_time,stick_fun_0,f,&flag.unlock_cmd)函数里面的f赋的值,但必须是在油门为低的时候才判断这些】

【flag.unlock_sta,这个标志位是由flag.unlock_cmd赋的值】

【flag.unlock_err,这个是由各个传感器已经电池电压都正常的情况下才为0,允许解锁标志位】

【flag.locking,解锁标志位,由摇杆的YAW,PITCH的值和flag.locking当前自身的值来判断的,该值也是在油门为低的时候才能判断的】

【flag.thr_low,油门高低标志位,油门大于1150的时候为非低,flag.thr_low为0】
*************************************************************************************************/

/*************************************************************************************************
4.Motor_Ctrl_Task(u8 dT_ms)函数是用来控制电机转动

【在满足flag.unlock_sta不为0,四个电机会相继转动起来,之后flag.motor_preparation为1】

【flag.motor_preparation为1之后四个电机的转速就由thr,pit,yaw,rol来决定,如电机1motor_step[m1] = mc.ct_val_thr +mc.ct_val_yaw -mc.ct_val_rol +mc.ct_val_pit】

【Drv_MotorPWMSet(i,motor[i])在上面的电机转速确定好之后,就由芯片的比较捕获输出对电机的PWM】
*************************************************************************************************/

/*************************************************************************************************
5.Att_1level_Ctrl(2*1e-3f)函数是用来刷新角速度环的值的,刷新的时间比角度环刷新的时间快,因为角速度环是姿态串级PID的内环,要反馈给外环即角度环,所以刷新的时间要比角度环快

【att_1l_ct.exp_angular_velocity[i] = val_2[i].out,目标角速度赋值就是遥控器传过去给到角度环,在输入到角速度环就是目标角速度,也就是你想要控制飞机怎么去飞的一个值】

【att_1l_ct.exp_angular_velocity[ROL] = LIMIT(att_1l_ct.exp_angular_velocity[ROL],-MAX_ROLLING_SPEED,MAX_ROLLING_SPEED),目标角速度限幅是不让给的值不超过界限,这里限幅并没有考虑YAW角】

【att_1l_ct.fb_angular_velocity[ROL] = ( sensor.Gyro_deg[X] ),反馈角速度赋值,这个反馈的值来自于IMU传感器经角速度转换得来的】

【PID_calculate(形参有点多就没写进来),这个函数就是调用PID函数来进行各个角速度的计算得到输出值,也就是控制电机的转速的值】

【mc.ct_val_rol = LIMIT(mc.ct_val_rol,-1000,1000),再经过一个输出量限幅得到(只是拿rol角来举例子)】
************************************************************************************************/

/*************************************************************************************************
6.Att_2level_Ctrl(6e-3f,CH_N)函数是用来刷新角度环的值的,是姿态串级PID的外环,这个分析和角速度环大致差不多,该输入值是摇杆给的期望值加上经内环调节后程序控制反馈的值,之后再经过限幅,PID计算得到最终的输出值,该输出值就是内环角速度环的输入值。(5,6两个串级PID是控制电机的PWM输出的,数据的获取是利用陀螺仪得到的)
*************************************************************************************************/

/*************************************************************************************************
7.float PID_calculate( float dT_s, //周期(单位:秒)
float in_ff, //前馈值
float expect, //期望值(设定值)
float feedback, //反馈值()
_PID_arg_st *pid_arg, //PID参数结构体
_PID_val_st *pid_val, //PID数据结构体
float inte_d_lim, //积分误差限幅
float inte_lim //integration limit,积分限幅 )函数是PID计算函数,这部分的代码需要先了解下相关PID的知识,才能比较容易的接受这部分的代码,有了相关知识后看着部分的代码还是比较容易理解的,这里面有一个很重要的点就是限幅,几乎每个给到的值都会经过限幅再拿去进行计算。
*************************************************************************************************/

/*************************************************************************************************8.Alt_1level_Ctrl(11e-3f)函数是用来刷新高度速度环的值的函数,大致算法和前面的姿态PID差不多,这个传感器使用的加速度计和气压计来得到值的
************************************************************************************************/

/*************************************************************************************************
9.Alt_2level_Ctrl(11e-3f)函数是用来刷新高度环的值的函数,和前面第8点雷同(要说明的是,8,9两个串级PID是用来控制油门的,也就是所谓的定高,高度环是外环,高度速度环是内环)
*************************************************************************************************/

/*************************************************************************************************
10.Ano_LocCtrl.c文件里面是一些传感器的解算以及控制,像GPS,光流,UWB,其中也都用到了PID来对其进行控制
*************************************************************************************************/

/*************************************************************************************************
11.Filter.c文件里面是滤波函数,其中大体用在了哪也不太清楚,只是知道其作用是对一些传感器的数据进行软件滤波,消除噪声,滤波之后的数据再拿去计算
*************************************************************************************************/

/*************************************************************************************************
12.Math.c文件里面是将一些数学计算公式转化成了代码的形式,以便可以直接调用,还有就就是三角函数的值的列表,可以让MCU直接查找,省去了计算的麻烦,节省了CPU的计算时间
*************************************************************************************************/

/*************************************************************************************************
13.其他就是一些底层的驱动等等,由于本人的水平有限,大致就能读懂这么多,还望有大佬能够补充
*************************************************************************************************/


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部