Robotics - Embedding篇
上位机 / 工控机 -> 通信总线 -> stm32 / 伺服控制器 -> 电机/编码器
上层控制程序
↓
ROS / LeRobot / 自己写的代码
↓
SocketCAN / 厂商 CAN SDK
↓
CAN 总线
↓
电机驱动器 1
电机驱动器 2
电机驱动器 3
...
↓
电机
总线->
can -> 通讯总线 / 协议
代码 -> 调用厂商sdk -> sdk收发can
pcan -> pc 与 can直接的硬件/软件工具
stm32 -> mcu控制器
free rtos 高实时性的rtos, 比如你需要200 hz的去控制, 反馈, 采样, 那就需要这个东西, 比起linux没有那么多的多线程调度, interrupt, 之类的
command: 让关节旋转到35度
todo: 这个block可能用那个回比较好, mermaid
用户/程序
↓
ROS2 / Robot Controller
↓
Trajectory Planner
↓
Joint Controller
↓
EtherCAT / CAN
↓
Servo Drive / STM32
↓
Motor
↓
Encoder
↑
反馈一路返回
串口(Serial Port)
一种通信方式, 常见的比如uart, 数据不是很多一起传, 而是一位一位按顺序传. 最简单的uart 比如有, 发送(TX) 接收(RX) GND
寄存器 (register)
- 寄存器:桌面上正在处理的几张纸
- RAM:旁边的文件柜
- Flash:长期保存资料的仓库
- CPU 运算单元:负责计算的人
cpu / mcu 里的一小块 芯片内部速度最快的一小块存储空间.
外设寄存器
通常用途:
- 状态寄存器:硬件写,CPU 读
- UART 接收到数据了吗? CAN 是否发生错误? GPIO 引脚现在是高还是低?
- 控制寄存器:CPU 写,硬件执行
bit 0 = 1 → 开启 UART bit 1 = 1 → 开启接收中断 bit 2 = 1 → 开启自动重传
- 数据寄存器:在 CPU 和外设之间传数据
CPU 把 0x41 写入 UART 数据寄存器 → UART 发送字符 A
CPU 寄存器 用途不固定,数值不断变化
int c = a + b;
R0 ← a
R1 ← b
R2 ← R0 + R1
有些寄存器的用途也是固定的
PC:下一条指令的位置SP:栈顶位置- 状态寄存器:记录是否为零、是否溢出等
- 部分控制寄存器:控制中断和处理器工作模式