对于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识别是属于何种数据。
也就是如下几种数据(功能),基本看名字也可以猜测出他的意思
- DOWN_COMMAND
如图,基本没怎么用到他的复杂功能,也就一个解锁/锁定飞控
- D_ACK_READ_PID 读取PID参数
- D_ACK_RESET_PARAM 恢复默认参数
- DOWN_RCDATA
- DOWN_POWER nrf51822+电源
- DOWN_REMOTER 遥控器
比较重要的部分是他在线调试pid的功能
如下