简单理解:为什么电机 FOC 一定要用 Q15 定点?
·
一、Q15 是什么?(定点数格式,电机 FOC 控制最常用)
Q 格式是定点小数表示法,用来在没有硬件 FPU 的单片机(比如 KY32M0、STM32F1、M0 内核)上,用整数实现小数运算,避免浮点float运算慢、占用资源高的问题。
Q15 核心定义
- 用 16 位有符号整型
int16_t存储小数 - 最高位:符号位(0 正、1 负)
- 低 15 位:小数位 → 缩放系数:\(\boldsymbol{2^{15}=32768}\)
- 表示范围:\(\boldsymbol{[-1,\ 0.999969482421875]}\) 最小值:
-32768→ 对应十进制-1.0最大值:32767→ 对应十进制 \(\displaystyle \frac{32767}{32768}\approx0.99997\)
换算公式
- 浮点数 → Q15 定点数:
\(\boldsymbol{Q15\_val = (int16\_t)(float\_val \times 32768.0)}\)
- Q15 定点数 → 浮点数:
\(\boldsymbol{float\_val = Q15\_val \div 32768.0}\)
二、常用 Q 格式对照表(电机控制高频使用)
| 格式 | 数据类型 | 缩放因子 \(2^N\) | 数值表示范围 | 典型用途 |
|---|---|---|---|---|
| Q15 | int16_t | \(2^{15}=32768\) | \([-1,\ 0.99997]\) | FOC SVPWM、角度、电流、PI 调节器 |
| Q14 | int16_t | \(2^{14}=16384\) | \([-2,\ 1.9999]\) | 稍微大范围的小数运算 |
| Q31 | int32_t | \(2^{31}=2147483648\) | \([-1,\ 0.9999999995]\) | 定点乘法中间防溢出、高精度运算 |
三、你工程里常见的 Q15 数学宏详解
1. 基础缩放宏
#define Q15_SCALE 32768L
#define Q15_MAX 32767
#define Q15_MIN -32768
Q15_SCALE:缩放系数,浮点数转定点需要乘以 32768
示例
// 浮点数0.5转Q15
int16_t val_Q15 = (int16_t)(0.5f * 32768); // = 16384
// Q15转回浮点数
float val_float = 16384 / 32768.0f; // = 0.5
2. Q15 乘法核心宏(最关键)
两个 Q15 数相乘: \(Q15\_a \times Q15\_b\),本质是 \(\displaystyle \frac{A}{32768} \times \frac{B}{32768} = \frac{A\times B}{32768^2}\) 结果需要右移 15 位还原缩放,防止溢出:
#define Q15_MUL(a,b) ( (int16_t)(((int32_t)(a)*(b)) >> 15) )
原理:
- 先强制转 32 位
int32_t做乘法,避免 16 位相乘溢出 - 乘积右移 15 位,抵消两次 ×32768 的缩放,还原为标准 Q15 格式
3. 常用三角函数宏(FOC 必用)
#define Q15_SIN_0 0
#define Q15_SIN_90 32767 // sin(90°)=1.0 → Q15最大值
#define Q15_SIN_30 16384 // sin(30°)=0.5 → 0.5*32768=16384
正弦、余弦表全部预存为 Q15 格式,查表快速计算电角度、SVPWM 矢量。
4. 限幅宏(防止 Q15 溢出)
#define Q15_SAT(x) ( (x)>32767 ? 32767 : ((x)<-32768 ? -32768 : (x)) )
把运算结果限制在 Q15 合法范围[-32768, 32767],避免数值溢出变成负数,导致电机失控。
5. Q 格式互相转换宏
// Q15转Q31:左移16位提升精度
#define Q15_TO_Q31(x) ((int32_t)(x) << 16)
// Q31转Q15:右移16位截断高精度
#define Q31_TO_Q15(x) ((int16_t)(((x) >> 16) & 0xFFFF))
四、为什么电机 FOC 一定要用 Q15 定点?
- M0 内核单片机无硬件 FPU,
float浮点运算极慢,会导致控制周期超时; - 定点整数运算只需要加减乘移位,单周期执行,控制频率可以跑到 10kHz~20kHz;
- 电流、角度、PI 输出都在
[-1,1]区间,刚好完美适配 Q15 的数值范围; - 三角函数查表、SVPWM 扇区计算、Clarke/Park 变换全部基于 Q15 定点实现。
五、举个 FOC 实际运算例子
已知:电角度 theta_Q15(Q15 格式),需要计算 \(\sin\theta \cdot Iq\)
int16_t sin_theta = Q15_SinTable[theta_Q15]; // 查表得到Q15正弦值
int16_t Iq_Q15 = 16384; // Iq=0.5
int16_t res = Q15_MUL(sin_theta, Iq_Q15);更多推荐

所有评论(0)