一、星载计算机概述:卫星平台架构、星载计算机功能、遥测遥控基本概念

各位同学,咱们今天聊聊星载计算机。说实话,这玩意儿看着跟咱们桌面上的电脑长得差不多,但骨子里完全是两码事。我当年第一次接触星载计算机时,心里还嘀咕:这不就是个加固版的单片机吗?后来真上手了,才发现坑多着呢。

1.1 卫星平台架构——你得先知道卫星长啥样

卫星这东西,说白了就是一个在太空中工作的机器人。它得自己发电、自己保暖、自己跟地面打电话。整个卫星通常分成两大部分:有效载荷卫星平台

  • 有效载荷:就是卫星干活的家伙。比如相机、通信天线、科学仪器。这部分是卫星存在的意义。
  • 卫星平台:伺候有效载荷的。供电、温控、姿态控制、数据管理,全归它管。

我习惯把卫星平台比作一个"管家"。管家得管电、管水、管温度,还得管跟外界通信。星载计算机就是这个管家的"大脑"。

卫星平台一般包含这几个分系统:

分系统 干啥的 跟星载计算机的关系
电源分系统 太阳能帆板+蓄电池,提供能源 计算机得监控电压电流,必要时切电源
姿轨控分系统 控制卫星姿态和轨道 计算机要跑姿态算法,控制飞轮和推力器
热控分系统 保持卫星内部温度合适 计算机采集温度数据,控制加热器
测控分系统 跟地面站通信 计算机负责打包遥测数据,解析遥控指令
数据管理分系统 存储和分发数据 这就是星载计算机的核心地盘

嗯,这里要注意:不同卫星的架构差异很大。小卫星可能把好几个功能塞进一个芯片里,大卫星则是一堆板卡插在背板上。我做过一个项目,卫星就鞋盒子那么大,星载计算机用的还是ARM Cortex-M4。你想想看,资源就那么点,代码得精打细算到每个字节。

1.2 星载计算机的功能——它到底干哪些活?

星载计算机,全称叫"星载数据管理计算机",英文缩写OBDH(On-Board Data Handling)。它的核心任务就三个字:管数据

具体来说,它要干这些事:

  1. 采集遥测数据:温度、电压、电流、姿态角……所有传感器数据都得收上来。
  2. 处理遥控指令:地面发来的指令,得解析、校验、执行。
  3. 管理任务调度:什么时候该拍照,什么时候该传数据,都得按时间表来。
  4. 故障诊断与恢复:出问题了怎么办?计算机得自己判断,自己切备份。
  5. 时间管理:卫星上的时间必须精确,不然数据对不上。

我记得有一次,卫星在轨运行了半年,突然温度数据跳变。地面分析了好久,最后发现是星载计算机的ADC采样时序出了问题。你看,这种问题在地面测试时很难复现,上了天就暴露了。

核心要点:星载计算机不是"快"就行的。它要的是可靠确定可预测。我见过有人把Linux塞进星载计算机里,结果任务调度延迟不稳定,最后不得不换回RTOS。

1.3 遥测遥控基本概念——卫星跟地面怎么说话?

遥测遥控,英文叫TM/TC(Telemetry/Telecommand)。说白了就是:

  • 遥测(TM):卫星往地面发数据。告诉地面"我还活着,我状态挺好"。
  • 遥控(TC):地面往卫星发指令。告诉卫星"你该干活了"。

为什么会分成两个方向?因为通信链路是单向的。卫星发射功率有限,地面站发射功率大,所以上下行链路的设计完全不同。

遥测数据长什么样?我举个例子:

// 一个典型的遥测帧结构
typedef struct {
    uint8_t  sync_word[2];    // 同步头,0xEB90
    uint16_t frame_length;    // 帧长度
    uint8_t  frame_type;      // 帧类型:0x01=常规遥测
    uint32_t timestamp;       // 时间戳,从复位开始计数
    uint8_t  data[128];       // 遥测数据区
    uint16_t crc;             // CRC校验
} TelemetryFrame;

你看,每个遥测帧都有同步头、长度、类型、时间戳、数据和校验。地面站收到后,先找同步头,再校验CRC,最后解析数据。我当年调试时,经常因为CRC算法写错了,地面站死活不认数据。后来学乖了,直接用CCSDS标准里的CRC-16-CCITT。

遥控指令呢?结构类似,但更简洁:

// 遥控指令结构
typedef struct {
    uint8_t  sync_word[2];    // 同步头,0x1A2B
    uint8_t  cmd_id;          // 指令ID
    uint8_t  cmd_len;         // 参数长度
    uint8_t  params[8];       // 参数区
    uint16_t crc;             // CRC校验
} TelecommandFrame;

个人经验:我建议在遥控指令里加一个"执行确认"机制。地面发指令后,卫星先回复"收到",再回复"执行结果"。这样地面就知道指令到底执行了没有。我曾经遇到过指令发了,卫星也回复了,但实际没执行——因为指令参数校验没通过,代码里忘了返回错误码。

1.4 避坑指南——新手最容易犯的错

做星载计算机的遥测遥控协议,有几个坑我踩过,你们记一下:

  • 别用动态内存分配:malloc在太空里是定时炸弹。内存碎片、分配失败,哪个都受不了。
  • 注意字节序:地面站可能是x86(小端),星载计算机可能是ARM(大端或小端)。协议里必须明确字节序。
  • CRC校验不能省:太空中有单粒子翻转,比特可能自己跳变。没有CRC,你收到的数据可能是错的。
  • 指令要有超时机制:卫星可能正在忙,没空理你。指令队列满了怎么办?得有个超时丢弃策略。

警告:我曾经见过一个项目,遥测协议里没考虑"帧重叠"的情况。卫星连续发帧,地面站接收时如果同步头丢失,后面的数据全乱了。解决方案是在帧头加个"帧序号",地面站发现序号不连续就知道丢帧了。

1.5 小结——这一章你该记住什么?

好了,这一章的内容就这些。咱们总结一下:

  • 卫星平台由多个分系统组成,星载计算机是数据管理的核心。
  • 星载计算机要采集遥测、处理遥控、管理任务、诊断故障。
  • 遥测是卫星→地面,遥控是地面→卫星,两者协议不同。
  • 协议设计要关注可靠性、确定性和健壮性。

下一章,咱们会深入讲遥测协议的具体设计,包括帧格式、编码方式、分包策略。到时候我会拿一个实际项目的代码出来,咱们一行一行地分析。嗯,今天就到这儿,有问题随时问我。