<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      計算和生成正弦/余弦查找表(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 路橋臂驅動。

      軟件實現:

      1. 建立查表

        • 生成一個標準的 sin/cos 查找表(定點或浮點均可);
        • 可共用一組表,通過相位偏移來獲得兩相驅動。
      2. PWM 輸出控制

        • 使用 DMA 或中斷循環將占空比 dutyA+dutyA–dutyB+dutyB– 分別寫入定時器比較寄存器:
          TIMx->CCR1 = dutyA_plus;
          TIMx->CCR2 = dutyA_minus;
          TIMx->CCR3 = dutyB_plus;
          TIMx->CCR4 = dutyB_minus;
          
      3. 主控只需控制步進索引

        • 通過簡單的索引移動控制相位旋轉(例如步進方向):
          idx = (idx ± 1) % TABLE_SIZE;
          
        • 其余部分交由 DMA 自動完成,占空比更新穩定高效。

      ? 這樣,你可以實現高精度、高細分、低抖動的步進電機控制系統,尤其適合微步驅動(Microstepping)。

      posted @ 2025-07-23 09:58  阿坦  閱讀(116)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美人与动zozo| 国产久爱免费精品视频| 国偷自产一区二区三区在线视频| 中文字幕理伦午夜福利片| 中文字幕日韩有码av| 国产精品午夜福利91| 少妇办公室好紧好爽再浪一点| 亚洲国产日韩a在线亚洲| 免费福利视频一区二区三区高清| 亚洲精品国产精品国在线| 性欧美大战久久久久久久 | 中文字幕av一区二区| 在线a人片免费观看| 中文字幕无码视频手机免费看| 久久综合综合久久综合| 亚洲一级特黄大片一级特黄| 男女性高爱潮免费网站| 婷婷久久香蕉五月综合加勒比| 四虎永久精品免费视频| 中文字幕一区日韩精品| 体态丰腴的微胖熟女的特征| 国产精品任我爽爆在线播放6080 | 好深好湿好硬顶到了好爽| 自偷自拍亚洲综合精品| 欧美 亚洲 日韩 在线综合| 99精品国产一区二区三区不卡| 欧美精品亚洲精品日韩专区| 国产精品一区二区三区黄色| 无码福利写真片视频在线播放| 2019国产精品青青草原| 国日韩精品一区二区三区| 日韩人妻无码一区二区三区| 亚洲区欧美区综合区自拍区| 左贡县| 国产综合精品一区二区三区| 亚洲精品男男一区二区| 无码精品人妻一区二区三区中| 色婷婷欧美在线播放内射| 妺妺窝人体色WWW看人体| 日韩人妻少妇一区二区三区| 无码日韩人妻精品久久蜜桃|