minifly_v1.3学习笔记(四) atkp.c

对于atkp.c通过前面的“minifly_v1.3学习笔记(二)radiolinkTask”已经简单介绍过了。
因此,这篇就不再介绍atkp的格式、原理了,仅对任务相关的介绍。

在atkp.c中包含两个任务:
atkpRxAnlTask:ATKP 数据包接收处理任务。该任务主要是处理遥控器和上位机发下 来的数据包,解析到的控制指令则发送到 stabilizerTask 中去。
atkpTxTask:ATKP 数据包发送任务。该任务主要是获取 stabilizerTask 中的传感器数据、 姿态数据、电机 PWM 输出数据等数据以定周期发送给 radiolinkTask 和 usblinkTxTask,由这 两个任务分别发送飞遥控器和上位机。

如图,atkp.c这个文件的大头也就是各种把数据按匿名上位机的格式转换,以便用户的调试
在这里插入图片描述

atkpTxTask

数据返回周期
如下这是atkp.c处理的各种数据,以及更新的时间
在这里插入图片描述
定时发送依赖这个函数完成
在这里插入图片描述
我们以第一个分支——PERIOD_STATUS为例

if(!(count_ms % PERIOD_STATUS))			//30ms
	{
		attitude_t attitude;   //结构体=时间戳+欧拉角
		getAttitudeData(&attitude);
		int baroData = getBaroData();//气压计
		sendStatus(attitude.roll, attitude.pitch, attitude.yaw, baroData, 0, flyable);			
	}

这是一个获取并发送欧拉角信息的函数。在前面的分析中,可知,对于姿态信息的结算,数据是存在stabilizer.c这个文件中的。于是对getAttitudeData(&attitude),他的作用也就是将数据复制到attitude中,而对于sendStatus这个函数,他也就是对数据按照格式保存发送,如图

void getAttitudeData(attitude_t* get)
{
	get->pitch = -state.attitude.pitch;
	get->roll = state.attitude.roll;
	get->yaw = -state.attitude.yaw;
}

在这里插入图片描述
TX的部分也就这些了,我们看一下他的任务函数,果然也没有什么东西,比较简单

void atkpTxTask(void *param)
{
	sendMsgACK();
	while(1)
	{
		atkpSendPeriod();
		vTaskDelay(1);
	}
}

atkpRxAnlTask

下面是RX的部分,也就是接收上位机信息的函数。用过匿名上位机的都应该知道,匿名上位机是可以向飞控发送一些控制命令的,比如校准陀螺仪,解锁飞控等等,当然,最厉害的莫过于在线调pid,这样省去了一遍遍烧录程序的时间,尤其对于通过使用es8266进行无线调参,更是好用到无敌。他的原理是把pid数据写入ram来实现的。对于匿名上位机的在线调参,我会在另一篇中给出。

void atkpRxAnlTask(void *param)
{
	atkp_t p;
	while(1)
	{
		xQueueReceive(rxQueue, &p, portMAX_DELAY);
		atkpReceiveAnl(&p);
	}
}

任务函数,还是比较简单的,会死等rxQueue有数据,并将它读取出存到p中,再进一步处理。
我们来看一下atkpReceiveAnl(&p)这个函数。
在这里插入图片描述
按照匿名数据包的格式,先是对msgID识别是属于何种数据。
也就是如下几种数据(功能),基本看名字也可以猜测出他的意思
在这里插入图片描述

  1. DOWN_COMMAND
    如图,基本没怎么用到他的复杂功能,也就一个解锁/锁定飞控
    在这里插入图片描述
  2. D_ACK_READ_PID 读取PID参数
  3. D_ACK_RESET_PARAM 恢复默认参数
  4. DOWN_RCDATA
  5. DOWN_POWER nrf51822+电源
  6. DOWN_REMOTER 遥控器

比较重要的部分是他在线调试pid的功能
如下
在这里插入图片描述

发布了21 篇原创文章 · 获赞 2 · 访问量 2845

猜你喜欢

转载自blog.csdn.net/lalala12ll/article/details/102866681