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.
您好!
之前、我在上一个线程中从事 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、
很高兴这个解决方案为您效劳。 如果您有任何其他问题、请告诉我、否则我将关闭此主题。
谢谢!
卢克