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.

[参考译文] TMS320F28335:TMS320F28335:eCAP、ePWM 与 amp;pid 代码集成

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1255016/tms320f28335-tms320f28335-ecap-epwm-pid-code-integration

器件型号:TMS320F28335

您好!

之前、我在上一个线程中从事 ECAP 和 ePWM 模块的工作、然后成功实现了这两个 模块。 此任务从函数发生器获取输入、作为具有来自 ECAP 函数的频率和占空比的数字脉冲信号、然后通过 ePWM 函数复制或生成具有相同频率和占空比的相同脉冲。 代码运行得很好、我可以看到变量值 PWM_PERIOD 和 PWM_DUTY 以 TBPRD 为单位(    分别对于10kHz PWM_PERIOD =15000和 PWM_DUTY = 7500)...(先前的工作)

当我把 PID 代码例程从第44-62行和第293-314行添加到我以前工作的代码中时、问题就出现了。 在这里、我没有将任何 DCL 库用于 PID 仿真。 对于一些背景信息、例如在极食、Matlab 或其他微控制器中、pid 例程代码通常用于 pid 仿真。 因此、我   在代码中分别从第44-62行和第293-314行添加了 pid 例程代码。 添加 pid 例程代码的原因是要根据 new_period/new_Duty 来更新 pid while 循环之后的周期和占空比。

解决编译错误后、我对硬件上的代码进行仿真、再次检查变量  PWM_PERIOD 和 PWM_DUTY 很大的影响。 这些变量未更新、 错误 试验。 我将函数发生器的旋钮从10kHz 更改为20kHz、但 PWM_PERIOD 和 PWM_DUTY  变量不会自行更新。 因此、new_period/new_Duty 也会显示不正确的值。 可能是 pid 例程在代码中的放置位置不在正确的行位置可能是错误的。

  

请提出相应建议。

此致

阿尔萨兰

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

    尊敬的 Arsalan:

    为了清楚起见、在添加第293-314行之前、您的代码没有问题? 如果这样、你能够在你的代码的第293行设定一个断点、并且确定你发现意外值的第一个实例吗?

    谢谢!

    卢克

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

    Luke、您好!

    感谢您的答复。

    因为我不太熟悉 CCS 工具。 您能否建议分步如何在程序中使用断点并观察程序的执行情况、这样我就可以找出问题?  我必须 查看这4个变量、 PWM_PERIOD、PWM_DUTY、NEW_PERIOD  和 NEW_DUTY 在添加 pid 代码 行之前和之后。 293-314.

    在添加这些行之前、  PWM_PERIOD、PWM_Duty 变量正在显示正确的值、但在添加 pid 代码行293-314后、它在"Expressions"窗口中显示不正确的数字。

    代码:

    请根据相关建议

    谢谢

    此致

    阿尔萨兰

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

    尊敬的 Arsalan:

    要在 CCS 中设置断点、只需在开始运行程序之前双击代码中的行号即可。

    为了观察不同变量的值、你可以右键单击任一变量、然后单击"Add watch expression"。  您还可以用鼠标将鼠标悬停在某个变量上以观察该变量的值、即使该变量尚未添加到监视窗口中也是如此。

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

    尊敬的 Luke Jones:

    感谢您的答复。

    首次更改:

    我有一个警告(在变量 updated_dutycyle->语句 无法访问)。 为了删除它,我更改了 while (1) while (e > 1e-3)。

    第二次更改:  

    第307-317行。 我 使用"if 语句" 来定义0-3V 之间的 pid_out 限制。

    在进行所有更改并消除构建错误之后、我在硬件上仿真了代码、并使用了 断点 at 变量。  PWM_PERIOD、PWM_DUTY、 NEW_PERIOD 和 NEW_DUTY。 第323行。 我在使用断点后注意到的情况如下所述:

    (请记住、 使用了 H/W 和 S/W 两个断点、如断点窗口中所示)  

    图1、当从 Func 发生器应用10kHz 的频率、然后我按一次 Green 按钮(Debug):表达式窗口中的变量 PWM_PERIOD、PWM_Duty 提供了大约正确的值14990和7495。 (TBPRD =15000 & TBPRD/2=7500)。

    图2、现在第二次按绿色按钮(调试):表达式窗口中的变量 PWM_PERIOD、PWM_DUTY 保持不变、这在10kHz 频率下是正确的、但变量 NEW_DUTY 变为0。 请记住、必须在 pid while 循环后使用新的周期和新的占空比更新 new_period 和 new_Duty 变量。

     

    图3、现在按绿色按钮(调试)第3次:表达式窗口中的变量 PWM_PERIOD、PWM_DUTY 保持不变、这在10kHz 下是正确的、但变量 NEW_PERIOD 和 NEW_DUTY 都变为0。  请记住、 这两个变量必须在 pid while 循环后更新新的周期和新的占空比。

    图4、现在第4次按绿色按钮(调试):表达式窗口中的变量 PWM_PERIOD、PWM_DUTY、NEW_PERIOD 和 NEW_DUTY 都变为0。 但这里所有的值都不正确。

    在图4之后、进一步执行/调试会将所有变量保持为0 (无变化)。 在我们的例子中、正如我所料 、PWM_PERIOD、PWM_DUTY 必须保持为15000和7500、而且  在从 pid 例程更新后、NEW_PERIOD 和 NEW_DUTY 必须为一些值。 代码。  

    请在代码中提供相关建议以解决此问题。

     第293-324行:  

    谢谢

    此致

    阿尔萨兰

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

    Arsalan,

    您最近帖子中的第二个屏幕截图似乎是出错的地方。 还可以向表达式窗口添加 pid_out 和 updated_dutycycle、并在代码中的这一点逐个浏览每行代码。 每一步后、请检查表达式窗口中的所有变量均具有其预期值。

    谢谢!

    卢克

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

    Luke、您好!

    感谢您的答复。  

    当我添加更多变量并在不同的断点进行检查时、我从 dut_cyle (double)变量中得到了第一个未自行更新的问题。

    I 使用 一个周期的断点仿真 开始日期

    第293行:Duty_cycle =(int32) PWM_Duty /(int32) PWM_period;//该数字是0-1之间的比率

    第324行之前:new_period = new_Duty * 2;

    我从一开始就发现了问题、变量 ""占空比"(双精度) 它不会像您从 表达式窗口。 请参见下图:

    图1 (断点周期开始)

    图2

    图2. (断点周期结束)

    请根据相关建议

    谢谢

    此致

    阿尔萨兰

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

    尊敬的 ***:

    在第293行中、似乎您将 Duty_cycle 设置为两个整数的除法、其中分子小于分母。 这将始终得到值0。 如果要将 PWM_Duty 和 PWM_PERIOD 转换为一个整数、但仍要获得它们之间的比率、则需要像这样将这两个数字重新转换为一个双精度型:

    DUTY_CYCLE =(double)((int32) PWM_DUTY)/(double)(((int32) PWM_PERIOD);

    希望我的语法正确... 请告诉我这是否适合您。

    Luke

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

    Luke、您好!

    是的、这种"折衷"效果很好。 谢谢。

    我将解决这个问题、并会在另一个帖子中再次询问有关该循环的问题、因为循环正在创建一个问题、以便在我收集更多数据后更新 new_period 和 new_Duty。

    谢谢  

    此致

    阿尔萨兰

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

    你好、Muhammad、

    很高兴这个解决方案为您效劳。 如果您有任何其他问题、请告诉我、否则我将关闭此主题。

    谢谢!

    卢克