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.

[参考译文] LAUNCHXL-F28069M:构建三相 VSI -生成参考波形

Guru**** 2589265 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/662414/launchxl-f28069m-building-a-three-phase-vsi---generating-the-reference-waveform

器件型号:LAUNCHXL-F28069M
Thread 中讨论的其他器件:controlSUITE

您好!

我正在尝试构建一个简单的三相电压源逆变器、以使用六开关逆变器模块来驱动三相感应机器。 到目前为止、我已经配置了 ePWM4、5和6来生成互补对的 PWM 信号、其中有一个死区、我将使用它们分别控制逆变器的三个桥臂。

目前、我只为这些 PWM 信号指定了占空比、以便我可以在示波器上验证它们。

uint32 ePWMdutyA = 500;
uint32 ePWMdutyB = 600;
uint32 ePWMdutyC = 700;

......

EPwm4Regs.CMPA.half.CMPA = ePWMdutyA; //调整输出 ePWM4A
EPwm5Regs.CMPA.half.CMPA = ePWMdutyB 的占空比; //调整输出 ePWM5A
EPwm6Regs.CMPA.half.CMPA = ePWMdutyC 的占空比; //调整输出 ePWM6A 的占空比 

我在 main()中执行此操作,它的行为符合我的预期。  

不过、我想调制这个占空比来产生一个正弦输出。 我计划使用 math.h 库中的 Sine 函数。 我想这样做:

ePWMdutyA =模数索引* sin (2 * pi * f * t)

ePWMdutyB =模数索引* sin (2 * pi * f * t + 120)

ePWMdutyC =模数索引* sin (2 * pi * f * t - 120)

不过、我不确定如何随着时间的推移而实现这一点、也就是从哪里获得这一 t 项。 最好在我的 PWM 计时器达到其最大值并在该最大值处更改占空比时设置一个中断来触发吗? 最好设置一个单独的 CPU 计时器来执行此操作吗?

我最终计划从编码器获取反馈、并使用它来更改模数索引和频率、以实现非常基本的 v/f 控制方案。

如果我不熟悉这个领域、我会非常感谢您的任何建议!

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

    你好

    正确、正确的方法是设置中断。 控制套件中有一个示例(C:\ti\controlSUITE\device_support\f2806x\v151\F2806x_examples_ccsv5\cpu_timer)、介绍了如何根据 CPU 计时器设置中断。

    在该中断中、您可以执行以下操作:

    //速度斜坡(有限制
    )速度=速度+ 1 * interrupt_period;// interrupt_period= 0.001 for 1ms interrupt
    if (速度> maxSpeed)
    speed = maxSpeed;
    
    //计算此速度
    参考角度的角度=参考角度+速度* interrupt_period;
    
    //[ 0中的绕波角度; 2PAs]
    if (referenceAngle >_2pi) referenceAngle -=_2pi;
    否则(referenceAngle <0) referenceAngle +=_2pi;
    
    //计算占空比
    dutyCycle1 = sin (referenceAngle);
    dutyCycle2 = sin (referenceAngle +_2PRD_div_3);dutyclipi
    (cycla3
    
    
    )= pi (cycludycl3);dutycludyclipi (cyclipi)= tin1 = tin1 (cyclipi)+ cycludyclipi (cyclipi)+ cyclipi)+ cy 

    您希望创建一个宏"interrupt_period"来将时间相关的物理值(如秒、rpm)转换为离散域。 但愿这对您有所帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的快速回复! 我将查看该示例并了解如何继续。 我一直在考虑如何实现缓慢启动、但您的速度提升似乎是一种巧妙的解决方案。

    如果我卡住了,我会报告回来;)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更新了。。。

    我已经设置了一个 CPU 计时器、以20kHz 的频率中断并触发以下 ISR:

    中断空 TINT0_ISR (空) // PIE1.7 @ 0x000D4C TINT0 (CPU 定时器0)
    {
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //必须确认 PIE 组
    GpioDataRegs.GPATOGGLE.bit.GPIO0=1; //切换
    
    Theta = theta +(2 * Pi * outputFrequency * 0.00005);//其中占空比与 sin (theta)成比例
    //以[0;2pi]为单位的绕波角度
    if (theta >(2 * Pi)) theta -=(2 * Pi);
    否则、如果(θ< 0)θ+=(2 * Pi);
    
    //计算占空比
    float A =((modulationIndex * sin (theta))+ 1)/2; //相位 A 的参考波形幅度
    浮点 B =(模索引* sin (θ+((2 * Pi)/ 3))+ 1)/ 2;//相位 B 的参考波形幅度
    浮点 C =(模索引* sin (θ-((2 * Pi)/ 3))+ 1)/ 2;//相位 C 的参考波形幅度
    
    uint16 dutyA =(uint16)(A *(float) PWM_Half_Period);
    uint16 dutyB =(uint16)(B *(float) PWM_Half_Period);
    UINT16 dutyC =(UINT16)(C *(float) PWM_Half_PERIOD);
    
    如果(dutyA > PWM_MIN_DUTY) dutyA = PWM_MIN_DUTY;
    否则、如果(dutyA < PWM_MAX_DUTY) dutyA = PWM_MAX_DUTY;
    如果(dutyB > PWM_MIN_DUTY) dutyA = PWM_MIN_DUTY;
    否则、如果(dutyB < PWM_MAX_DUTY) dutyA = PWM_MAX_DUTY;
    如果(dutyC > PWM_MIN_DUTY) dutyA = PWM_MIN_DUTY;
    否则、如果(dutyC < PWM_MAX_DUTY) dutyA = PWM_MAX_DUTY;
    
    //加载 CMPA
    EPwm4Regs.CMPA.half.CMPA = dutyA;
    EPwm5Regs.CMPA.half.CMPA = dutyB;
    EPwm6Regs.CMPA.half.CMPA = dutyC;
    } 

    我的理论是:

    1) 1)每次调用 ISR 时切换 GPIO 引脚、以便我可以在示波器上看到它、并让我确信正在调用 ISR!

    2) 2)在 ISR 外部将变量 theta 初始化为零。 然后、我根据经历的时间为 θ 创建一个新值。

    3) 3)如上一个帖子中所建议的那样、我将 θ 限制在0和2 π 之间

    4) 4)我乘以调制指数来控制输出波形的磁振、然后获取 θ sin。 然后、我添加一个并除以2、这样结果在0和1之间变化。

    5) 5)我将占空比限制在10%和90%之间

    6) 6)我更新了 ePWM 比较寄存器

    这个代码在我看来是有道理的、但是我的逆变器的输出远非正弦。 我最终得到了一个非常糟糕的具有较大直流偏移的锯齿波形。 我的上述逻辑是否有任何明显的缺陷? 我很难理解正在发生的情况、在不将 PWM 信号应用到逆变器桥臂并查看发生了什么的情况下、我看不到任何方法来验证我的 PWM 信号是否正确!

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

    嗯... 他-他-他

    也许...

    如果(dutyA > PWM_MIN_DUTY) dutyA = PWM_MIN_DUTY;
    否则、如果(dutyA < PWM_MAX_DUTY) dutyA = PWM_MAX_DUTY;
    如果(dutyB > PWM_MIN_DUTY) dutyA = PWM_MIN_DUTY;
    否则、如果(dutyB < PWM_MAX_DUTY) dutyA = PWM_MAX_DUTY;
    如果(dutyC > PWM_MIN_DUTY) dutyA = PWM_MIN_DUTY;
    否则、如果(dutyC < PWM_MAX_DUTY) dutyA = PWM_MAX_DUTY; 

    请仔细查看此处。 Copypasting dutyA 导致您失败=)

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

    我想我们需要一个"远离墙壁的表情符号"。 这就是当你花太长时间盯着一个问题时会发生的情况。

    我更改了这段代码、并通过简单的 RC 低通滤波器传递三个顶部栅极 PWM 信号。 结果:

    e2e.ti.com/.../4152.TEK00001.TIF

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    良好的波形=)很高兴听到您使其正常工作=)