第二章:系统架构概览——SADA的机械、电气与软件子系统划分及接口定义

各位同学,咱们今天聊聊SADA的系统架构。说白了,就是搞清楚太阳翼驱动机构这个大家伙,到底由哪几块拼起来的,它们之间怎么说话、怎么配合。

我个人习惯,拿到一个复杂系统,先画三张图:机械结构图、电气连接图、软件状态机图。这三张图一出来,整个系统的脉络就清晰了。今天咱们就按这个思路来拆解SADA。

2.1 三大子系统:机械、电气、软件

SADA(Solar Array Drive Assembly)不是一块铁疙瘩,它是一个典型的机电一体化产品。我把它分成三个子系统:

  • 机械子系统:负责“动”。包括电机、减速器、轴承、壳体、滑环等。它把电能转化成机械能,驱动太阳翼旋转。
  • 电气子系统:负责“传”。包括电机驱动电路、位置传感器接口、功率传输滑环、信号传输滑环、电源模块等。它把指令变成电流,把位置变成电压。
  • 软件子系统:负责“控”。包括驱动控制算法、故障诊断、通信协议、状态管理等。它运行在微控制器上,是系统的“大脑”。

你想想看,这三个子系统缺一不可。机械坏了,太阳翼转不动;电气坏了,信号传不过去;软件坏了,整个系统就“死机”了。我在项目中遇到过,有一次软件跑飞了,电机还在转,但位置反馈丢了,差点把太阳翼拧成麻花。嗯,从那以后我对软件健壮性特别敏感。

2.2 机械子系统核心部件与接口

机械部分,我重点关注两个接口:功率接口运动接口

部件功能接口定义
步进电机/无刷直流电机提供驱动力矩机械轴输出,法兰安装面
谐波减速器/行星减速器降低转速、增大扭矩输入轴接电机,输出轴接太阳翼
导电滑环传输功率和信号定子端接卫星平台,转子端接太阳翼
角度传感器(旋变/编码器)反馈当前位置机械耦合到电机轴或输出轴

这里有个坑,我提醒一下:滑环的寿命。我曾经在项目验收时发现,滑环在真空环境下磨损比预期快得多。后来查原因,是润滑剂选型不对。所以,机械接口的选型一定要考虑空间环境——真空、冷热交变、辐照。

避坑指南: 我曾经因为减速器回差没控制好,导致太阳翼定位精度超标。后来在机械接口文档里明确写了“回差≤0.05°”,并且要求出厂前逐台测试。这个指标直接影响控制系统的稳定性。

2.3 电气子系统核心模块与信号接口

电气部分,说白了就是“怎么把指令变成电流,再把位置变成数字”。

我习惯把电气接口分成三类:

  1. 功率接口:电机供电(通常是28V或42V母线),电流可达几安培。注意,这里要加EMI滤波,否则电机噪声会污染整星电源。
  2. 信号接口:包括旋变激励/反馈信号、霍尔传感器信号、温度传感器信号。这些是模拟小信号,容易受干扰。我建议用差分传输,并且屏蔽层单点接地。
  3. 通信接口:通常是CAN总线或RS-422。指令和遥测都走这里。通信协议要定义清楚——帧格式、校验方式、超时重传机制。

举个例子,电机驱动电路的核心是H桥或三相逆变桥。我一般用集成驱动芯片,比如DRV8332或者TI的智能栅极驱动器。但要注意,驱动芯片的散热设计不能马虎。我记得有一次,驱动芯片温度飙到120°C,直接触发过温保护,电机停转了。后来加了导热硅脂和铝基板,问题才解决。

关键接口定义示例(CAN总线):
// 指令帧格式(8字节数据域)
Byte0: 指令ID (0x01=位置模式, 0x02=速度模式)
Byte1-2: 目标位置/速度 (高字节在前)
Byte3: 加速度/减速度
Byte4: 校验和 (Byte0~Byte3的异或)
Byte5-7: 保留 (填0x00)

// 遥测帧格式(8字节数据域)
Byte0-1: 当前角度 (0.01°/LSB)
Byte2-3: 当前速度 (0.1°/s/LSB)
Byte4: 状态标志 (bit0=故障, bit1=限位, bit2=温度过高)
Byte5: 温度 (0.5°C/LSB, 偏移量-40°C)
Byte6-7: 保留

2.4 软件子系统架构与任务划分

软件部分,我把它分成三个层次:

  • 底层驱动层:直接操作寄存器。包括PWM生成、ADC采样、CAN收发器配置、GPIO控制。这一层要尽量精简,我一般用状态机实现,不用RTOS。
  • 中间控制层:实现控制算法。比如PID位置环、速度环、电流环。还有故障检测逻辑——过流、过温、堵转、通信超时。
  • 应用管理层:处理指令、管理状态机、记录遥测。这一层可以跑一个轻量级RTOS,比如FreeRTOS,任务优先级要设计好。

你想想看,这三个层次之间怎么通信?我建议用全局结构体,而不是函数参数传递。因为实时性要求高,函数调用开销太大。比如:

// 全局数据交换区
typedef struct {
    uint16_t target_angle;      // 目标角度,单位0.01°
    uint16_t current_angle;     // 当前角度,单位0.01°
    int16_t  target_speed;      // 目标速度,单位0.1°/s
    int16_t  current_speed;     // 当前速度,单位0.1°/s
    uint8_t  fault_flags;       // 故障标志位
    uint8_t  mode;              // 当前模式:0=待机,1=位置,2=速度
} SADA_Data_t;

volatile SADA_Data_t g_sada_data;  // 注意加volatile
个人经验: 我习惯在软件里加一个“看门狗”任务,每100ms检查一次g_sada_data的合理性。比如当前角度变化率超过物理极限,就立刻报错并切换到安全模式。这个机制救过我一次——有一次传感器线缆虚接,角度跳变,看门狗及时切断了电机供电。

2.5 子系统间的接口定义总结

好了,咱们把三个子系统的接口串起来,画一张逻辑图:

接口方向机械→电气电气→软件软件→电气电气→机械
信号内容位置(旋变/编码器)
温度(热敏电阻)
ADC采样值
CAN接收中断
PWM占空比
CAN发送指令
电机电流
滑环功率
接口形式模拟电压/脉冲SPI/并行总线GPIO/PWM定时器功率线缆
关键参数分辨率≥12bit
采样率≥1kHz
通信速率≥1Mbps
延迟≤1ms
PWM频率20kHz
死区时间≥500ns
额定电流≥2A
耐压≥50V

这里我要强调一点:接口定义一定要写在文档里,并且版本受控。我见过太多项目,电气工程师和软件工程师各画各的图,结果联调时发现信号极性反了、通信波特率对不上。说白了,接口就是“契约”,谁都不能随便改。

血的教训: 我曾经在一个项目里,机械工程师把旋变的零位装反了180°,电气工程师没发现,软件工程师按正常逻辑写代码。结果一上电,太阳翼就往反方向转,差点撞到卫星本体。从那以后,我要求每个接口都要做“交叉检查”——机械出图,电气确认,软件仿真验证。

2.6 小结

这一章咱们把SADA的三大子系统拆开了。机械负责“动”,电气负责“传”,软件负责“控”。接口是它们之间的“桥梁”,定义得越清晰,后面的联调就越顺利。

下一章,咱们会深入机械子系统的设计细节,重点讲电机选型和减速器匹配。到时候我会分享一个真实的选型计算案例,包括我踩过的坑。嗯,敬请期待。