計算和生成正弦/余弦查找表(LUT)
計算和生成正弦/余弦查找表(LUT)主要分為以下幾個步驟:
1. 確定分辨率(表長度)
- 設你要做 N 細分(microsteps),則表長通常取 N(也可以取 N+1,方便首尾相接)。
- 例如要 256 細分,就令
TABLE_SIZE = 256。
2. 計算角度增量
每一個表項對應的電角度增量為:
\[ \Delta\theta = \frac{2\pi}{\text{TABLE_SIZE}}
\]
3. 逐項計算浮點正余弦值
對每個索引 \(i = 0,1,\dots,\text{TABLE_SIZE}-1\),計算:
\[ \theta_i = i \times \Delta\theta,
\quad
\text{sinTbl}[i] = \sin(\theta_i),
\quad
\text{cosTbl}[i] = \cos(\theta_i).
\]
示例(偽碼):
for (int i = 0; i < TABLE_SIZE; i++) {
float theta = 2.0f * M_PI * i / TABLE_SIZE;
sinTbl[i] = sinf(theta);
cosTbl[i] = cosf(theta);
}
4. 映射到定時器/PWM 占空比
單片機上用的是整數占空比,一般把 ?1…+1 映射到 0…PWM_MAX:
\[ \text{CCR_value} = \bigl(\text{wave} + 1.0\bigr)\times \frac{\text{PWM_MAX}}{2}
\]
其中:
wave是上一步得到的 sinTbl[i] 或 cosTbl[i];PWM_MAX是定時器的自動重裝載值(ARR),比如 1000、4095、65535 等。
uint16_t duty = (uint16_t)((sinTbl[i] + 1.0f) * 0.5f * PWM_MAX);
5. 數據類型與存儲優化
-
浮點表:如果 MCU 支持浮點運算,可直接存
float。 -
定點表:如果要節省 Flash,可把正余弦值乘以一個定點因子(如 32767),存為
int16_t:\[ \text{sinQ}[i] = \text{round}\bigl(\sin(\theta_i)\times 32767\bigr) \]然后在運行時再通過位移或乘法映射到占空比。
6. 首尾相連與插值
- 通常第 0 項和第 N 項都對應角度 0°(或 360°),為了避免重復存,可只存前 N 項。
- 如果需要更高精度,也可以在運行時做線性插值,但大多數應用直接用查表即可。
7. 完整示例
// 全局或靜態定義
#define TABLE_SIZE 256
#define PWM_MAX 4095
int16_t sinTblQ[TABLE_SIZE];
int16_t cosTblQ[TABLE_SIZE];
// 初始化時填充定點查表
void InitLUT(void) {
for (int i = 0; i < TABLE_SIZE; i++) {
float theta = 2.0f * M_PI * i / TABLE_SIZE;
sinTblQ[i] = (int16_t)(sinf(theta) * 32767);
cosTblQ[i] = (int16_t)(cosf(theta) * 32767);
}
}
// 在輸出時:
uint16_t GetPWMDuty(int idx, int16_t *tblQ) {
// 先轉換到 0…1,再乘 PWM_MAX
return (uint16_t)(( (tblQ[idx] + 32767) / 65535.0f ) * PWM_MAX);
}
// 在輸出時,如果你想獲取 sin 相的 PWM 占空比,就這樣調用:
uint16_t dutyA = GetPWMDuty(idx, sinTblQ); // A 相占空比
// 獲取 cos 相:
uint16_t dutyB = GetPWMDuty(idx, cosTblQ); // B 相占空比
然后再把這兩個值dutyA 和 dutyB分別寫入對應的定時器比較寄存器(CCR),驅動 A4950 的兩路橋臂輸出相應電流,從而合成角度為 θ = idx×(2π/TABLE_SIZE) 的磁場矢量。
這樣,你就能按任意細分數 N 動態生成對應的正/余弦查找表,并映射到定時器占空比,用于精確微步(Microstepping)控制。
推薦實踐
硬件選型:
- 使用 STM32 的高級定時器(TIM1 或 TIM8),它們通常具備:
- 4 路獨立 PWM 輸出,或
- 2 路互補輸出(適合帶死區控制的驅動)
- 能夠滿足控制一臺雙極步進電機所需的 4 路橋臂驅動。
軟件實現:
-
建立查表
- 生成一個標準的
sin/cos查找表(定點或浮點均可); - 可共用一組表,通過相位偏移來獲得兩相驅動。
- 生成一個標準的
-
PWM 輸出控制
- 使用 DMA 或中斷循環將占空比
dutyA+、dutyA–、dutyB+、dutyB–分別寫入定時器比較寄存器:TIMx->CCR1 = dutyA_plus; TIMx->CCR2 = dutyA_minus; TIMx->CCR3 = dutyB_plus; TIMx->CCR4 = dutyB_minus;
- 使用 DMA 或中斷循環將占空比
-
主控只需控制步進索引
- 通過簡單的索引移動控制相位旋轉(例如步進方向):
idx = (idx ± 1) % TABLE_SIZE; - 其余部分交由 DMA 自動完成,占空比更新穩定高效。
- 通過簡單的索引移動控制相位旋轉(例如步進方向):
? 這樣,你可以實現高精度、高細分、低抖動的步進電機控制系統,尤其適合微步驅動(Microstepping)。

浙公網安備 33010602011771號