前言
在工业自动化、机器人技术和智能装备领域,关节电机作为核心执行部件,其性能直接决定了整个系统的精度、响应速度和可靠性。传统的关节电机控制系统多采用 EtherCAT 或工业以太网作为通信总线,虽然具有高带宽和低延迟的优势,但在成本、布线复杂度和抗干扰能力方面存在一定局限性。同时,主流的编码器方案如光电编码器和磁编码器在恶劣环境下的稳定性和寿命也面临挑战。
本文将详细介绍一种基于 STM32G47x 微控制器、CAN FD 通信总线和电感式编码器的 100W 关节电机双环 PID 控制系统的完整设计与实现过程。我们将从技术选型、硬件设计、软件架构、算法实现到系统测试进行全方位的剖析,力求内容通俗易懂,同时保持技术的深度和严谨性。帮助读者全面掌握这一技术方案的核心要点和实现细节。
第 1 章 技术选型与系统总体设计
1.1 项目背景与需求分析
1.1.1 关节电机控制系统的发展现状
关节电机是机器人、自动化生产线和智能装备中最关键的执行元件之一。随着工业 4.0 和智能制造的快速发展,对关节电机控制系统的要求越来越高,主要体现在以下几个方面:
- 高精度:要求位置控制精度达到角秒级,速度控制精度达到 0.1% 以内
- 高响应速度:要求系统带宽达到 1kHz 以上,能够快速响应指令变化
- 高可靠性:能够在高温、高湿、强振动和电磁干扰等恶劣环境下稳定工作
- 低成本:在满足性能要求的前提下,尽可能降低系统成本
- 小型化:要求控制系统与电机本体高度集成,减小体积和重量
目前市场上主流的关节电机控制系统主要采用以下几种技术方案:
- EtherCAT 总线 + DSP/FPGA 主控 + 光电编码器:性能最高,但成本也最高,布线复杂
- RS485 总线 + ARM Cortex-M3/M4 主控 + 磁编码器:成本较低,但通信速度和抗干扰能力有限
- CAN 总线 + ARM Cortex-M4 主控 + 磁编码器:平衡了性能和成本,是目前应用最广泛的方案
1.1.2 传统方案的局限性分析
虽然传统的 EtherCAT 和以太网方案在性能上具有优势,但在很多应用场景中也存在明显的局限性:
- 成本高昂:EtherCAT 主站和从站控制器的价格较高,同时需要专用的以太网交换机和电缆
- 布线复杂:以太网电缆需要严格的屏蔽和接地处理,布线成本和难度较高
- 抗干扰能力差:以太网信号容易受到电磁干扰,在工业环境中需要采取额外的防护措施
- 实时性依赖网络拓扑:EtherCAT 的实时性虽然很高,但在复杂网络拓扑下会受到影响
- 开发难度大:EtherCAT 协议栈复杂,开发周期长,需要专业的技术团队
同样,传统的光电编码器和磁编码器也存在一些问题:
- 光电编码器:对灰尘、水汽和振动敏感,寿命较短,成本较高
- 磁编码器:容易受到外部磁场干扰,精度和稳定性受到影响
1.1.3 本项目的技术需求
针对传统方案的局限性,本项目提出了以下技术需求:
| 需求类别 | 具体指标 | 说明 |
|---|---|---|
| 电机参数 | 额定功率:100W额定电压:24V DC额定电流:5A额定转速:3000rpm峰值扭矩:1N・m | 典型的小型关节电机参数 |
| 控制性能 | 位置控制精度:±0.1°速度控制精度:±1rpm系统带宽:≥500Hz响应时间:≤2ms | 满足大多数工业机器人和自动化设备的要求 |
| 通信性能 | 通信速率:最高 8Mbps最大节点数:32通信周期:≤1ms支持实时数据传输 | 满足多关节协同控制的要求 |
| 环境适应性 | 工作温度:-40℃~+85℃抗振动:10g@10~2000Hz抗冲击:50g@11ms防护等级:IP65 | 适应恶劣的工业环境 |
| 成本要求 | 单轴控制器成本:≤150 元人民币 | 相比 EtherCAT 方案降低 50% 以上 |
| 集成度要求 | 控制器与电机本体高度集成,体积≤50×50×20mm | 减小系统体积和重量 |
1.2 核心技术选型
1.2.1 通信总线选型:CAN FD vs 传统 CAN vs EtherCAT vs 以太网
通信总线是关节电机控制系统的 "神经中枢",负责传输控制指令和反馈数据。我们对目前主流的几种通信总线进行了详细的对比分析:
| 技术指标 | CAN FD | 传统 CAN | EtherCAT | 工业以太网 |
|---|---|---|---|---|
| 最高通信速率 | 8Mbps(数据段) | 1Mbps | 100Mbps | 100Mbps/1Gbps |
| 最大数据帧长度 | 64 字节 | 8 字节 | 1486 字节 | 1500 字节 |
| 实时性 | 高(≤1ms) | 中(≤5ms) | 极高(≤100μs) | 中(≤10ms) |
| 抗干扰能力 | 极强(差分信号) | 极强(差分信号) | 中(差分信号但频率高) | 中(差分信号但频率高) |
| 布线复杂度 | 低(双绞线) | 低(双绞线) | 中(专用以太网电缆) | 中(专用以太网电缆) |
| 节点数 | 32(标准) | 32(标准) | 65535 | 理论上无限制 |
| 硬件成本 | 低(STM32 内置) | 低(STM32 内置) | 高(专用控制器) | 中(以太网 PHY) |
| 软件复杂度 | 中 | 低 | 高 | 中 |
| 开发周期 | 短(1~2 个月) | 短(1 个月) | 长(3~6 个月) | 中(2~3 个月) |
| 工业应用成熟度 | 高(2012 年推出) | 极高(1986 年推出) | 高(2003 年推出) | 高 |
从对比结果可以看出,CAN FD 在性能、成本和开发难度之间取得了很好的平衡:
- 相比传统 CAN,CAN FD 将数据段的最高速率提高到了 8Mbps,最大数据帧长度增加到了 64 字节,大大提高了通信带宽
- 相比 EtherCAT 和工业以太网,CAN FD 的硬件成本更低,布线更简单,抗干扰能力更强
- CAN FD 完全兼容传统 CAN 协议,可以平滑升级现有系统
因此,本项目选择 CAN FD 作为通信总线。
1.2.2 主控处理器选型:STM32G47x vs 其他 ARM 微控制器
主控处理器是关节电机控制系统的 "大脑",负责执行控制算法、处理通信数据和驱动功率电路。我们对目前市场上主流的几款适合电机控制的 ARM 微控制器进行了对比分析:
| 技术指标 | STM32G474RET6 | STM32F407VET6 | STM32H743VIT6 | NXP LPC55S69 | TI MSP432P401R |
|---|---|---|---|---|---|
| 内核 | Cortex-M4F @ 170MHz | Cortex-M4F @ 168MHz | Cortex-M7 @ 400MHz | Cortex-M33 @ 150MHz | Cortex-M4F @ 48MHz |
| Flash | 512KB | 512KB | 2MB | 640KB | 256KB |
| RAM | 128KB | 192KB | 1MB | 320KB | 64KB |
| 高级定时器 | 2 个(16 位,互补输出) | 2 个(16 位,互补输出) | 4 个(16/32 位,互补输出) | 2 个(16 位,互补输出) | 2 个(16 位,互补输出) |
| ADC | 3 个 12 位 ADC,5Msps,37 通道 | 3 个 12 位 ADC,2.4Msps,24 通道 | 3 个 16 位 ADC,36Msps,36 通道 | 2 个 16 位 ADC,5Msps,16 通道 | 1 个 14 位 ADC,1Msps,20 通道 |
| DAC | 4 个 12 位 DAC | 2 个 12 位 DAC | 2 个 12 位 DAC | 2 个 12 位 DAC | 2 个 12 位 DAC |
| CAN FD | 2 个(内置) | 2 个传统 CAN | 2 个传统 CAN | 2 个 CAN FD | 无 |
| 运算加速器 | CORDIC+FMAC | 无 | 无 | 无 | 无 |
| 工作温度 | -40℃~+125℃ | -40℃~+85℃ | -40℃~+85℃ | -40℃~+105℃ | -40℃~+85℃ |
| 封装 | LQFP64 | LQFP100 | LQFP100 | LQFP64 | LQFP64 |
| 价格(批量) | ~25 元 | ~20 元 | ~50 元 | ~30 元 | ~15 元 |
从对比结果可以看出,STM32G474RET6 是最适合本项目的选择:
- 内置 2 个 CAN FD 控制器,无需外部 PHY 芯片,大大降低了硬件成本和复杂度
- 集成了 CORDIC 和 FMAC 硬件加速器,可以显著提高三角函数和矩阵运算的速度,非常适合电机控制算法
- 具有 3 个高速 ADC,可以同时采样三相电流和母线电压,提高电流采样的精度和同步性
- 工作温度范围宽达 - 40℃~+125℃,能够适应恶劣的工业环境
- 性价比高,在满足性能要求的前提下,价格相对较低
1.2.3 编码器选型:电感式编码器 vs 光电编码器 vs 磁编码器
编码器是关节电机控制系统的 "眼睛",负责检测电机的位置和速度。我们对目前主流的几种编码器技术进行了详细的对比分析:
| 技术指标 | 电感式编码器 | 光电编码器 | 磁编码器 |
|---|---|---|---|
| 工作原理 | 利用电磁感应原理检测金属目标的位置 | 利用光电效应检测光栅的位置 | 利用霍尔效应检测磁场的位置 |
| 分辨率 | 最高 23 位(单圈) | 最高 24 位(单圈) | 最高 19 位(单圈) |
| 精度 | ±0.1°~±0.5° | ±0.01°~±0.1° | ±0.1°~±1° |
| 抗干扰能力 | 极强(不受灰尘、水汽、振动和磁场影响) | 差(对灰尘、水汽和振动敏感) | 中(容易受到外部磁场干扰) |
| 寿命 | 极长(无接触,无磨损) | 中(有机械磨损) | 长(无接触,无磨损) |
| 工作温度 | -40℃~+150℃ | -20℃~+85℃ | -40℃~+125℃ |
| 响应速度 | 高(≤1μs) | 高(≤1μs) | 中(≤10μs) |
| 安装要求 | 低(允许较大的安装公差) | 高(安装公差要求严格) | 中(安装公差要求较严格) |
| 成本 | 中 | 高 | 低 |
| 体积 | 小 | 大 | 小 |
从对比结果可以看出,电感式编码器在恶劣环境下的适应性和可靠性方面具有明显的优势:
- 不受灰尘、水汽、油污和振动的影响,非常适合工业环境
- 不受外部磁场的干扰,解决了磁编码器的固有缺陷
- 无接触、无磨损,寿命极长
- 允许较大的安装公差,降低了安装难度和成本
虽然电感式编码器的精度略低于高端光电编码器,但对于大多数 100W 关节电机应用来说,±0.1° 的精度已经完全足够。因此,本项目选择电感式编码器作为位置和速度反馈元件。
1.2.4 功率驱动方案选型:MOSFET vs IGBT
功率驱动电路负责将主控处理器输出的 PWM 信号转换为驱动电机的大电流信号。对于 100W 的低压电机(24V),我们对比了 MOSFET 和 IGBT 两种功率器件:
| 技术指标 | MOSFET(N 沟道) | IGBT |
|---|---|---|
| 工作电压 | 适合低压(≤100V) | 适合高压(≥600V) |
| 导通电阻 | 低(mΩ 级) | 高(Ω 级) |
| 开关速度 | 快(ns 级) | 慢(μs 级) |
| 开关损耗 | 低 | 高 |
| 驱动电路 | 简单 | 复杂(需要隔离驱动) |
| 成本 | 低 | 高 |
| 适用功率 | 低压小功率 | 高压大功率 |
显然,对于 24V、100W 的低压小功率电机,MOSFET 是最佳选择。我们将采用三相全桥驱动电路,使用 6 个 N 沟道 MOSFET 组成 H 桥。
1.3 系统总体架构设计
基于以上技术选型,我们设计了如图 1-1 所示的系统总体架构:
plaintext
+---------------------+ +---------------------+ +---------------------+
| 上位机/主控制器 | | 关节电机控制器 | | 100W永磁同步电机 |
| | | | | |
| 发送控制指令 |<------>| 接收CAN FD指令 |<------>| 电感式编码器 |
| 接收反馈数据 | CAN FD| 执行双环PID控制 | PWM | 三相定子绕组 |
| | | 驱动功率电路 | 驱动 | |
| | | 采集电流和电压 | | |
| | | 发送反馈数据 |------->| |
+---------------------+ +---------------------+ +---------------------+
系统主要由三个部分组成:
- 上位机 / 主控制器:负责发送运动控制指令(如位置、速度、扭矩指令),接收关节电机控制器的反馈数据(如实际位置、速度、电流、温度等)
- 关节电机控制器 :本项目的核心,基于 STM32G474RET6 微控制器,主要功能包括:
- 接收和解析 CAN FD 通信指令
- 采集电感式编码器的位置和速度信号
- 采集三相电流和母线电压
- 执行位置环和速度环双环 PID 控制算法
- 生成 SVPWM 信号驱动功率电路
- 实现过流、过压、过温等保护功能
- 向上位机发送反馈数据
- 100W 永磁同步电机:执行机构,内置电感式编码器
1.4 本章小结
本章详细介绍了基于 STM32G47x 与 CAN FD 的 100W 关节电机双环 PID 控制系统的技术选型和总体设计过程。通过对传统方案局限性的分析,我们提出了采用 CAN FD 通信总线、STM32G47x 主控处理器和电感式编码器的技术方案,并对各核心部件进行了详细的对比分析。最后,我们给出了系统的总体架构设计,为后续的硬件和软件设计奠定了基础。
第 2 章 STM32G47x 微控制器详解
2.1 STM32G4 系列概述
STM32G4 系列是意法半导体(STMicroelectronics)于 2019 年推出的一款基于 ARM Cortex-M4F 内核的高性能微控制器,专门针对工业控制、电机驱动、数字电源和消费电子等应用进行了优化。该系列微控制器具有以下主要特点:
- 采用 ARM Cortex-M4F 内核,最高工作频率 170MHz,支持浮点运算和 DSP 指令
- 集成了 CORDIC 和 FMAC 硬件加速器,显著提高数学运算速度
- 丰富的模拟外设,包括高速 ADC、DAC、比较器和运算放大器
- 内置 2 个 CAN FD 控制器,支持最高 8Mbps 的通信速率
- 丰富的定时器资源,包括高级定时器、通用定时器和基本定时器
- 宽工作温度范围(-40℃~+125℃),适合工业环境应用
- 多种封装选择,从 LQFP32 到 LQFP144,满足不同应用的需求
STM32G4 系列根据性能和外设配置的不同,分为多个子系列:
- STM32G431/G441:入门级,主频 170MHz,Flash 128~256KB,RAM 32~64KB
- STM32G471/G473:主流级,主频 170MHz,Flash 256~512KB,RAM 64~128KB
- STM32G474/G484:高性能级,主频 170MHz,Flash 512~1024KB,RAM 128~256KB,集成更多模拟外设
- STM32G491/G4A1:高集成度级,主频 170MHz,Flash 512~1024KB,RAM 128~256KB,集成 LCD 控制器和更多通信接口
本项目选择的是 STM32G474RET6,属于高性能级,具有 512KB Flash、128KB RAM、2 个 CAN FD 控制器、3 个 12 位 ADC、4 个 12 位 DAC 和 2 个高级定时器,完全满足本项目的需求。
2.2 STM32G474 的内核与存储器架构
2.2.1 Cortex-M4F 内核
STM32G474 采用 ARM Cortex-M4F 内核,这是一款 32 位 RISC 处理器,具有以下主要特点:
- 最高工作频率 170MHz,峰值性能 219 DMIPS(Dhrystone 2.1)
- 支持 Thumb-2 指令集,提高代码密度
- 集成硬件浮点单元(FPU),支持单精度浮点运算
- 支持 DSP 指令集,包括单周期乘法和累加(MAC)指令
- 具有嵌套向量中断控制器(NVIC),支持最多 82 个中断,16 个可编程优先级
- 具有内存保护单元(MPU),提高系统的安全性和可靠性
- 支持睡眠、停止和待机三种低功耗模式
Cortex-M4F 内核的内部结构如图 2-1 所示:
plaintext
+-----------------------------------------------------------------------------+
| Cortex-M4F内核 |
+-----------------------------------------------------------------------------+
| 取指单元 | 指令译码单元 | 执行单元 | 浮点单元(FPU) | DSP单元 | 系统控制单元 |
+-----------------------------------------------------------------------------+
| 总线接口单元 |
+-----------------------------------------------------------------------------+
| I-Code总线 | D-Code总线 | System总线 | Private Peripheral总线 | External总线 |
+-----------------------------------------------------------------------------+
2.2.2 存储器架构
STM32G474 的存储器架构采用哈佛结构,指令总线和数据总线分离,提高了系统的运行效率。其存储器映射如图 2-2 所示:
表格
| 地址范围 | 存储器类型 | 大小 | 说明 |
|---|---|---|---|
| 0x00000000~0x0007FFFF | Flash 存储器 | 512KB | 主程序存储器,支持读写和擦除 |
| 0x08000000~0x0807FFFF | Flash 存储器别名 | 512KB | 与 0x00000000 地址映射相同 |
| 0x1FFF0000~0x1FFF77FF | 系统存储器 | 30KB | 存储 ST 的引导程序(Bootloader) |
| 0x1FFF7800~0x1FFF7FFF | 选项字节 | 2KB | 存储用户配置选项和芯片唯一 ID |
| 0x20000000~0x2001FFFF | SRAM | 128KB | 数据存储器,支持字节、半字和字访问 |
| 0x40000000~0x5FFFFFFF | 外设寄存器 | 512MB | 所有外设的寄存器映射地址 |
| 0xE0000000~0xE00FFFFF | 内核外设 | 1MB | NVIC、SysTick 等内核外设的寄存器映射地址 |
STM32G474 的 Flash 存储器具有以下特点:
- 支持单周期访问,最高工作频率 170MHz
- 分为 2 个存储体(Bank),支持同时读写操作
- 擦除粒度为 2KB,编程粒度为双字(8 字节)
- 擦除 / 编程次数至少 10000 次
- 数据保存时间至少 20 年
STM32G474 的 SRAM 具有以下特点:
- 分为 3 个区域:SRAM1(64KB)、SRAM2(32KB)和 SRAM3(32KB)
- SRAM1 和 SRAM2 可以被 CPU 和 DMA 访问
- SRAM3 只能被 CPU 访问,用于存储关键数据
- 支持硬件奇偶校验,提高数据可靠性
2.3 STM32G474 的关键外设详解
2.3.1 CAN FD 控制器(FDCAN)
STM32G474 内置 2 个 CAN FD 控制器(FDCAN1 和 FDCAN2),完全符合 ISO 11898-1:2015 标准,支持传统 CAN 和 CAN FD 两种模式。FDCAN 控制器具有以下主要特点:
- 支持最高 8Mbps 的数据段通信速率
- 支持标准帧(11 位 ID)和扩展帧(29 位 ID)
- 支持数据长度为 0~64 字节的 CAN FD 帧
- 支持位速率切换(BRS)功能
- 集成 32 个接收邮箱和 32 个发送邮箱
- 支持接收过滤和 ID 掩码
- 支持错误处理和诊断功能
- 支持时间触发通信(TTCAN)
FDCAN 控制器的内部结构如图 2-3 所示:
plaintext
+-----------------------------------------------------------------------------+
| FDCAN控制器 |
+-----------------------------------------------------------------------------+
| 配置寄存器 | 状态寄存器 | 中断寄存器 | 时序寄存器 | 过滤寄存器 | 邮箱寄存器 |
+-----------------------------------------------------------------------------+
| 协议处理单元 |
+-----------------------------------------------------------------------------+
| 发送处理单元 | 接收处理单元 | 错误处理单元 | 位时序单元 | 仲裁单元 | CRC单元 |
+-----------------------------------------------------------------------------+
| 总线接口单元 |
+-----------------------------------------------------------------------------+
| 发送引脚(Tx) | 接收引脚(Rx) | 时钟输入 | 中断输出 | DMA请求输出 |
+-----------------------------------------------------------------------------+
在本项目中,我们将使用 FDCAN1 作为通信接口,配置为 CAN FD 模式,仲裁段速率为 1Mbps,数据段速率为 8Mbps。
2.3.2 高级定时器(TIM1 和 TIM8)
STM32G474 内置 2 个高级定时器(TIM1 和 TIM8),专门针对电机控制和功率变换应用进行了优化。高级定时器具有以下主要特点:
- 16 位向上 / 向下 / 向上向下计数模式
- 最高计数频率 170MHz
- 4 个独立的捕获 / 比较通道
- 支持互补输出和死区时间插入
- 支持中心对齐模式和边缘对齐模式
- 支持单脉冲模式和重复计数器
- 支持刹车输入和紧急停止功能
- 支持 ADC 同步触发
高级定时器的内部结构如图 2-4 所示:
plaintext
+-----------------------------------------------------------------------------+
| 高级定时器 |
+-----------------------------------------------------------------------------+
| 时钟与控制单元 | 计数器单元 | 自动重载寄存器 | 重复计数器 | 捕获/比较单元 |
+-----------------------------------------------------------------------------+
| 通道1 | 通道2 | 通道3 | 通道4 | 死区时间发生器 | 输出控制单元 | 刹车单元 |
+-----------------------------------------------------------------------------+
| 输出引脚(CH1~CH4) | 互补输出引脚(CH1N~CH4N) | 刹车输入引脚 | 触发输出 |
+-----------------------------------------------------------------------------+
在本项目中,我们将使用 TIM1 作为 PWM 发生器,配置为中心对齐模式,PWM 频率为 20kHz,生成三相互补 PWM 信号驱动功率电路。
2.3.3 模数转换器(ADC)
STM32G474 内置 3 个 12 位模数转换器(ADC1、ADC2 和 ADC3),具有以下主要特点:
- 12 位分辨率,最高转换速率 5Msps
- 支持单端和差分输入模式
- 支持单次转换、连续转换、扫描转换和间断转换模式
- 支持多通道同步采样
- 集成硬件过采样器,最高可提高到 16 位分辨率
- 支持 DMA 数据传输
- 支持定时器触发和外部触发
ADC 的内部结构如图 2-5 所示:
plaintext
+-----------------------------------------------------------------------------+
| ADC控制器 |
+-----------------------------------------------------------------------------+
| 配置寄存器 | 状态寄存器 | 中断寄存器 | 序列寄存器 | 数据寄存器 | 过采样器 |
+-----------------------------------------------------------------------------+
| 模拟多路选择器 | 采样保持电路 | 逐次逼近寄存器(SAR) | 电压参考 | 时钟单元 |
+-----------------------------------------------------------------------------+
| 模拟输入引脚(IN0~IN18) | 参考电压引脚(VREF+, VREF-) | 触发输入 | DMA请求 |
+-----------------------------------------------------------------------------+
在本项目中,我们将使用 ADC1 和 ADC2 同时采样三相电流中的两相(第三相电流可以通过基尔霍夫电流定律计算得到),使用 ADC3 采样母线电压。采样将由 TIM1 的更新事件触发,确保电流采样与 PWM 周期同步。
2.3.4 CORDIC 和 FMAC 硬件加速器
STM32G474 集成了两个专门用于数学运算的硬件加速器:CORDIC 和 FMAC,这对于电机控制算法来说非常重要。
CORDIC 加速器:CORDIC(Coordinate Rotation Digital Computer)是一种通过迭代计算来实现三角函数、双曲函数、平方根和乘法除法运算的算法。STM32G474 的 CORDIC 加速器具有以下主要特点:
- 支持 32 位定点数运算
- 支持以下函数:
- 正弦和余弦(sin, cos)
- 反正切和反正切 2(atan, atan2)
- 双曲正弦和双曲余弦(sinh, cosh)
- 平方根(sqrt)
- 自然对数(ln)
- 指数函数(exp)
- 运算精度高,误差小于 1 个 LSB
- 运算速度快,大多数函数只需要几个时钟周期
在电机控制中,CORDIC 加速器主要用于 Park 变换、Clarke 变换和反变换中的三角函数运算,可以显著提高算法的执行速度。
FMAC 加速器:FMAC(Filter Math Accelerator)是一种专门用于滤波和矩阵运算的硬件加速器。STM32G474 的 FMAC 加速器具有以下主要特点:
- 支持 32 位定点数运算
- 支持乘法累加(MAC)运算
- 支持有限脉冲响应(FIR)滤波和无限脉冲响应(IIR)滤波
- 支持矩阵乘法运算
- 运算速度快,一个时钟周期可以完成一次乘法累加运算
在电机控制中,FMAC 加速器主要用于 PID 控制算法中的乘法累加运算和低通滤波运算,可以进一步提高系统的性能。
2.4 STM32G474 的时钟系统
STM32G474 的时钟系统非常灵活,可以通过软件配置来满足不同应用的需求。其时钟树如图 2-6 所示:
plaintext
+-----------------------------------------------------------------------------+
| 时钟源 |
+-----------------------------------------------------------------------------+
| HSI(16MHz) | HSE(4~48MHz) | LSI(32kHz) | LSE(32.768kHz) | PLL | PLLSAI1 |
+-----------------------------------------------------------------------------+
| 系统时钟 |
+-----------------------------------------------------------------------------+
| AHB预分频器 | APB1预分频器 | APB2预分频器 | 内核时钟 | 外设时钟 |
+-----------------------------------------------------------------------------+
| 外设时钟 |
+-----------------------------------------------------------------------------+
| FDCAN时钟 | ADC时钟 | 定时器时钟 | UART时钟 | SPI时钟 | I2C时钟 |
+-----------------------------------------------------------------------------+
STM32G474 有以下几个时钟源:
- HSI:内部高速时钟,频率 16MHz,精度 ±1%,可以作为系统时钟源
- HSE:外部高速时钟,频率范围 4~48MHz,精度高,可以作为系统时钟源
- LSI:内部低速时钟,频率 32kHz,精度 ±5%,主要用于独立看门狗和 RTC
- LSE:外部低速时钟,频率 32.768kHz,精度高,主要用于 RTC
- PLL:锁相环,可以将输入时钟倍频到更高的频率,最高输出频率 170MHz
- PLLSAI1:辅助锁相环,主要用于 ADC 和 FDCAN 时钟
在本项目中,我们将使用 HSE 作为时钟源,频率为 24MHz,通过 PLL 倍频到 170MHz 作为系统时钟。FDCAN 时钟将由 PLLSAI1 提供,频率为 80MHz,以支持最高 8Mbps 的通信速率。ADC 时钟将由 PLLSAI1 提供,频率为 42.5MHz,以获得最高的转换速率。
2.5 STM32G474 的开发环境与工具链
STM32G474 的开发可以使用多种开发环境和工具链,最常用的有以下几种:
- STM32CubeIDE:意法半导体官方推出的集成开发环境,基于 Eclipse,集成了 STM32CubeMX 配置工具和 GCC 编译器,完全免费
- Keil MDK-ARM:ARM 公司推出的集成开发环境,使用 ARMCC 编译器,功能强大,调试方便,但需要付费
- IAR Embedded Workbench:IAR Systems 公司推出的集成开发环境,使用 IAR 编译器,代码优化效果好,但需要付费
本项目将使用 STM32CubeIDE 作为开发环境,因为它完全免费,并且集成了 STM32CubeMX,可以方便地进行外设配置和代码生成。
STM32CubeMX 是意法半导体官方推出的图形化配置工具,可以帮助开发者快速配置 STM32 微控制器的外设和引脚,生成初始化代码。它具有以下主要特点:
- 图形化界面,直观易用
- 支持所有 STM32 系列微控制器
- 自动处理引脚冲突
- 生成标准的初始化代码
- 支持多种开发环境(STM32CubeIDE、Keil MDK、IAR 等)
2.6 本章小结
本章详细介绍了 STM32G474 微控制器的内核、存储器架构、关键外设、时钟系统和开发环境。我们重点分析了与本项目密切相关的 FDCAN 控制器、高级定时器、ADC 以及 CORDIC 和 FMAC 硬件加速器的特点和功能。通过本章的学习,读者应该对 STM32G474 微控制器有了全面的了解,为后续的硬件和软件设计打下了坚实的基础。
第 3 章 CAN FD 通信总线技术详解
3.1 CAN 总线概述
CAN(Controller Area Network)是由德国博世公司于 1986 年开发的一种串行通信总线,最初用于汽车电子系统,后来逐渐扩展到工业自动化、航空航天、医疗设备等领域。CAN 总线具有以下主要特点:
- 多主站结构,任何节点都可以主动发送数据
- 采用差分信号传输,抗干扰能力强
- 采用非破坏性总线仲裁机制,避免总线冲突
- 支持错误检测和自动重发
- 数据帧短,传输效率高
- 实时性好,适合工业控制应用
传统 CAN 总线的最高通信速率为 1Mbps,最大数据帧长度为 8 字节,这在很多需要传输大量数据的应用中已经不能满足需求。为了解决这个问题,博世公司于 2012 年推出了 CAN FD(CAN with Flexible Data-Rate)协议,在保持与传统 CAN 兼容的同时,大大提高了通信带宽。
3.2 CAN FD 协议详解
3.2.1 CAN FD 与传统 CAN 的区别
CAN FD 协议在传统 CAN 协议的基础上进行了以下几个方面的改进:
- 提高了数据段的通信速率:CAN FD 允许在数据段使用更高的通信速率,最高可达 8Mbps,而仲裁段仍然使用较低的速率(最高 1Mbps),以保证仲裁的可靠性
- 增加了数据帧的长度:CAN FD 将最大数据帧长度从 8 字节增加到了 64 字节,大大提高了数据传输效率
- 改进了 CRC 校验算法:CAN FD 使用了更强大的 CRC 校验算法,提高了数据传输的可靠性
- 增加了位速率切换(BRS)标志:用于指示数据段是否使用更高的速率
- 增加了错误状态指示器(ESI)标志:用于指示发送节点的错误状态
CAN FD 与传统 CAN 的主要区别如表 3-1 所示:
| 技术指标 | 传统 CAN | CAN FD |
|---|---|---|
| 最高通信速率 | 1Mbps | 8Mbps(数据段) |
| 最大数据帧长度 | 8 字节 | 64 字节 |
| 仲裁段速率 | 固定 | 固定(≤1Mbps) |
| 数据段速率 | 与仲裁段相同 | 可高于仲裁段(≤8Mbps) |
| CRC 多项式 | 0x4599(15 位) | 0x4599(15 位)或 0x1EDC6F41(32 位) |
| 帧格式 | 标准帧、扩展帧、远程帧、错误帧、过载帧 | 标准帧、扩展帧、错误帧、过载帧(取消了远程帧) |
3.2.2 CAN FD 的帧格式
CAN FD 的帧格式与传统 CAN 类似,但增加了一些新的字段。CAN FD 数据帧的格式如图 3-1 所示:
plaintext
+-----+-----+-------+-----+-----+-------+-----+-------+-----+-------+-----+
| SOF | IDE | R0/R1 | IDE | RTR | SRR | IDE | DLC | BRS | ESI | CRC |
+-----+-----+-------+-----+-----+-------+-----+-------+-----+-------+-----+
| CRC界定符 | ACK槽 | ACK界定符 | EOF | 帧间隔 |
+-----------+-------+-----------+-----+--------+
CAN FD 数据帧的各个字段说明如下:
- SOF(Start of Frame):帧起始位,1 位,显性电平,表示帧的开始
- 仲裁段:包括 11 位标准 ID 或 29 位扩展 ID,用于总线仲裁
- R0/R1:保留位,传统 CAN 中为 R0,CAN FD 中为 R1,用于区分传统 CAN 帧和 CAN FD 帧
- IDE(Identifier Extension):ID 扩展位,1 位,0 表示标准帧,1 表示扩展帧
- RTR(Remote Transmission Request):远程传输请求位,传统 CAN 中用于远程帧,CAN FD 中取消了远程帧,该位固定为 0
- SRR(Substitute Remote Request):替代远程请求位,扩展帧中使用,固定为 1
- DLC(Data Length Code):数据长度码,4 位,用于指示数据段的长度
- BRS(Bit Rate Switch):位速率切换位,1 位,1 表示数据段使用更高的速率,0 表示数据段与仲裁段速率相同
- ESI(Error State Indicator):错误状态指示器,1 位,0 表示发送节点处于主动错误状态,1 表示处于被动错误状态
- 数据段:0~64 字节,用于传输用户数据
- CRC(Cyclic Redundancy Check):循环冗余校验码,15 位或 32 位,用于检测传输错误
- CRC 界定符:1 位,隐性电平,表示 CRC 字段的结束
- ACK 槽:1 位,发送节点发送隐性电平,接收节点如果正确接收了帧,会发送显性电平进行应答
- ACK 界定符:1 位,隐性电平,表示 ACK 字段的结束
- EOF(End of Frame):帧结束位,7 位,隐性电平,表示帧的结束
- 帧间隔:3 位,隐性电平,用于分隔连续的帧
CAN FD 的 DLC 字段与数据长度的对应关系如表 3-2 所示:
| DLC 值 | 传统 CAN 数据长度(字节) | CAN FD 数据长度(字节) |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
| 5 | 5 | 5 |
| 6 | 6 | 6 |
| 7 | 7 | 7 |
| 8 | 8 | 8 |
| 9 | - | 12 |
| 10 | - | 16 |
| 11 | - | 20 |
| 12 | - | 24 |
| 13 | - | 32 |
| 14 | - | 48 |
| 15 | - | 64 |
3.2.3 CAN FD 的位时序
CAN FD 的位时序与传统 CAN 类似,但分为仲裁段和数据段两个部分,每个部分都有自己的位时序参数。
CAN FD 的位时序由以下几个部分组成:
- 同步段(SYNC_SEG):1 个时间量子(TQ),用于同步总线上的各个节点
- 传播段(PROP_SEG):用于补偿信号在总线上的传播延迟
- 相位段 1(PHASE_SEG1):用于补偿相位误差
- 相位段 2(PHASE_SEG2):用于补偿相位误差
一个位的总长度为:SYNC_SEG + PROP_SEG + PHASE_SEG1 + PHASE_SEG2 = 1 + tq1 + tq2 个 TQ,其中 tq1 = PROP_SEG + PHASE_SEG1,tq2 = PHASE_SEG2。
CAN FD 的仲裁段和数据段可以使用不同的位时序参数,因此需要分别配置。在本项目中,我们将仲裁段的速率配置为 1Mbps,数据段的速率配置为 8Mbps。
仲裁段位时序配置(1Mbps):
- 时钟频率:80MHz(由 PLLSAI1 提供)
- 预分频器:10
- 时间量子(TQ):1/80MHz × 10 = 125ns
- tq1:6 个 TQ(750ns)
- tq2:2 个 TQ(250ns)
- 位长度:1 + 6 + 2 = 9 个 TQ = 1125ns
- 位速率:1/1125ns ≈ 888.89kbps(接近 1Mbps)
数据段位时序配置(8Mbps):
- 时钟频率:80MHz
- 预分频器:1
- 时间量子(TQ):1/80MHz = 12.5ns
- tq1:6 个 TQ(75ns)
- tq2:2 个 TQ(25ns)
- 位长度:1 + 6 + 2 = 9 个 TQ = 112.5ns
- 位速率:1/112.5ns ≈ 8.888Mbps(接近 8Mbps)
3.2.4 CAN FD 的总线仲裁机制
CAN FD 采用与传统 CAN 相同的非破坏性总线仲裁机制。当多个节点同时发送数据时,总线仲裁机制会根据 ID 的优先级来决定哪个节点可以继续发送数据,优先级高的节点(ID 值小)会赢得仲裁,继续发送数据,而优先级低的节点会停止发送,等待总线空闲后再重新发送。
总线仲裁的过程如下:
- 当总线空闲时,任何节点都可以开始发送数据
- 发送节点在发送 ID 的每一位时,都会监听总线的电平
- 如果发送节点发送的是隐性电平(1),但监听到的是显性电平(0),说明有优先级更高的节点在发送数据,该节点会立即停止发送,并进入接收模式
- 优先级最高的节点会赢得仲裁,继续发送数据,不会受到任何干扰
- 当总线再次空闲时,失去仲裁的节点会重新尝试发送数据
这种非破坏性总线仲裁机制保证了高优先级的消息能够及时发送,提高了系统的实时性。
3.2.5 CAN FD 的错误处理机制
CAN FD 具有完善的错误处理机制,能够检测和处理各种传输错误。CAN FD 定义了以下几种错误类型:
- 位错误:发送节点发送的位与监听到的位不一致
- 填充错误:在应该出现位填充的地方没有出现位填充
- CRC 错误:接收节点计算出的 CRC 值与接收到的 CRC 值不一致
- 格式错误:接收到的帧格式不符合规范
- ACK 错误:发送节点没有收到任何节点的 ACK 应答
当检测到错误时,发送节点会发送一个错误帧,通知总线上的所有节点当前帧无效,并自动重发该帧。CAN FD 还定义了两种错误状态:主动错误状态和被动错误状态。
- 主动错误状态:节点可以正常发送数据和主动错误帧
- 被动错误状态:节点只能发送被动错误帧,并且在发送数据前需要等待更长的时间
每个节点都有两个错误计数器:发送错误计数器(TEC)和接收错误计数器(REC)。当检测到错误时,相应的计数器会增加;当成功发送或接收帧时,相应的计数器会减少。根据错误计数器的值,节点会在不同的错误状态之间切换:
- 当 TEC < 128 且 REC < 128 时,节点处于主动错误状态
- 当 TEC ≥ 128 或 REC ≥ 128 时,节点处于被动错误状态
- 当 TEC ≥ 256 时,节点进入总线关闭状态,不再参与总线通信
3.3 CAN FD 的物理层
3.3.1 CAN FD 的物理层标准
CAN FD 的物理层标准与传统 CAN 基本相同,主要遵循 ISO 11898-2:2016 标准。该标准定义了 CAN 总线的电气特性、传输介质和连接器等。
CAN FD 采用差分信号传输,使用两根线:CAN_H 和 CAN_L。在隐性状态下,CAN_H 和 CAN_L 的电压都约为 2.5V,差分电压为 0V;在显性状态下,CAN_H 的电压约为 3.5V,CAN_L 的电压约为 1.5V,差分电压约为 2V。
CAN FD 的传输介质通常使用屏蔽双绞线,特性阻抗为 120Ω。总线的两端需要连接 120Ω 的终端电阻,以吸收信号反射,提高通信的可靠性。
3.3.2 CAN FD 的传输距离与通信速率的关系
CAN FD 的最大传输距离与通信速率成反比,通信速率越高,传输距离越短。表 3-3 给出了不同通信速率下的最大传输距离:
| 仲裁段速率 | 数据段速率 | 最大传输距离 |
|---|---|---|
| 1Mbps | 8Mbps | 100m |
| 1Mbps | 5Mbps | 200m |
| 1Mbps | 2Mbps | 500m |
| 500kbps | 2Mbps | 1000m |
| 250kbps | 1Mbps | 2000m |
| 125kbps | 500kbps | 5000m |
需要注意的是,以上数据是在理想条件下得到的,实际应用中,由于传输介质的质量、连接器的接触电阻、电磁干扰等因素的影响,传输距离可能会有所缩短。
3.3.3 CAN FD 的总线拓扑结构
CAN FD 支持多种总线拓扑结构,最常用的是总线型拓扑结构,如图 3-2 所示:
plaintext
+--------+ +--------+ +--------+ +--------+
| 节点1 |--------| 节点2 |--------| 节点3 |--------| 节点n |
+--------+ +--------+ +--------+ +--------+
| |
| |
+--------+ +--------+
| 120Ω | | 120Ω |
| 终端电阻| | 终端电阻|
+--------+ +--------+
在总线型拓扑结构中,所有节点都通过双绞线连接到同一条总线上,总线的两端连接终端电阻。这种拓扑结构简单、布线方便、成本低,是 CAN 总线最常用的拓扑结构。
CAN FD 也支持星型拓扑结构和树型拓扑结构,但需要使用中继器或集线器来扩展总线,这会增加系统的成本和复杂度,因此在实际应用中较少使用。
3.4 STM32G474 的 FDCAN 控制器配置
3.4.1 FDCAN 控制器的初始化
STM32G474 的 FDCAN 控制器的初始化主要包括以下几个步骤:
- 使能 FDCAN 时钟
- 配置 FDCAN 引脚
- 进入 FDCAN 初始化模式
- 配置 FDCAN 的位时序参数
- 配置 FDCAN 的工作模式
- 配置接收过滤器
- 退出 FDCAN 初始化模式
- 使能 FDCAN 中断
以下是 FDCAN 控制器初始化的代码示例:
c
运行
#include "stm32g4xx_hal.h"
FDCAN_HandleTypeDef hfdcan1;
void FDCAN1_Init(void)
{
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
hfdcan1.Init.AutoRetransmission = ENABLE;
hfdcan1.Init.TransmitPause = DISABLE;
hfdcan1.Init.ProtocolException = DISABLE;
hfdcan1.Init.NominalPrescaler = 10;
hfdcan1.Init.NominalSyncJumpWidth = 1;
hfdcan1.Init.NominalTimeSeg1 = 6;
hfdcan1.Init.NominalTimeSeg2 = 2;
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 1;
hfdcan1.Init.DataTimeSeg1 = 6;
hfdcan1.Init.DataTimeSeg2 = 2;
hfdcan1.Init.StdFiltersNbr = 1;
hfdcan1.Init.ExtFiltersNbr = 0;
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
// 配置接收过滤器
FDCAN_FilterTypeDef sFilterConfig;
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
sFilterConfig.FilterID1 = 0x123; // 接收ID为0x123的帧
sFilterConfig.FilterID2 = 0x7FF; // 掩码,只比较ID的所有位
if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
{
Error_Handler();
}
// 使能FDCAN
if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
// 使能接收FIFO0中断
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
{
Error_Handler();
}
}
void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if (hfdcan->Instance == FDCAN1)
{
// 配置FDCAN时钟
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLLSAI1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
// 使能FDCAN和GPIO时钟
__HAL_RCC_FDCAN_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置FDCAN引脚
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 使能FDCAN中断
HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
}
}
void FDCAN1_IT0_IRQHandler(void)
{
HAL_FDCAN_IRQHandler(&hfdcan1);
}
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
{
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[64];
// 读取接收FIFO0中的数据
if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
{
Error_Handler();
}
// 处理接收到的数据
Process_CANFD_Message(&RxHeader, RxData);
}
}
3.4.2 CAN FD 数据的发送
STM32G474 的 FDCAN 控制器有 32 个发送邮箱,可以同时缓存 32 个待发送的帧。发送数据的步骤如下:
- 填充发送帧头和数据
- 选择一个空闲的发送邮箱
- 将帧头和数据写入发送邮箱
- 启动发送
以下是 CAN FD 数据发送的代码示例:
c
运行
HAL_StatusTypeDef FDCAN1_Send_Message(uint32_t id, uint8_t *data, uint8_t len)
{
FDCAN_TxHeaderTypeDef TxHeader;
// 配置发送帧头
TxHeader.Identifier = id;
TxHeader.IdType = FDCAN_STANDARD_ID;
TxHeader.TxFrameType = FDCAN_DATA_FRAME;
TxHeader.DataLength = len;
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
TxHeader.BitRateSwitch = FDCAN_BRS_ON;
TxHeader.FDFormat = FDCAN_FD_CAN;
TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
TxHeader.MessageMarker = 0;
// 发送数据
return HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, data);
}
3.4.3 CAN FD 数据的接收
STM32G474 的 FDCAN 控制器有 2 个接收 FIFO(FIFO0 和 FIFO1),每个 FIFO 可以存储 3 个帧。接收数据可以采用查询方式或中断方式。在本项目中,我们将采用中断方式接收数据,以提高系统的实时性。
当有新的帧到达接收 FIFO 时,会触发接收中断,在中断服务函数中读取数据并进行处理。接收数据的代码示例已经在 3.4.1 节中给出。
3.5 本项目的 CAN FD 通信协议设计
为了实现上位机与关节电机控制器之间的可靠通信,我们需要设计一个简单、高效的 CAN FD 通信协议。本项目的通信协议采用主从式结构,上位机作为主节点,关节电机控制器作为从节点。每个从节点有一个唯一的节点 ID,范围为 1~32。
3.5.1 帧格式定义
本项目的 CAN FD 通信协议采用标准帧格式,ID 的定义如下:
- 位 10~5:功能码(6 位),用于区分不同的功能
- 位 4~0:节点 ID(5 位),用于区分不同的从节点
功能码的定义如表 3-4 所示:
| 功能码 | 功能描述 | 数据方向 | 数据长度(字节) |
|---|---|---|---|
| 0x01 | 位置控制指令 | 主→从 | 4 |
| 0x02 | 速度控制指令 | 主→从 | 4 |
| 0x03 | 扭矩控制指令 | 主→从 | 4 |
| 0x04 | 停止指令 | 主→从 | 0 |
| 0x05 | 急停指令 | 主→从 | 0 |
| 0x06 | 参数设置指令 | 主→从 | 8 |
| 0x07 | 参数读取指令 | 主→从 | 2 |
| 0x08 | 参数读取响应 | 从→主 | 8 |
| 0x09 | 状态反馈 | 从→主 | 16 |
| 0x0A | 错误报警 | 从→主 | 4 |
3.5.2 主要指令说明
1. 位置控制指令(功能码 0x01)
- 数据内容:目标位置(32 位浮点数,单位:度)
- 说明:发送给从节点,控制电机运动到指定的位置
2. 速度控制指令(功能码 0x02)
- 数据内容:目标速度(32 位浮点数,单位:rpm)
- 说明:发送给从节点,控制电机以指定的速度运动
3. 扭矩控制指令(功能码 0x03)
- 数据内容:目标扭矩(32 位浮点数,单位:N・m)
- 说明:发送给从节点,控制电机输出指定的扭矩
4. 停止指令(功能码 0x04)
- 数据内容:无
- 说明:发送给从节点,使电机平滑停止
5. 急停指令(功能码 0x05)
- 数据内容:无
- 说明:发送给从节点,使电机立即停止,切断功率输出
6. 参数设置指令(功能码 0x06)
- 数据内容:参数地址(16 位无符号整数)+ 参数值(32 位浮点数)
- 说明:发送给从节点,设置指定地址的参数值
7. 参数读取指令(功能码 0x07)
- 数据内容:参数地址(16 位无符号整数)
- 说明:发送给从节点,读取指定地址的参数值
8. 参数读取响应(功能码 0x08)
- 数据内容:参数地址(16 位无符号整数)+ 参数值(32 位浮点数)
- 说明:从节点发送给主节点,响应参数读取指令
9. 状态反馈(功能码 0x09)
- 数据内容:
- 实际位置(32 位浮点数,单位:度)
- 实际速度(32 位浮点数,单位:rpm)
- 实际电流(32 位浮点数,单位:A)
- 电机温度(32 位浮点数,单位:℃)
- 说明:从节点周期性地发送给主节点,反馈电机的运行状态
10. 错误报警(功能码 0x0A)
- 数据内容:错误代码(32 位无符号整数)
- 说明:当从节点检测到错误时,发送给主节点,报告错误信息
错误代码的定义如表 3-5 所示:
| 错误代码 | 错误描述 |
|---|---|
| 0x00000001 | 过流错误 |
| 0x00000002 | 过压错误 |
| 0x00000004 | 欠压错误 |
| 0x00000008 | 过温错误 |
| 0x00000010 | 编码器错误 |
| 0x00000020 | CAN 通信错误 |
| 0x00000040 | 位置跟随误差过大 |
| 0x00000080 | 速度跟随误差过大 |
3.5.3 通信周期
本项目的通信周期设计为 1ms,即主节点每 1ms 发送一次控制指令,从节点每 1ms 发送一次状态反馈。这样可以保证系统的实时性,满足大多数工业应用的要求。
3.6 本章小结
本章详细介绍了 CAN FD 通信总线技术,包括 CAN 总线的概述、CAN FD 协议的详细解析、CAN FD 的物理层、STM32G474 的 FDCAN 控制器配置以及本项目的 CAN FD 通信协议设计。我们重点分析了 CAN FD 与传统 CAN 的区别、CAN FD 的帧格式、位时序、总线仲裁机制和错误处理机制,并给出了详细的代码示例。通过本章的学习,读者应该对 CAN FD 通信总线技术有了全面的了解,能够独立完成 CAN FD 通信系统的设计和实现。
第 4 章 电感式编码器原理与实现
4.1 编码器技术概述
编码器是一种将机械位移转换为电信号的装置,广泛应用于电机控制、机器人、数控机床、航空航天等领域。根据工作原理的不同,编码器可以分为光电编码器、磁编码器和电感式编码器三大类。
4.1.1 光电编码器
光电编码器是目前应用最广泛的编码器,它利用光电效应来检测光栅的位置。光电编码器主要由光源、码盘、光栅和光电探测器组成。码盘上刻有均匀的透光和不透光的条纹,当码盘旋转时,光源发出的光通过码盘和光栅照射到光电探测器上,产生周期性的电信号。通过对这些电信号进行计数和处理,就可以得到电机的位置和速度信息。
光电编码器的优点是精度高、分辨率高、响应速度快;缺点是对灰尘、水汽和振动敏感,寿命较短,成本较高。
4.1.2 磁编码器
磁编码器利用霍尔效应来检测磁场的位置。磁编码器主要由磁钢和霍尔传感器组成。磁钢安装在电机轴上,随着电机轴一起旋转,产生旋转的磁场。霍尔传感器检测磁场的变化,产生正弦和余弦信号。通过对这些信号进行处理,就可以得到电机的位置和速度信息。
磁编码器的优点是体积小、成本低、抗振动能力强;缺点是容易受到外部磁场的干扰,精度和稳定性受到影响。
4.1.3 电感式编码器
电感式编码器是一种新型的编码器技术,它利用电磁感应原理来检测金属目标的位置。电感式编码器主要由发射线圈、接收线圈和金属目标组成。发射线圈通以高频交流电流,产生交变的磁场。当金属目标在磁场中运动时,会在接收线圈中感应出电动势。通过检测接收线圈中感应电动势的变化,就可以得到金属目标的位置信息。
电感式编码器的优点是抗干扰能力强、寿命长、工作温度范围宽、允许较大的安装公差;缺点是精度略低于高端光电编码器,成本略高于磁编码器。
4.2 电感式编码器的工作原理
4.2.1 电磁感应基本原理
电感式编码器的工作原理基于法拉第电磁感应定律:当穿过闭合回路的磁通量发生变化时,回路中会产生感应电动势。感应电动势的大小与磁通量的变化率成正比,方向由楞次定律确定。
法拉第电磁感应定律的数学表达式为:ε=−dtdΦ其中,ε为感应电动势,Φ为磁通量,t为时间。
在电感式编码器中,发射线圈通以高频交流电流I(t)=I0sin(ωt),产生的交变磁场为:B(t)=B0sin(ωt)其中,B0为磁场的幅值,ω为角频率。
当金属目标在磁场中运动时,会在接收线圈中感应出电动势。感应电动势的大小和相位与金属目标的位置有关。通过检测感应电动势的幅值和相位,就可以得到金属目标的位置信息。
4.2.2 电感式编码器的结构
电感式编码器主要由定子和转子两部分组成,如图 4-1 所示:
plaintext
+---------------------+ +---------------------+
| 定子 | | 转子 |
| | | |
| 发射线圈 |<------>| 金属目标 |
| 接收线圈 | 磁场 | |
| 信号处理电路 | | |
+---------------------+ +---------------------+
定子:固定在电机的端盖上,包含发射线圈、接收线圈和信号处理电路。发射线圈和接收线圈通常采用印刷电路板(PCB)工艺制作,形成平面线圈结构。
转子:固定在电机轴上,随电机轴一起旋转,通常是一个金属圆盘,上面刻有特殊的图案。
4.2.3 电感式编码器的工作过程
电感式编码器的工作过程可以分为以下几个步骤:
- 信号处理电路产生高频交流信号,驱动发射线圈产生交变磁场
- 交变磁场穿过转子上的金属目标,在金属目标中产生涡流
- 涡流产生的二次磁场会抵消部分原磁场,导致接收线圈中的磁通量发生变化
- 接收线圈中感应出电动势,其幅值和相位与转子的位置有关
- 信号处理电路对接收线圈的输出信号进行放大、滤波和解调处理,得到转子的位置信息
- 将位置信息转换为数字信号输出给主控处理器
4.2.4 电感式编码器的信号处理
电感式编码器的接收线圈通常采用正交结构,即两个接收线圈在空间上相差 90 度。这样,当转子旋转时,两个接收线圈会输出相位相差 90 度的正弦和余弦信号:VA=V0sin(θ)sin(ωt)VB=V0cos(θ)sin(ωt)其中,V0为信号的幅值,θ为转子的机械角度,ω为载波角频率。
为了得到转子的位置信息,需要对这两个信号进行解调处理。常用的解调方法有同步解调法和包络检波法。
同步解调法:同步解调法是将接收信号与发射信号相乘,然后通过低通滤波器滤除高频分量,得到与位置有关的直流信号:VA×sin(ωt)=V0sin(θ)sin2(ωt)=2V0sin(θ)−2V0sin(θ)cos(2ωt)VB×sin(ωt)=V0cos(θ)sin2(ωt)=2V0cos(θ)−2V0cos(θ)cos(2ωt)
经过低通滤波后,得到:VA_dc=2V0sin(θ)VB_dc=2V0cos(θ)
然后,通过反正切运算就可以得到转子的位置:θ=arctan(VB_dcVA_dc)
同步解调法的优点是精度高、抗干扰能力强;缺点是电路复杂,需要精确的同步信号。
包络检波法:包络检波法是通过检测接收信号的包络来得到与位置有关的信号。包络检波电路通常由二极管、电容和电阻组成。
包络检波法的优点是电路简单、成本低;缺点是精度较低,抗干扰能力较差。
在本项目中,我们将采用同步解调法,以获得更高的精度和更好的抗干扰能力。
4.3 电感式编码器的性能指标
电感式编码器的主要性能指标包括分辨率、精度、响应速度、工作温度范围和安装公差等。
4.3.1 分辨率
分辨率是指编码器能够检测到的最小角度变化,通常用位(bit)表示。例如,16 位分辨率的编码器可以将一圈(360 度)分为216=65536个等分,每个等分对应的角度为360/65536≈0.0055度。
电感式编码器的分辨率主要取决于接收线圈的结构和信号处理电路的精度。目前,市场上的电感式编码器的分辨率最高可以达到 23 位。
4.3.2 精度
精度是指编码器的测量值与实际值之间的最大误差,通常用角度(度或角分)表示。电感式编码器的精度主要受到以下因素的影响:
- 线圈的制造精度
- 金属目标的制造精度
- 信号处理电路的误差
- 温度漂移
- 安装误差
目前,市场上的电感式编码器的精度一般在 ±0.1°~±0.5° 之间。
4.3.3 响应速度
响应速度是指编码器能够跟踪的最大转速,通常用转每分钟(rpm)表示。电感式编码器的响应速度主要取决于载波频率和信号处理电路的速度。载波频率越高,响应速度越快。
目前,市场上的电感式编码器的响应速度一般可以达到 10000rpm 以上。
4.3.4 工作温度范围
工作温度范围是指编码器能够正常工作的温度范围。电感式编码器的工作温度范围很宽,一般可以达到 - 40℃~+150℃,远高于光电编码器和磁编码器。
4.3.5 安装公差
安装公差是指编码器在安装时允许的最大偏差,包括轴向偏差、径向偏差和角度偏差。电感式编码器允许较大的安装公差,一般轴向偏差可以达到 ±0.5mm,径向偏差可以达到 ±0.2mm,角度偏差可以达到 ±2 度,这大大降低了安装难度和成本。
4.4 本项目选用的电感式编码器
本项目选用的是德国倍加福(Pepperl+Fuchs)公司的 EVM58N 系列电感式编码器,具体型号为 EVM58N-011IZR0BN-1213。该编码器具有以下主要特点:
- 单圈分辨率:16 位(65536 线)
- 精度:±0.1°
- 最高转速:12000rpm
- 工作温度范围:-40℃~+85℃
- 输出接口:SSI(同步串行接口)
- 供电电压:10~30V DC
- 防护等级:IP67
- 允许轴向偏差:±0.5mm
- 允许径向偏差:±0.2mm
- 允许角度偏差:±2 度
EVM58N 系列电感式编码器采用了先进的电感式传感技术,具有极高的可靠性和稳定性,非常适合在恶劣的工业环境中使用。
4.5 SSI 接口协议详解
SSI(Synchronous Serial Interface)是一种同步串行接口协议,广泛应用于编码器和传感器的数据传输。SSI 接口采用主从式结构,主控处理器作为主设备,编码器作为从设备。
4.5.1 SSI 接口的信号定义
SSI 接口使用两根信号线:时钟线(CLK)和数据线(DATA)。
- CLK:主设备输出,用于同步数据传输
- DATA:从设备输出,用于传输数据
4.5.2 SSI 接口的通信过程
SSI 接口的通信过程如下:
- 主设备将 CLK 线拉低,准备开始通信
- 主设备输出时钟脉冲,从设备在时钟的下降沿将数据位依次输出到 DATA 线上
- 主设备在时钟的上升沿采样 DATA 线上的数据
- 当所有数据位传输完成后,主设备将 CLK 线拉高,结束一次通信
SSI 接口的数据格式通常包括:
- 数据位:16~25 位,用于传输位置信息
- 状态位:1~2 位,用于指示编码器的状态(如正常、错误等)
- 奇偶校验位:1 位,用于检测传输错误
EVM58N-011IZR0BN-1213 编码器的 SSI 数据格式如下:
- 数据位:16 位(高位在前)
- 状态位:1 位(0 表示正常,1 表示错误)
- 奇偶校验位:1 位(偶校验)
4.5.3 STM32G474 与 SSI 接口的连接
STM32G474 没有专门的 SSI 接口,但可以使用 SPI 接口来模拟 SSI 接口。SPI 接口的 SCK 引脚作为 SSI 的 CLK 线,MISO 引脚作为 SSI 的 DATA 线。
STM32G474 与 EVM58N 编码器的连接如表 4-1 所示:
| STM32G474 引脚 | EVM58N 编码器引脚 | 信号名称 |
|---|---|---|
| PA5 (SPI1_SCK) | CLK | 时钟线 |
| PA6 (SPI1_MISO) | DATA | 数据线 |
| 3.3V | VCC | 电源 |
| GND | GND | 地 |
4.5.4 SSI 接口的软件实现
以下是使用 STM32G474 的 SPI 接口模拟 SSI 接口读取编码器位置的代码示例:
c
运行
#include "stm32g4xx_hal.h"
SPI_HandleTypeDef hspi1;
void SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if (hspi->Instance == SPI1)
{
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
uint16_t EVM58N_Read_Position(void)
{
uint8_t rx_data[3];
uint16_t position;
uint8_t status;
uint8_t parity;
// 发送3个字节的时钟脉冲,读取24位数据
HAL_SPI_Receive(&hspi1, rx_data, 3, HAL_MAX_DELAY);
// 解析数据
position = (rx_data[0] << 8) | rx_data[1];
status = (rx_data[2] >> 7) & 0x01;
parity = rx_data[2] & 0x01;
// 检查状态和奇偶校验
if (status != 0)
{
// 编码器错误
return 0xFFFF;
}
// 计算偶校验
uint8_t calc_parity = 0;
for (int i = 0; i < 16; i++)
{
calc_parity ^= (position >> i) & 0x01;
}
if (calc_parity != parity)
{
// 奇偶校验错误
return 0xFFFF;
}
return position;
}
4.6 电感式编码器的校准
虽然电感式编码器在出厂时已经进行了校准,但在安装到电机上之后,由于安装误差和电机本身的特性,仍然需要进行校准,以获得更高的精度。
4.6.1 零点校准
零点校准是将编码器的零点与电机的电气零点对齐。对于永磁同步电机来说,电气零点是指转子的 d 轴与定子 A 相绕组轴线重合的位置。
零点校准的步骤如下:
- 给电机的 A 相绕组通以直流电流,B 相和 C 相绕组不通电
- 电机的转子会自动旋转到电气零点位置
- 读取此时编码器的位置值,将其设置为零点偏移量
- 在后续的位置计算中,减去这个零点偏移量,就可以得到电机的电气角度
4.6.2 线性度校准
线性度校准是为了补偿编码器的非线性误差。由于制造工艺的限制,编码器的输出信号可能存在一定的非线性误差。通过线性度校准,可以显著提高编码器的精度。
线性度校准的步骤如下:
- 使用高精度的角度基准(如光学分度头)作为参考
- 将电机旋转到多个已知的角度位置
- 读取每个位置编码器的输出值
- 计算编码器输出值与实际角度之间的误差
- 建立误差修正表或拟合误差曲线
- 在后续的位置计算中,根据误差修正表或拟合曲线对编码器的输出值进行修正
4.6.3 温度漂移校准
温度漂移校准是为了补偿温度变化对编码器精度的影响。由于线圈的电阻和电感会随温度变化,编码器的输出信号也会随温度变化而产生漂移。
温度漂移校准的步骤如下:
- 将编码器置于高低温箱中,在不同的温度下测量编码器的输出值
- 计算温度变化引起的误差
- 建立温度误差修正模型
- 在后续的位置计算中,根据温度传感器的测量值对编码器的输出值进行修正
在本项目中,我们将主要进行零点校准,对于大多数应用来说,零点校准已经足够。如果需要更高的精度,可以再进行线性度校准和温度漂移校准。
4.7 本章小结
本章详细介绍了电感式编码器的原理与实现,包括编码器技术概述、电感式编码器的工作原理、性能指标、本项目选用的 EVM58N 编码器、SSI 接口协议以及电感式编码器的校准方法。我们重点分析了电感式编码器的工作过程和信号处理方法,并给出了详细的代码示例。通过本章的学习,读者应该对电感式编码器技术有了全面的了解,能够独立完成电感式编码器的选型、接口设计和校准工作。
第 5 章 100W 关节电机硬件设计
5.1 硬件系统总体设计
本项目的硬件系统主要由以下几个部分组成:
- 主控单元:基于 STM32G474RET6 微控制器,负责执行控制算法、处理通信数据和驱动功率电路
- 电源管理单元:为整个系统提供稳定的电源,包括 24V 转 5V 和 5V 转 3.3V
- CAN FD 通信单元:实现与上位机的通信
- 编码器接口单元:实现与电感式编码器的接口
- 电流采样单元:采集电机的三相电流
- 电压采样单元:采集母线电压
- 功率驱动单元:驱动电机的三相绕组
- 保护单元:实现过流、过压、过温等保护功能
硬件系统的总体框图如图 5-1 所示:
plaintext
+-----------------------------------------------------------------------------+
| 24V电源输入 |
+-----------------------------------------------------------------------------+
|
v
+-----------------------------------------------------------------------------+
| 电源管理单元 |
| 24V转5V | 5V转3.3V | 电压采样 | 电流采样 | 温度采样 |
+-----------------------------------------------------------------------------+
| | | | |
v v v v v
+-----------------------------------------------------------------------------+
| 主控单元(STM32G474) |
| 内核 | 存储器 | FDCAN | 高级定时器 | ADC | DAC | SPI | GPIO |
+-----------------------------------------------------------------------------+
| | |
v v v
+----------------+ +----------------+ +----------------+
| CAN FD通信单元 | | 编码器接口单元 | | 功率驱动单元 |
+----------------+ +----------------+ +----------------+
| | |
v v v
+----------------+ +----------------+ +----------------+
| 上位机 | | 电感式编码器 | | 100W永磁同步电机|
+----------------+ +----------------+ +----------------+
5.2 电源管理单元设计
电源管理单元是整个系统的基础,负责为各个模块提供稳定的电源。本系统的电源输入为 24V DC,需要转换为 5V 和 3.3V 两种电压。
5.2.1 24V 转 5V 电路设计
24V 转 5V 电路主要为功率驱动电路的栅极驱动器和编码器提供电源。我们选用 TI 公司的 LM2596-5V 开关稳压器,它具有以下主要特点:
- 输入电压范围:4.5V~40V
- 输出电压:5V
- 输出电流:最大 3A
- 开关频率:150kHz
- 集成过流、过压和过热保护功能
LM2596-5V 的典型应用电路如图 5-2 所示:
plaintext
+24V ----+----+
| |
| [C1] 100uF/50V
| |
+----+----+
| |
| [D1] SS34
| |
+----+----+
| LM2596 |
|-IN OUT-|----+----+5V
|-GND FB-| |
+----+----+ |
| |
[L1] 33uH |
| |
+----+----+
|
[C2] 220uF/16V
|
GND
5.2.2 5V 转 3.3V 电路设计
5V 转 3.3V 电路主要为 STM32G474 微控制器和其他数字电路提供电源。我们选用 TI 公司的 AMS1117-3.3V 线性稳压器,它具有以下主要特点:
- 输入电压范围:4.75V~12V
- 输出电压:3.3V
- 输出电流:最大 1A
- 线性调整率:0.2%
- 负载调整率:0.4%
- 集成过流和过热保护功能
AMS1117-3.3V 的典型应用电路如图 5-3 所示:
plaintext
+5V ----+----+
| |
| [C1] 10uF/16V
| |
+----+----+
| AMS1117 |
|-IN OUT-|----+----+3.3V
|-GND | |
+---------+ |
|
[C2] 10uF/16V
|
GND
5.2.3 电源滤波与去耦设计
为了提高电源的稳定性和抗干扰能力,我们需要在电源输入端和各个芯片的电源引脚处添加滤波和去耦电容。
- 在电源输入端添加大容量的电解电容(100uF~220uF),用于滤除低频噪声
- 在各个芯片的电源引脚处添加 0.1uF 的陶瓷电容,用于滤除高频噪声
- 在 STM32G474 的 VREF + 引脚处添加 1uF 的陶瓷电容,用于提高 ADC 的精度
5.3 CAN FD 通信单元设计
CAN FD 通信单元主要由 STM32G474 内置的 FDCAN 控制器和外部 CAN FD 收发器组成。我们选用 TI 公司的 SN65HVD234 CAN FD 收发器,它具有以下主要特点:
- 支持最高 8Mbps 的通信速率
- 符合 ISO 11898-2:2016 标准
- 工作电压范围:3V~3.6V
- 低功耗模式:待机模式和休眠模式
- 集成过流、过压和过热保护功能
- 抗静电能力:±15kV(人体模型)
SN65HVD234 的典型应用电路如图 5-4 所示:
plaintext
STM32G474 FDCAN_TX ----+----+
| |
| [R1] 120Ω
| |
+----+----+
| |
| [R2] 120Ω
| |
STM32G474 FDCAN_RX ----+----+----+
| | |
| [C1] 100nF
| | |
+----+----+
|
+----+----+
| SN65HVD234 |
|-TXD CANH-|----+---- CAN_H
|-RXD CANL-|----+---- CAN_L
|-VCC GND-|---- GND
|-RS |
+-------------+
|
[R3] 10kΩ
|
GND
电路说明:
- R1 和 R2 是终端电阻,用于匹配总线阻抗,阻值为 120Ω
- C1 是电源去耦电容,用于滤除电源噪声
- R3 是模式选择电阻,将 RS 引脚接地,使收发器工作在正常模式
5.4 编码器接口单元设计
编码器接口单元实现 STM32G474 与 EVM58N 电感式编码器之间的 SSI 接口通信。如第 4 章所述,我们使用 STM32G474 的 SPI1 接口来模拟 SSI 接口。
编码器接口单元的电路如图 5-5 所示:
plaintext
EVM58N VCC ----+----+5V
|
[C1] 100nF
|
EVM58N GND ----+---- GND
EVM58N CLK ----+----+---- STM32G474 PA5 (SPI1_SCK)
|
[R1] 100Ω
|
GND
EVM58N DATA ----+----+---- STM32G474 PA6 (SPI1_MISO)
|
[R2] 100Ω
|
GND
电路说明:
- R1 和 R2 是限流电阻,用于保护 STM32G474 的 IO 引脚
- C1 是电源去耦电容,用于滤除电源噪声
5.5 电流采样单元设计
电流采样单元负责采集电机的三相电流,这是实现磁场定向控制(FOC)的关键。对于三相永磁同步电机,我们只需要采样两相电流,第三相电流可以通过基尔霍夫电流定律计算得到:IC=−IA−IB。
5.5.1 电流采样方法
常用的电流采样方法有以下几种:
- 串联电阻采样:在电机的相线上串联一个小阻值的采样电阻,通过测量电阻两端的电压来计算电流。这种方法简单、成本低,但会引入功率损耗
- 霍尔电流传感器采样:使用霍尔电流传感器来测量电流。这种方法精度高、无功率损耗,但成本较高
- 母线电流采样:在母线上串联一个采样电阻,通过测量母线电流来重构三相电流。这种方法成本低,但精度较低
在本项目中,我们将采用串联电阻采样法,因为它简单、成本低,并且对于 100W 的小功率电机来说,功率损耗可以接受。
5.5.2 采样电阻的选择
采样电阻的选择需要考虑以下几个因素:
- 阻值:阻值越大,采样电压越大,精度越高,但功率损耗也越大
- 功率:采样电阻的功率必须大于实际消耗的功率
- 精度:采样电阻的精度直接影响电流采样的精度
- 温度系数:采样电阻的温度系数越小,温度漂移越小
本项目的电机额定电流为 5A,峰值电流为 10A。我们选择阻值为 10mΩ、功率为 1W、精度为 1%、温度系数为 50ppm/℃的金属膜采样电阻。
当电流为 10A 时,采样电阻两端的电压为:V=I×R=10A×0.01Ω=0.1V。
5.5.3 信号调理电路设计
由于采样电阻两端的电压很小(最大 0.1V),并且是双极性的(电流可以双向流动),而 STM32G474 的 ADC 只能采样 0~3.3V 的单极性电压,因此需要设计信号调理电路,将双极性的小电压信号转换为 0~3.3V 的单极性电压信号。
信号调理电路主要由运算放大器组成,实现差分放大和电平偏移功能。我们选用 TI 公司的 LM358 运算放大器,它具有以下主要特点:
- 工作电压范围:3V~32V
- 增益带宽积:1MHz
- 输入失调电压:2mV
- 低功耗:每个放大器 0.5mA
信号调理电路如图 5-6 所示:
plaintext
采样电阻左端 ----+----+
| |
[R1] 1kΩ
| |
+----+----+
| |
[R2] 10kΩ
| |
采样电阻右端 ----+----+----+
| | |
[R3] 1kΩ |
| | |
+----+----+----+
| |
[R4] 10kΩ
| |
+----+----+
| |
1.65V参考电压 ----+----+----+----+----+----+---- ADC输入
| | | | |
[R5] 10kΩ | [C1] 100nF
| | |
+----+----+
|
GND
电路说明:
- R1、R2、R3、R4 组成差分放大电路,增益为Av=R2/R1=10
- 1.65V 参考电压由 STM32G474 的 DAC 输出提供,用于电平偏移
- 经过信号调理后,输入到 ADC 的电压为:采样
- 当采样电压为 - 0.1V 时,VADC=1.65V−1V=0.65V
- 当采样电压为 + 0.1V 时,VADC=1.65V+1V=2.65V
- 这样就将 - 0.1V~+0.1V 的双极性电压转换为了 0.65V~2.65V 的单极性电压,完全在 ADC 的输入范围内
5.6 电压采样单元设计
电压采样单元负责采集母线电压,用于过压和欠压保护,以及电机控制算法中的电压补偿。
电压采样电路采用电阻分压的方法,将 24V 的母线电压转换为 0~3.3V 的电压,输入到 STM32G474 的 ADC。
电压采样电路如图 5-7 所示:
plaintext
母线电压(24V) ----+----+
| |
[R1] 100kΩ
| |
+----+----+---- ADC输入
| |
[R2] 15kΩ
| |
+----+---- GND
|
[C1] 100nF
|
GND
电路说明:
- R1 和 R2 组成分压电路,分压比为R2/(R1+R2)=15/(100+15)≈0.1304
- 当母线电压为 24V 时,ADC 输入电压为:24V×0.1304≈3.13V,在 ADC 的输入范围内
- C1 是滤波电容,用于滤除电压噪声
5.7 功率驱动单元设计
功率驱动单元是整个系统的核心,负责将 STM32G474 输出的 PWM 信号转换为驱动电机的大电流信号。我们采用三相全桥驱动电路,使用 6 个 N 沟道 MOSFET 组成 H 桥。
5.7.1 MOSFET 的选择
MOSFET 的选择需要考虑以下几个因素:
- 漏源电压(VDS):必须大于母线电压的最大值,本项目母线电压为 24V,选择 VDS≥60V 的 MOSFET
- 漏极电流(ID):必须大于电机的峰值电流,本项目电机峰值电流为 10A,选择 ID≥20A 的 MOSFET
- 导通电阻(RDS (on)):导通电阻越小,功率损耗越小,效率越高
- 栅极电荷(Qg):栅极电荷越小,开关速度越快,开关损耗越小
- 封装:选择体积小、散热好的封装,如 SO-8 或 DFN
我们选用 Infineon 公司的 IRL7833PBF N 沟道 MOSFET,它具有以下主要特点:
- 漏源电压:60V
- 连续漏极电流:33A
- 脉冲漏极电流:130A
- 导通电阻:7.5mΩ(VGS=10V)
- 栅极电荷:45nC
- 封装:TO-220
5.7.2 栅极驱动器的选择
由于 STM32G474 的 IO 引脚输出电流有限(最大 25mA),不能直接驱动 MOSFET 的栅极,因此需要使用栅极驱动器来放大驱动电流。
我们选用 TI 公司的 DRV8301 三相栅极驱动器,它具有以下主要特点:
- 工作电压范围:6V~60V
- 驱动电流:1.7A/2.3A(源极 / 漏极)
- 集成三个半桥驱动器
- 支持 100% 占空比
- 集成过流、过压、欠压和过热保护功能
- 集成电流采样放大器
- SPI 接口用于配置和诊断
DRV8301 的内部结构如图 5-8 所示:
plaintext
+-----------------------------------------------------------------------------+
| DRV8301 |
+-----------------------------------------------------------------------------+
| 电源管理 | 电荷泵 | 三个半桥驱动器 | 电流采样放大器 | SPI接口 | 保护电路 |
+-----------------------------------------------------------------------------+
| INHA | INLA | INHB | INLB | INHC | INLC | SOA | SOB | SOC | SCK | SDI | SDO |
+-----------------------------------------------------------------------------+
| GHA | GLA | GHB | GLB | GHC | GLC | SHA | SHB | SHC | PVDD | GND |
+-----------------------------------------------------------------------------+
5.7.3 三相全桥驱动电路设计
三相全桥驱动电路由 DRV8301 栅极驱动器和 6 个 IRL7833PBF MOSFET 组成,如图 5-9 所示:
plaintext
+24V ----+----+----+----+----+----+
| | | | | |
[Q1] [Q3] [Q5] | | |
| | | | | |
+----+----+----+ | |
| | | | |
[Q2] [Q4] [Q6] | |
| | | | |
+----+----+----+----+----+---- GND
| | |
| | +---- 电机C相
| |
| +--------- 电机B相
|
+-------------- 电机A相
DRV8301 GHA ---- Q1栅极
DRV8301 GLA ---- Q2栅极
DRV8301 GHB ---- Q3栅极
DRV8301 GLB ---- Q4栅极
DRV8301 GHC ---- Q5栅极
DRV8301 GLC ---- Q6栅极
DRV8301 SHA ---- Q2源极
DRV8301 SHB ---- Q4源极
DRV8301 SHC ---- Q6源极
STM32G474 TIM1_CH1 ---- DRV8301 INHA
STM32G474 TIM1_CH1N ---- DRV8301 INLA
STM32G474 TIM1_CH2 ---- DRV8301 INHB
STM32G474 TIM1_CH2N ---- DRV8301 INLB
STM32G474 TIM1_CH3 ---- DRV8301 INHC
STM32G474 TIM1_CH3N ---- DRV8301 INLC
电路说明:
- Q1 和 Q2 组成 A 相半桥,Q3 和 Q4 组成 B 相半桥,Q5 和 Q6 组成 C 相半桥
- DRV8301 的 GHA~GLC 引脚驱动上桥臂 MOSFET 的栅极,GLA~GLC 引脚驱动下桥臂 MOSFET 的栅极
- DRV8301 的 SHA~SHC 引脚连接到下桥臂 MOSFET 的源极,用于电流采样
- STM32G474 的 TIM1 高级定时器输出 6 路互补 PWM 信号,输入到 DRV8301 的 INHA~INLC 和 INLA~INLC 引脚
5.8 保护单元设计
为了保证系统的安全可靠运行,我们需要设计完善的保护电路,实现过流、过压、欠压和过温保护功能。
5.8.1 过流保护
过流保护用于防止电机和功率电路因过流而损坏。DRV8301 集成了硬件过流保护功能,当检测到过流时,会自动关断所有 MOSFET,并通过 SPI 接口报告错误。
我们可以通过 SPI 接口配置 DRV8301 的过流保护阈值。本项目将过流保护阈值设置为 15A,当电流超过 15A 时,触发过流保护。
5.8.2 过压和欠压保护
过压和欠压保护用于防止电源电压异常对系统造成损坏。STM32G474 通过 ADC 采集母线电压,当母线电压超过 28V(过压)或低于 18V(欠压)时,触发保护,关断所有 MOSFET,并向上位机发送错误报警。
5.8.3 过温保护
过温保护用于防止功率电路因温度过高而损坏。我们在 PCB 上安装一个 NTC 热敏电阻,用于检测功率电路的温度。STM32G474 通过 ADC 采集 NTC 热敏电阻的电压,计算出温度。当温度超过 85℃时,触发过温保护,关断所有 MOSFET,并向上位机发送错误报警。
NTC 温度采样电路如图 5-10 所示:
plaintext
+3.3V ----+----+
| |
[R1] 10kΩ
| |
+----+----+---- ADC输入
| |
[NTC] 10kΩ
| |
+----+---- GND
|
[C1] 100nF
|
GND
电路说明:
- R1 和 NTC 组成分压电路
- NTC 的阻值随温度升高而减小
- 通过 ADC 采集分压电压,就可以计算出温度
5.9 PCB 设计要点
PCB 设计是硬件系统设计中非常重要的一环,直接影响系统的性能和可靠性。本项目的 PCB 设计需要注意以下几个要点:
5.9.1 电源和地的设计
- 采用大面积的电源和地平面,减小电源阻抗和噪声
- 数字地和模拟地分开,最后通过磁珠单点连接
- 在各个芯片的电源引脚处添加 0.1uF 的去耦电容,尽量靠近芯片引脚
- 电源走线要宽,电流越大,走线越宽
5.9.2 信号走线的设计
- 高速信号(如 PWM 信号、SPI 信号、CAN FD 信号)要尽量短,减少干扰
- 差分信号(如 CAN FD 信号)要走差分对,长度相等,间距一致
- 模拟信号(如电流采样信号、电压采样信号)要远离数字信号和功率信号
- 功率走线要宽,并且要考虑散热问题
5.9.3 散热设计
- 功率器件(如 MOSFET、DRV8301)要安装散热片,并且要与 PCB 的散热铜皮连接
- 在 PCB 上大面积铺铜,提高散热能力
- 合理布局,将发热器件分散布置,避免局部过热
5.9.4 电磁兼容设计
- 在电源输入端添加 EMI 滤波器,抑制传导干扰
- 采用屏蔽电缆连接编码器和 CAN FD 总线
- PCB 的边缘不要走高速信号和功率信号
- 合理布置接地孔,减小接地阻抗
5.10 本章小结
本章详细介绍了 100W 关节电机的硬件设计,包括硬件系统总体设计、电源管理单元、CAN FD 通信单元、编码器接口单元、电流采样单元、电压采样单元、功率驱动单元和保护单元的设计。我们重点分析了各个单元的电路原理和器件选型,并给出了详细的电路原理图。最后,我们介绍了 PCB 设计的要点。通过本章的学习,读者应该能够独立完成 100W 关节电机控制器的硬件设计。
第 6 章 永磁同步电机控制理论基础
6.1 永磁同步电机概述
永磁同步电机(Permanent Magnet Synchronous Motor,PMSM)是一种利用永磁体产生磁场的同步电机。与传统的电励磁同步电机相比,永磁同步电机具有以下主要优点:
- 效率高:没有励磁损耗,效率可以达到 90% 以上
- 功率密度高:体积小,重量轻
- 转矩脉动小:运行平稳,噪音低
- 响应速度快:动态性能好
- 可靠性高:结构简单,维护方便
永磁同步电机广泛应用于工业自动化、机器人、数控机床、电动汽车等领域。根据转子结构的不同,永磁同步电机可以分为表贴式永磁同步电机(SPMSM)和内置式永磁同步电机(IPMSM)两大类。
6.1.1 表贴式永磁同步电机(SPMSM)
表贴式永磁同步电机的永磁体粘贴在转子的表面,如图 6-1 所示。这种电机的特点是:
- 转子结构简单,制造成本低
- 气隙均匀,电感Ld=Lq
- 转矩脉动小
- 弱磁能力差
- 适合低速和中速应用
6.1.2 内置式永磁同步电机(IPMSM)
内置式永磁同步电机的永磁体嵌入在转子内部,如图 6-2 所示。这种电机的特点是:
- 转子结构复杂,制造成本高
- 气隙不均匀,电感Ld<Lq
- 可以利用磁阻转矩,提高转矩密度
- 弱磁能力强
- 适合高速应用
本项目使用的是表贴式永磁同步电机,额定功率 100W,额定电压 24V,额定电流 5A,额定转速 3000rpm,极对数为 4。
6.2 永磁同步电机的数学模型
为了实现对永磁同步电机的精确控制,我们需要建立其数学模型。永磁同步电机的数学模型可以在不同的坐标系下建立,常用的坐标系有:
- 三相静止坐标系(ABC 坐标系)
- 两相静止坐标系(αβ 坐标系)
- 两相旋转坐标系(dq 坐标系)
6.2.1 三相静止坐标系下的数学模型
在三相静止坐标系下,永磁同步电机的电压方程为:

其中,uA,uB,uC为三相定子电压,Rs为定子电阻,iA,iB,iC为三相定子电流,ψA,ψB,ψC为三相定子磁链。
三相定子磁链方程为:

其中,LAA,LBB,LCC为定子自感,LAB,LAC,LBA,LBC,LCA,LCB为定子互感,ψf为永磁体磁链,θe为转子电气角度。
电磁转矩方程为:

其中,pn为极对数。
运动方程为:
其中,J为转动惯量,ωm为机械角速度,TL为负载转矩,B为阻尼系数。
可以看出,在三相静止坐标系下,永磁同步电机的数学模型非常复杂,是一个多变量、强耦合、非线性的系统,不利于控制器的设计。因此,我们需要通过坐标变换将其转换到两相旋转坐标系下,简化数学模型。
6.2.2 坐标变换
坐标变换是永磁同步电机控制中的关键技术,包括 Clarke 变换和 Park 变换。
Clarke 变换:将三相静止坐标系(ABC 坐标系)下的变量转换为两相静止坐标系(αβ 坐标系)下的变量。
Clarke 变换的矩阵形式为:

反 Clarke 变换的矩阵形式为:

Park 变换:将两相静止坐标系(αβ 坐标系)下的变量转换为两相旋转坐标系(dq 坐标系)下的变量。dq 坐标系与转子同步旋转,d 轴与转子的 d 轴(永磁体磁场方向)重合,q 轴超前 d 轴 90 度。