一、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\)

换算公式

  1. 浮点数 → Q15 定点数:

\(\boldsymbol{Q15\_val = (int16\_t)(float\_val \times 32768.0)}\)

  1. 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) )

原理:

  1. 先强制转 32 位int32_t做乘法,避免 16 位相乘溢出
  2. 乘积右移 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 定点?

  1. M0 内核单片机无硬件 FPUfloat浮点运算极慢,会导致控制周期超时;
  2. 定点整数运算只需要加减乘移位,单周期执行,控制频率可以跑到 10kHz~20kHz;
  3. 电流、角度、PI 输出都在[-1,1]区间,刚好完美适配 Q15 的数值范围;
  4. 三角函数查表、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);
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐