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:通过我的 python 代码以串行方式发送 TBPRD ePWM 值、来设置该值。

Guru**** 2576215 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1409945/tms320f28335-setting-the-tbprd-epwm-value-by-sending-it-serially-through-my-python-code

器件型号:TMS320F28335

工具/软件:CCS

尊敬的 TI 成员:

我已经测试了一个示例程序 example_2833x Sci_Echoback.c、此过程正常运行。 它从我的 Python 代码中获取"Texas"、DSP 接收该字符串、并发回一个新字符串"Instrument"。 程序工作正常。  因此 USB 与 UART 之间的连接没有问题。  

为了遵循这个程序、我进行了更改、这次我将发送 一个整数值、显示"1500"而不是"TEXAS "。 源代码。 请参阅下面的 Python 代码行:  

现在我希望在我的 ePWM 代码中连续接收此值作为 TPWM 值。  它将在 Setup_ePWM1和 Setup_ePWM2函数中设置 PWM 信号频率的 TBPRD 值。 通过执行 Example_2833x Example.c 的测试示例、我对串行端口的代码进行了更改 Sci_Echoback、以接收该值1500  

目的是 通过串行方式在 DSP 中接收值(通过 TransmitBytes 从 Python 代码)、然后使其等于用于设置 EPWM 频率的 TPWM (TBPRD) 、但无效。 请检查连续接收值的代码行。  

代码:

请建议解决此问题:

此致

Arsalan

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

    尊敬的 Arsalan:

    能否详细说明一下这个问题? 它的性质是什么-您是否在正确接收数据时遇到问题? 还是存储它? 或者 ePWM 信号输出是否出现问题?

    在此期间、您是否在 CCS 中观察 SCI 寄存器以了解数据是否正确接收到 RX 缓冲区?  

    此致、

    Allison

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

    您好、Allison、

    感谢您的答复。

    Unknown 说:
    ]目的是通过 串行方式在 DSP 中接收值(通过 TransmitBytes 从 Python 代码接收)、然后使其等于 TPWM (TBPRD)来设置 EPWM 频率 、但该命令无效

    我遇到的第一个错误是在 问题窗口中首先、我需要修复此错误、然后我可以检查或研究寄存器(SCIA 寄存器)并了解是否可以接收数据。  

    请查看错误窗口的图片。  

    代码:  

    请提出相应建议

    此致

    Arsalan

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

    您好、Allison、  

    最新更新:

    在 Python 中:(send Data int value= 1500、请参阅 Result/compile 窗口。 此处数据以十六进制 "\x05\XDC"的形式发送。 您可以在下图中查看/验证)。

    在 CCS 窗口中:  

    (构建错误已解决。 但仍然是数据整数= 1500未在 ePWM1寄存器的 TBPRD 中接收、并且 SCIA 寄存器中也没有更新)  

    ePWM1寄存器:

    SCIA 寄存器:

    请相应地提供建议:

    谢谢

    此致

    Arsalan

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

    尊敬的 Arsalan:

    Allison 目前不在办公室;请期待延迟回复。 对此造成的不便、我深表歉意。

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您的答复。 我将等待 Allison 或其他团队成员的回复以解决上述问题。

    谢谢

    此致

    Arsalan

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

    尊敬的 Arsalan:

    很高兴听到构建错误已解决。 因此、澄清一下、唯一的问题是 C2000器件未收到"1500"数据、对吗? 是否仍然看到所有其他外设的行为都是正确的?

    您是否发现有任何 SCI 活动? 也就是说、如果您在 SCI ISR 中设置了一个断点、是否遭到攻击并且您只是收到了不正确的数据? 或者您是否没有  不限 SCI 连接是否成功并且 ISR 未被触发?

    此致、

    Allison

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

    您好、Allison 和 TI 成员:

    [报价 userid="568270" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1409945/tms320f28335-setting-the-tbprd-epwm-value-by-sending-it-serially-through-my-python-code/5405274 #5405274"]请澄清一下、唯一问题是 C2000器件没有收到"1500"数据、正确吗?

    有。

    您是否仍然看到所有其他外设的行为正确?

    外设连接没有问题。 因为我已经测试了 示例程序 example_2833x Sci_Echoback。 例如发送 '德克萨斯州' 作为 python 中的字符串、DSP 将接收并比较、然后回复 '仪器'。 请参阅下面 Python 中的结果。

    通过验证上述代码和结果窗口、外设不会出现问题。 Python 的基本知识。 发送"Texas"、并收到"Instruments"。

    当我发送一个整数时、问题就出现了、如下所示。

    您是否发现任何 SCI 活动? 也就是说、如果您在 SCI ISR 中设置了一个断点、是否遭到攻击并且您只是收到了不正确的数据? 或者您是否没有  不限 SCI 连接成功且 ISR 未被触发?[/QUOT]

    我可以比较接收端所涉及的寄存器值、即  通过 python 代码和发送1500 之后 发送1500 thorugh Python 代码。

    以下是寄存器:  

    1- SCITTL2

    之前:0x00C0之后:0x00C2

    SCIRXST

    之前:0x0000之后:0x00CA

    SCIRXEMU

    之前:0x0000之后:0x00CD

    SCIRXBUF

    之前:0x0000之后:0x00CD

    我不确定 Python 是以整数还是字符串格式"1500"发送数据。

    我也尝试通过在 python 中这样做:  

    {TransmitString =(f"value_to_send\n") 
    SerialObj.write(TransmitString.encode()}//用于字符串到整数的转换。

    但在 DSP 中没有收到1500。 我始终在发送之前通过查看 Python 语法/结果窗口来验证该值。

    如果它不是整数、那么我如何在 DSP 寄存器中将这个1500作为字符串来显示寄存器的正确值、然后它会将其转换为1500整数格式?

    之后、我可以在 ePWM1的 TPWM/TBPRD 值中等同于该整数1500。 此时 TBPRD = 0。 不生成 ePWM。

    (注意: 我进行了一个小更改、将一些 EPWM 线路代码从行204-206和行224-230移动到 SCI_RX_ISR 下的中断块、但它也不起作用)  

    再次: 目的是通过串行方式将整数值(来自 Python 代码)接收到我的 DSP 中、然后使其等于用于设置 ePWM 频率的 TPWM (TBPRD)。

    代码:

    请建议解决此问题。

    谢谢

    此致

    Arsalan

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

    尊敬的 Arsalan:

    很高兴听到程序的其余部分似乎是正常的。 听起来这是一个小的数据格式问题。 澄清一下、当你在其中放置一个断点时、RX ISR 是否会被命中? 我无法从 python 方面提供太多指导、但让我今天再次回顾这些信息并提供另一个建议。

    此致、

    Allison

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

    您好、Allison、  

    为了澄清、在设定断点时 RX ISR 是否被击中?

    我已经进行过尝试、但我想我在设置断点时发现了一些问题。 理解不是很好。

    最新更新:

    我找到一个错误。 中断没有被启用。

    现在我修复了它(通过执行 IER = 0x101 ;)由于 SCIRXST 现在是固定的。 ( SCIRXST = 0x0002 )。

    第二次更改代码:( SciaRegs.SCIFFRX.ALL = 0xE064 ; // Rx interrupt level = 4)、因为1500是4个字(字符)的字母、而不是'Texas'样本示例[example_2833x Sci_Echoback.c]中的5个字。

    仍然、我在块/函数中遇到问题:中断 void SCIA_RX_ISR (void)、使缓冲区= TPWM (即1500)。

    我仍然无法 从 Python 接收1500。 即使我使用其他值(例如1,200,12012001800等)更改了1500、SCIRXEMU 和 SCIRXBUF 的寄存器也不会发生变化(未突出显示)。  

    再次:  目的是 通过串行方式将整数值(来自 Python 代码)接收到 DSP 中、然后使其等于用于设置 ePWM 频率的 TPWM (TBPRD)。

    请检查 最新更新的代码:在启用中断后和下面的寄存器状态

    最新更新的代码:在启用中断后

    代码:

    请相应地建议解决该问题。

    谢谢

    此致

    Arsalan

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

    您好!

    负责这一问题的专家目前不在办公室、于9月16日星期一返回。 请期待您的回复。

    谢谢!

    Luke

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

    尊敬的 TI 成员:

    感谢您的答复。

    很抱歉给您带来不便。 只是为了检查代码中是否有任何建议吗? 您是否有机会查看最后一个问题(我的最后一个回复)来解决它?

    谢谢

    此致

    Arsalan

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

    尊敬的 Arsalan:

    对不起,我今天刚刚回来了。 请允许我再留出一天时间来查看这些信息并与您联系。 感谢您的持续耐心。

    此致、

    Allison

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

    尊敬的 Arsalan:

    在查看 SCI init 时、 您是否可以从复位重新查询 SCI 后添加"ScibRegs.SCIFFRX.bit.RXFIFORESET=1;"? 这将在 INIT 中启用 RX FIFO 操作。 在你的 RX ISR 中、我还要注释掉2行 RXFIFORESET—我在这里不认为有必要这么做。  

    从上一次发帖中查看寄存器、SCIFFRX 寄存器显示了 RXFFST 为0 (接收 FIFO 为空)、并且没有发生 RXFIFO 中断(如果您不想、请告诉我)。 我想知道的是 、您的 RX FIFO ISR 是否正确执行-我知道您很难在这里设置断点。 您可以在 ISR 中切换 GPIO 还是其他指示器?  

    如果您的 ISR 运行正常、那么 FIFO RX ISR 应该会在 FIFO 水平为 4或更高(假设您的 RXFFIL 为4)时触发。  为什么不尝试使用内部环回模式的相同代码?  要测试 RX FIFO、请准备一个 一次发送超过4个字的 TX 功能。  如果使用环回功能、则问题可能仅在于 PC 向电路板发送数据的方式。  

    此致、

    Allison

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

    您好、Allison、

    感谢您的答复。

    [报价 userid="568270" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1409945/tms320f28335-setting-the-tbprd-epwm-value-by-sending-it-serially-through-my-python-code/5422229 #5422229"]

    在查看 SCI init 时、 您是否可以从复位重新查询 SCI 后添加"ScibRegs.SCIFFRX.bit.RXFIFORESET=1;"? 这将在 INIT 中启用 RX FIFO 操作。 在你的 RX ISR 中、我还要注释掉2行 RXFIFORESET—我在这里不认为有必要这么做。  

    从上一次发帖中查看寄存器、SCIFFRX 寄存器显示了 RXFFST 为0 (接收 FIFO 为空)、并且没有发生 RXFIFO 中断(如果您不想、请告诉我)。 我想知道的是 、您的 RX FIFO ISR 是否正确执行-我知道您很难在这里设置断点。

    [报价]

    我尝试了你的建议在我的上一个程序代码,但它不起作用。 我切换到了一个基本样本 loop_echo_back 示例。 请在下方查看。

    您能否在 ISR 中切换 GPIO 或其他某种指标?

    我无法理解切换的这一部分。 我想我已经开始重新检查 Sci_Echo_示例。 请在下面查看我的回送代码中出现的最新更新  一些改进  我的当前程序代码中、如所示  最新更新的工作如下 .

    如果您的 ISR 运行正常、并且应该在 FIFO 级别为 4或更高时(假设您的 RXFFIL 为4)触发 FIFO RX ISR。  为什么不尝试使用内部环回模式的相同代码?  要测试 RX FIFO、请准备一个 一次发送超过4个字的 TX 功能。  如果使用环回功能、则问题可能仅在于 PC 向电路板发送数据的方式。  [报价]

    最新更新:

    我再次取了 SciEcho_loopback 的样本工作示例、并按照代码中提到的那样保留 TX 和 RX。

    我在  SciEcho_loopback 示例中进行了以下几项更改:

    1-在代码中添加 EPWM1和 EPWM2例程:

    2 -在我的环回示例中、尤其是在中  中断失效 SCIA_RX_ISR (void)  分块中添加了注释  char buffer[16];并将其用作上述缓冲区数组值的全局变量。

    3-   而不是  '德克萨斯州'、  I 发送  '1500'  具有  4个字符  Python 对该值进行编程、而 DSP 会将该值(1500)保存到中  中断 void SCIA_RX_ISR (void)函数的 char 缓冲数组 ----与我的样本程序相同的程序:德克萨斯有5个字符。

    4-  我设置  消息数组'2000! \n"  而不是  {instruments \n\r} .  之后  比较"1500" 则 DSP 将作出响应  '2000! \n"  而不是"instruments \n\r"

    现在、优点是我可以做到 在表达式窗口中同时调用字符消息[]和字符缓冲区[16] . 通过这种方式,您可以通过查看您发送的内容和接收的内容非常清楚来查看这两个(缓冲区和消息)数组中的更改。

    现在在 Python 中:  已发送值"1500"、并且已发送值"2000! 已收到\n" .

    在 CCS 窗口中:您可以看到  "缓冲区"值 = 1500、"消息"='2000! \n"

    但这里的问题仍然存在、EPwm1Reg.TBPRD 或 TPWM 不 等于"1500"或我希望变为等于生成 ePWM 信号的缓冲阵列值。 这是转换问题(数组到单个数字)。 请参阅下面的代码

    现在、如果我们更改  值从"1500"更改为"1600"  然后被传输、Python 会显示一个错误或有时会卡住、因为  

     如果(strncmp (buffer、"1500"、4)=0)- -因此  你看不到2000年! \n'在 Python 的 run/命令窗口中。

    在 CCS 窗口中:您可以看到  缓冲区值 ="1600"、消息值="2000! \n"

    但问题仍然存在、EPwm1Reg.TBPRD 或 TPWM 不等于"1500"/"1600"或缓冲区数组值。 即使它也违反了 if 语句来比较字符串。

    通过查看上述所有图片,尤其是表达式窗口,它看起来像是一个格式化或数组到单值转换的问题。

    请检查以下更新的代码:

    此处附加了更新后的代码:

    请建议解决此问题。

    谢谢

    此致

    Arsalan

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

    尊敬的 Arsalan:

    对于延迟、我们深表歉意。 我修改了您的代码-请尝试使用随附的".c"文件。 我在何处添加了注释、并修改了代码。

    保存接收到的值和尝试的转换不正确。 由于您要在字符数组中保存串行值"1"、"5"、"0"、"0"、因此需要将这些值转换为单个整数、以便其可以正确用作 PWM TBPRD 参数。 我修改了程序、非常基本、用来执行/展示这一点。 我也测试过此示例、发现可以将 EPWM1 TBPRD 更新为1500。  

    您可以根据需要随意修改-代码可以进一步合并(我只想展示转换值所需的步骤)。  

    e2e.ti.com/.../e2e_5F00_updating_5F00_pwm_5F00_period.c

    此致、

    Allison

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

    您好、Allison、

    感谢您的帮助和持续的支持。 代码正在运行。

    再次感谢

    此致

    Arsalan