嵌入式系统
概述
嵌入式系统是机器人硬件的核心载体。从微控制器(MCU)到高性能单板计算机(SBC),不同的嵌入式平台承担着从底层电机控制到高层AI推理的各种任务。
MCU vs SBC vs SoC
概念区分
| 类型 |
全称 |
特点 |
代表 |
| MCU |
Microcontroller Unit |
集成CPU+Flash+RAM+外设的单芯片 |
STM32、ESP32 |
| SBC |
Single Board Computer |
完整的计算机系统(板级) |
Raspberry Pi、Jetson |
| SoC |
System on Chip |
集成CPU+GPU+NPU+外设的芯片 |
Tegra Orin、BCM2712 |
详细对比
| 特性 |
MCU (STM32H7) |
SBC (RPi 5) |
SBC (Jetson Orin NX) |
| CPU |
Cortex-M7 @480MHz |
Cortex-A76 @2.4GHz x4 |
Cortex-A78AE @2.0GHz x8 |
| RAM |
1MB SRAM |
4/8GB LPDDR4X |
8/16GB LPDDR5 |
| 存储 |
2MB Flash |
microSD/NVMe |
eMMC/NVMe |
| GPU |
无 |
VideoCore VII |
Ampere 2048核 |
| AI算力 |
无 |
无专用 |
100 TOPS (INT8) |
| 操作系统 |
裸机/RTOS |
Linux |
Linux (JetPack) |
| 功耗 |
<1W |
5-12W |
10-25W |
| 实时性 |
确定性延迟 <1μs |
非实时 ~ms级 |
非实时 ~ms级 |
| 启动时间 |
<100ms |
~20s |
~30s |
| 价格 |
$5-15 |
$60-80 |
$400-600 |
| 典型任务 |
电机控制、传感器采集 |
轻量级视觉、教学 |
AI推理、自主导航 |
STM32(ARM Cortex-M)
STM32系列概览
| 系列 |
核心 |
频率 |
Flash |
RAM |
特色 |
价格 |
| STM32F1 |
Cortex-M3 |
72MHz |
128KB |
20KB |
经典入门 |
$2 |
| STM32F4 |
Cortex-M4 |
168MHz |
1MB |
192KB |
DSP+FPU |
$5 |
| STM32H7 |
Cortex-M7 |
480MHz |
2MB |
1MB |
最高性能MCU |
$10 |
| STM32G4 |
Cortex-M4 |
170MHz |
512KB |
128KB |
电机控制专用 |
$4 |
| STM32L4 |
Cortex-M4 |
80MHz |
1MB |
320KB |
超低功耗 |
$4 |
STM32H7关键外设
STM32H750VBT6 外设资源:
├── 通信接口
│ ├── UART x8 (含LPUART)
│ ├── SPI x6
│ ├── I2C x4
│ ├── CAN FD x2
│ ├── USB OTG HS x1
│ └── Ethernet 10/100 x1
├── 模拟外设
│ ├── ADC x3 (16位, 3.6MSPS)
│ ├── DAC x2 (12位)
│ └── COMP x2
├── 定时器
│ ├── 高级定时器 x2 (电机控制PWM)
│ ├── 通用定时器 x12
│ └── 基本定时器 x2
├── DMA
│ ├── DMA x2 (各8通道)
│ └── MDMA x1 (主DMA)
└── 其他
├── RNG (随机数生成)
├── CRC
└── DCMI (数字相机接口)
HAL库编程示例
// STM32 HAL: 初始化PWM输出(电机控制)
void Motor_PWM_Init(void) {
TIM_HandleTypeDef htim1;
TIM_OC_InitTypeDef sConfigOC;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 167; // 168MHz / 168 = 1MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 999; // 1MHz / 1000 = 1kHz PWM
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim1);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 50% 占空比
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
// 读取编码器(正交解码)
void Encoder_Init(void) {
TIM_HandleTypeDef htim3;
TIM_Encoder_InitTypeDef sConfig;
htim3.Instance = TIM3;
htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 65535;
sConfig.EncoderMode = TIM_ENCODERMODE_TI12; // 4倍频
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
HAL_TIM_Encoder_Init(&htim3, &sConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
}
int32_t get_encoder_count(void) {
return (int16_t)__HAL_TIM_GET_COUNTER(&htim3);
}
开发工具链
| 工具 |
用途 |
说明 |
| STM32CubeMX |
图形化配置 |
引脚分配、时钟树、外设初始化 |
| STM32CubeIDE |
IDE |
基于Eclipse,集成编译调试 |
| Keil MDK |
IDE |
行业标准(收费) |
| PlatformIO |
跨平台开发 |
VSCode插件,支持多种MCU |
| OpenOCD + GDB |
调试 |
开源调试工具 |
| ST-Link V3 |
调试器 |
SWD/JTAG接口 |
ESP32
ESP32系列对比
| 型号 |
CPU |
频率 |
RAM |
WiFi |
BLE |
特色 |
| ESP32 |
Xtensa LX6 x2 |
240MHz |
520KB |
802.11 b/g/n |
4.2 |
经典双核 |
| ESP32-S3 |
Xtensa LX7 x2 |
240MHz |
512KB |
802.11 b/g/n |
5.0 |
AI加速 |
| ESP32-C3 |
RISC-V |
160MHz |
400KB |
802.11 b/g/n |
5.0 |
低成本RISC-V |
| ESP32-C6 |
RISC-V |
160MHz |
512KB |
WiFi 6 |
5.3 |
WiFi 6 |
ESP32在机器人中的应用
ESP32典型用途:
├── WiFi遥控器 (WebSocket/MQTT)
├── BLE传感器节点
├── 低成本运动控制器
├── IoT网关 (传感器数据上传)
└── 辅助处理器 (与Jetson通信)
# MicroPython on ESP32: 简单的WiFi遥控
import network
import socket
from machine import Pin, PWM
# 连接WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('RobotAP', 'password')
# PWM控制电机
motor_pwm = PWM(Pin(25), freq=1000, duty=0)
# 简单HTTP服务器接收控制命令
s = socket.socket()
s.bind(('', 80))
s.listen(1)
while True:
conn, addr = s.accept()
request = conn.recv(1024).decode()
if '/forward' in request:
motor_pwm.duty(512) # 50%占空比
elif '/stop' in request:
motor_pwm.duty(0)
conn.close()
Raspberry Pi 5
规格
| 特性 |
参数 |
| SoC |
BCM2712 |
| CPU |
Cortex-A76 x4 @2.4GHz |
| GPU |
VideoCore VII @800MHz |
| 内存 |
4/8GB LPDDR4X-4267 |
| 存储 |
microSD / NVMe (via HAT) |
| 视频输出 |
2x micro-HDMI (4Kp60) |
| 相机 |
2x CSI-2 (4 lanes) |
| GPIO |
40-pin Header |
| USB |
2x USB 3.0 + 2x USB 2.0 |
| 网络 |
千兆以太网 + WiFi 5 + BLE 5.0 |
| PCIe |
1x PCIe 2.0 (via FPC) |
| 功耗 |
5V/5A (27W max) |
| 价格 |
$60 (4GB) / $80 (8GB) |
适合的机器人场景
- 教学和原型开发
- 轻量级视觉处理(OpenCV)
- ROS2学习平台
- 不需要GPU加速AI的项目
Raspberry Pi的局限
- 无专用AI加速器(纯CPU推理很慢)
- 内存与GPU共享
- 非实时系统(不适合精确电机控制)
- 散热受限(需要主动散热)
NVIDIA Jetson Orin系列
产品线对比
| 特性 |
Orin Nano |
Orin NX 8GB |
Orin NX 16GB |
AGX Orin 32GB |
AGX Orin 64GB |
| CPU核心 |
6x A78AE |
6x A78AE |
8x A78AE |
12x A78AE |
12x A78AE |
| GPU核心 |
1024 CUDA |
1024 CUDA |
2048 CUDA |
2048 CUDA |
2048 CUDA |
| Tensor核心 |
32 |
32 |
64 |
64 |
64 |
| DLA |
1 |
1 |
2 |
2 |
2 |
| AI算力(INT8) |
40 TOPS |
70 TOPS |
100 TOPS |
200 TOPS |
275 TOPS |
| 内存 |
8GB |
8GB |
16GB |
32GB |
64GB |
| 内存带宽 |
68 GB/s |
68 GB/s |
102 GB/s |
204 GB/s |
204 GB/s |
| 功耗 |
7-15W |
10-20W |
10-25W |
15-40W |
15-60W |
| 价格 |
~$200 |
~$400 |
~$600 |
~$1000 |
~$1600 |
JetPack软件栈
JetPack SDK:
├── Linux for Tegra (L4T)
│ ├── Ubuntu 22.04
│ ├── NVIDIA驱动
│ └── BSP (Board Support Package)
├── CUDA Toolkit 12.x
├── cuDNN 8.x
├── TensorRT 8.x
├── VPI (Vision Programming Interface)
├── Multimedia API
│ ├── libargus (CSI相机)
│ ├── GStreamer + nvvidconv
│ └── V4L2
├── DeepStream SDK
└── Isaac ROS
选型指南
graph TD
A[机器人AI需求] --> B{目标检测精度要求?}
B -->|YOLOv8n够用| C{预算?}
B -->|需要大模型| D{需要多模型并行?}
C -->|<$300| E[Orin Nano 8GB]
C -->|<$600| F[Orin NX 8GB]
D -->|否| G[Orin NX 16GB]
D -->|是| H[AGX Orin 32GB]
style E fill:#c8e6c9
style F fill:#a5d6a7
style G fill:#81c784
style H fill:#66bb6a
RTOS vs Linux
RTOS(实时操作系统)
| RTOS |
特点 |
许可 |
典型平台 |
| FreeRTOS |
轻量、社区大 |
MIT |
STM32、ESP32 |
| Zephyr |
现代、模块化 |
Apache 2.0 |
nRF、STM32 |
| RT-Thread |
国产、组件丰富 |
Apache 2.0 |
STM32、RISC-V |
| ChibiOS |
超小内核 |
GPL/商业 |
STM32 |
RTOS关键概念
// FreeRTOS: 创建任务
void motor_control_task(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount();
const TickType_t xPeriod = pdMS_TO_TICKS(1); // 1ms周期
while (1) {
// 读取编码器
int32_t position = get_encoder_count();
// PID计算
float output = pid_compute(target, position);
// 设置PWM
set_motor_pwm(output);
// 精确延时到下一个周期
vTaskDelayUntil(&xLastWakeTime, xPeriod);
}
}
// 创建任务(最高优先级)
xTaskCreate(motor_control_task, "MotorCtrl",
256, NULL, configMAX_PRIORITIES-1, NULL);
RTOS vs Linux对比
| 特性 |
RTOS (FreeRTOS) |
Linux |
| 调度延迟 |
<10μs(确定性) |
~ms级(不确定) |
| 内存占用 |
~10KB |
~200MB |
| 启动时间 |
<100ms |
~10-30s |
| 文件系统 |
可选(FatFS) |
完整(ext4等) |
| 网络栈 |
可选(lwIP) |
完整(TCP/IP) |
| 驱动支持 |
有限 |
极丰富 |
| 包管理 |
无 |
apt/pip |
| GUI |
无/LVGL |
完整桌面 |
| AI框架 |
无 |
PyTorch/TensorFlow |
混合架构
机器人系统通常采用MCU + SBC混合架构:
┌────────────────┐ UART/CAN ┌────────────────┐
│ Jetson Orin │◄──────────────►│ STM32H7 │
│ (Linux+ROS2) │ │ (FreeRTOS) │
│ │ │ │
│ - AI推理 │ │ - 电机PID控制 │
│ - 路径规划 │ │ - 编码器读取 │
│ - 视觉感知 │ │ - IMU数据采集 │
│ - SLAM │ │ - PWM输出 │
│ - 通信 │ │ - 急停处理 │
└────────────────┘ └────────────────┘
参见:串口与I2C/SPI 了解MCU与SBC之间的通信接口。
开发流程
嵌入式开发标准流程
graph LR
A[需求分析] --> B[平台选型]
B --> C[原理图设计]
C --> D[PCB布局]
D --> E[固件开发]
E --> F[硬件调试]
F --> G[系统测试]
G --> H[量产]
调试工具
| 工具 |
用途 |
接口 |
| SWD/JTAG调试器 |
单步调试、断点 |
ST-Link / J-Link |
| 逻辑分析仪 |
协议分析(SPI/I2C/UART) |
Saleae / DSLogic |
| 示波器 |
信号波形观察 |
Rigol / Siglent |
| 串口终端 |
打印调试信息 |
minicom / PuTTY |
| GDB |
远程调试 |
OpenOCD + GDB |
小结
- MCU用于实时控制,SBC用于AI和复杂计算
- STM32H7是机器人MCU的首选(高性能、丰富外设)
- ESP32适合WiFi/BLE通信和低成本应用
- Jetson Orin系列覆盖40-275 TOPS的AI算力需求
- RTOS保证确定性延迟,Linux提供丰富生态
- MCU + SBC混合架构是最佳实践
参考资料