> For the complete documentation index, see [llms.txt](https://tk233.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tk233.gitbook.io/notes/motor-control/recoil-foc-motor-controller/0x01.-components.md).

# 0x01. Components

## 1. 编码器 Encoder

### AS5600

[AS5600](https://ams.com/documents/20143/36005/AS5600_DS000365_5-00.pdf) 是一个 12 bit I2C 通讯绝对角度磁编码器，支持最大 1000 kHz (I2C Fast Mode Plus) I2C 通讯速率。

AS5600 支持重复读操作，因此只需要初始化时传送一个 I2C 写入帧，将目标寄存器地址写入，之后只需反复发送 I2C 读取帧即可重复读取目标寄存器的最新值。

### AS5047P

## 2. 驱动模块 PowerStage

常见电机驱动的 PWM 频率为 10 kHz \~30 kHz，频率太低就会进入人耳能够识别的频率，会产生可闻噪声 (人耳可识别的频率范围为 20 Hz \~ 20 kHz)，而 PWM 频率太高又会增加 MOSFET 的开关损耗。

我们使用 center-aligned PWM 模式，这样每个周期 MOSFET 只会开关一次，相比 edge-aligned 下的每周期两次会减少很多开关损耗。

同时，因为我们使用的是双侧 NMOS 的驱动模式，因此 Hi-side 有最大的开启时间，否则 bootstrap 电路的电容电荷会流失，使 Hi-side 错误地关闭。因此，PWM 占空比不能占满 100%。我们留出 2% 的冗余空间，因此 PWM 输出范围即为 2% - 98%。

### 2.1 电流采样

我们使用的是连接在 Lo-side MOSFET 后面的采样电阻，因此只有当 Lo-side MOSFET 打开时我们才能正确地进行电流采样，因此我们需要将 ADC 和 TIM 同步。我们选用 TIM 闲置的一路产生内部 PWM 信号，并将计数器阈值设置为 TIM 的 ARR - 1。由此，我们实现在 TIM 计数器达到最高的时候，PWM 输出都为 0 的时刻开始 ADC 采样。

同样，因为我们需要采样三相电流，所以必须保证三相 Lo-side MOSFET 都有打开的时刻。上文所述的 2% - 98% 保障了这点，使我们有相对充裕的采样时间。

## 3. 电机 Motor

### 3.1 电机级对 Motor Pole Pair

常见的 BLDC 电机都由多极对构成，磁极极对遵循以下规律：

![ekJM2.jpg](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8a518ba4-35ea-4fe9-941c-77ae261a921a/ekJM2.jpg)

电机的磁极对数量为 0.5 x 转子上磁铁数量

例如，下方这个电机的磁极对数量为 14。

![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e3ae33bb-d66f-449d-b68b-8fc5e50fdc24/Untitled.png)

我们可以将磁极对数量视为电机自带的减速器。

在最简单的 1 磁极对 (2 个磁极) 情况下，我们按照 SVPWM 驱动电角度旋转一周，电机的机械角度也会旋转一圈，减速比为 1:1。

在 14 磁极对 (28 磁极) 情况下，电角度旋转一周，机械角度旋转 1/14 圈，减速比即为 1:14。

因为最终我们希望我们对于电机控制器的输入是扭矩，而不是电流，所以我们还需要将它们转化一下：

$$
\tau = \frac{8.3 \times I\_q}{K\_V}
$$

$$
I\_q = \frac{\tau K\_V}{8.3}
$$

[How to estimate the torque of a BLDC (PMSM) electric motor using only its Kv and current draw](https://things-in-motion.blogspot.com/2018/12/how-to-estimate-torque-of-bldc-pmsm.html)

### 3.2 电机初始化校准 Motor Calibration

因为机械固定的误差，电机线圈的电角度和编码器角度之间会存在一个误差，因此我们需要使用一个初始化流程来检测这个误差。

在初始化流程中，我们首先将电机电角度设定到 0 位置，并使用开环控制输出一个特定的相电压。为了使电机能够准确旋转到对应的 0 位置上，我们需要将电流设定为一个相对较大的值。更优雅的做法是逐步增加相电压，并检测编码器读数是否变化，从而确定转子是否就位。

在电机旋转到 0 位置上后，这时编码器读取的数值就是电机电角度和编码器角度的误差值了。但由于电机和编码器之间还存在一个 n\_pole\_pair 倍的减速比，所以实际的电角度误差为

$$
\angle\_{flux-angle-offset} = \angle\_{encoder} \times n\_pole\_pair
$$
