This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BLDC PWM 的频率斜升

Guru**** 2538950 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/613538/frequency-ramp-for-pwm-for-bldc

你(们)好。

我想编写一个代码、以启动我的 BLDC。 我想将电压和频率设置为两个所需的值。 使用 PWM 时、电机应从零开始到所需的值、例如斜坡功能。 代码应像变频器一样工作。

对于代码、我将执行实验11、并添加了一些行。 当我选择低电压(3伏)和低频率(10 Hz)时、电机开始旋转。 但代码应适用于每个频率和电压。  

我希望有人会有一个有帮助的想法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否发布您在 lab11中添加的代码? 您希望在 lab11中设置什么电压和频率?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我为我的代码添加了标头和源文件("hochlauf.h"和"hochlauf.c")。 我发现、有一个数学块(rampgen)、它会生成一个斜坡(我想)。 我复制了项目文件夹中的这个头文件。 是否可以使用此宏来斜升频率? 我不知道变量"Stepanglemax"和"Stepanglem"是什么意思以及它们应该得到什么值。

    由于我使用的是德国自变量捆、我会向您解释:

    ***_soll =设定值

    ***_ist =实际值

    在这里、我的代码:

    ---- 霍克劳夫

    #ifndef HOCHLAUF_H_
    #define HOCHLAUF_H_

    #include "sw/modules/math/src/32b/math.h"
    #include "sw/modules/IQMath/src/32b/IQmathLib.h"
    #include "user.h"
    #include "sw/modules/est/src/est_states.h"
    #include "rampgen.h"

    #define    USER_MATH_CONST1       ((float_t)((float_t) 0.06)/((float_t)(MATH_two_PI)))
    #define    USER_TS                ((float_t)((float_t)(1)/((float_t) USER_EST_FREQ_Hz))
    #define    USER_MATH_CONST2       ((float_t)(50*MATH_two_pi*USER_TS)

    typedef 结构_HOCHLAUF_Obj_

       float_t 相位;
       float_t freq_soll;
       float_t freq_ist;
       float_t 振幅_soll;
       float_t 振幅_ist;
       float_t inc_u;
       EST_State_e estState;
     } HOCHLAUF_Obj;

    typedef struct _HOCHLAUF_Obj_* HOCHLAUF_Handle;

    HOCHLAUF_Handle HOCHLAUF_INIT (void *pMemory、const size_t numBytes);

    void HOCHLAUF_setParams (HOCHLAUF_Handle handle);

    void HOCHLAUF_RESET (HOCHLAUF_Handle handle);

    void HOCHLAUF_run (HOCHLAUF_Handle handle、MATH_vec2 * pVab);

    void HOCHLAUF_setIdle (HOCHLAUF_Handle handle);

    EST_State_e HOCHLAUF_getState (HOCHLAUF_Handle handle);

    void HOCHLAUF_setRunning (HOCHLAUF_Handle handle);

    #endif /* HOCHLAUF_H_*

    ----霍克劳夫 c ----

    #include "hochlauf.h"

    HOCHLAUF_Handle HOCHLAUF_INIT (void *pMemory、const size_t numBytes)

       HOCHLAUF_Handle handle;
       if (numBytes < sizeof (HOCHLAUF_Obj))
       {
           返回((HOCHLAUF_Handle) NULL);
       }
       //分配句柄
       Handle =(HOCHLAUF_Handle) pMemory;
       返回(句柄);


    void HOCHLAUF_setParams (HOCHLAUF_Handle handle)

       HOCHLAUF_Obj *obj =(HOCHLAUF_Obj*)句柄;
       obj->sulation_soll = 3;
       obj->national_ist = 0;
       obj->inc_u = 0.5;
       obj->freq_soll = 5* MATH_two_pi;
       obj->freq_ist = 0;
      obj->phase = 0;
      obj->estState = EST_State_Idle;
     }
    void HOCHLAUF_RESET (HOCHLAUF_Handle handle)

       HOCHLAUF_Obj *obj =(HOCHLAUF_Obj*)句柄;
       obj->phase = 0;
      }

    void HOCHLAUF_run (HOCHLAUF_Handle handle、MATH_vec2 * pVab)

       HOCHLAUF_Obj *obj =(HOCHLAUF_Obj*)句柄;

       if (obj->estState ==EST_State_OnLine)
       {      
             RAMPGEN rg1 = RAMPGEN_DEFAULTS;
             rg1.Freq = 0;
             RG_MACRO (rg1);
             obj->freq_ist = rg1.out;
          //Abfrage ob frequenz_Soll erreicht ist
              if (obj->freq_ist >obj->freq_soll)
              obj->freq_ist = obj->freq_soll;

           float_t PHASE_OLD = obj->PHASE;
          obj->phase =(obj->freq_ist * user_TS + PHASE_OLD);

          if (obj->phase > MATH_Two _PI)       //Abfrage nach 2 Pi
             obj->phase = obj->phase - MATH_two_pi;

          obj->sample_ist = obj->freq_ist * obj->inc_u;// Erhöhen der Amplitude

          if (obj->page_ist > obj->page_soll)// Abfrage ob Amplanduren_Solwert erreicht ist
              obj->幅度_ist = obj->幅度_soll;

           _IQ 放大器=_IQ (obj->vamp_ist/USER_IQ_FULL_SCALE_VOLTAGE_V);
           _iq phase _IQ =_IQ (obj->phase / Math_two_pi);
           pVab->value[0]=_IQmpy (amp、_IQsincPU (PHASE_IQ));   //β- Komponente
           pVab->value[1]=_IQmpy (amp、_IQcosPU (PHASE_IQ));   // alpha-Komponente
       }
       其他
       {
           obj->phase = 0;
           pVab->value[0]= 0;
           pVab->value[1]= 0;
       }


    void HOCHLAUF_setIdle (HOCHLAUF_Handle handle)

       HOCHLAUF_Obj *obj =(HOCHLAUF_Obj*)句柄;
      obj->phase = 0;
       obj->estState = EST_State_Idle;


    void HOCHLAUF_setRunning (HOCHLAUF_Handle handle)

       HOCHLAUF_Obj *obj =(HOCHLAUF_Obj*)句柄;
        obj->estState = EST_State_OnLine;


    EST_State_e HOCHLAUF_getState (HOCHLAUF_Handle handle)

       HOCHLAUF_Obj *obj =(HOCHLAUF_Obj*)句柄;
       返回 obj->estState;

    ---结束---

    我尝试使用该代码启动 BLDC、但电机未旋转。

    我希望你能帮助我。

    此致!