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-F280049C:终端字符合并。

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/817698/launchxl-f280049c-terminal-character-merging

器件型号:LAUNCHXL-F280049C
主题中讨论的其他器件:C2000WARE

我的终端遇到了一些问题。 我正在尝试从终端读取 PWM 数据、但打印顺序完全混乱且毫无意义。

int i = 0;
对于(I = 0;I<20;I++)
{
SCI_writeCharBlockingNonFIFO (SCIA_BASE、(uint16_t)(*(msg+I));
DEVICE_DELAY_US (50000);
ltoa (compAValue、buffer);
sci_writeCharArray (SCIA_BASE、(uint16_t*) buffer、5);
DEVICE_DELAY_US (50000);
SCI_writeCharBlockingNonFIFO (SCIA_BASE、(uint16_t)(*(PRC+I));
DEVICE_DELAY_US (50000);
} 

此代码保留在改变 PWM 信号占空比的代码块中。 但当我尝试运行它时、它会停止周期变化。 (MSG、PRC 和缓冲区在全局变量中定义。 COMPAValue 在周期更改 main 中定义。) 我正在修改示例以更好地学习、但我似乎无法解决我现在发生的问题。 我将等待您的回答。 谢谢^^

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

    更新:

    我可以看到打印顺序、但占空比值处于开始状态。 像这样;

    52%占空比:

                               %

    打印代码如下所示;

    int i = 0;
    对于(I = 0;I<20;I++)
    {
    SCI_writeCharBlockingNonFIFO (SCIA_BASE、(uint16_t)(*(msg+I));
    DEVICE_DELAY_US (50000);
    
    } 
    ltoa (compAValue、buffer); sci_writeCharArray (SCIA_BASE、(uint16_t*) buffer、5); DEVICE_DELAY_US (50000); SCI_writeCharBlockingNonFIFO (SCIA_BASE、(uint16_t)(*(PRC)); DEVICE_DELAY_US (50000); 如下所示

    由于占空比没有变化、仍然无法正确读取占空比数据。 它从50开始递增。

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

    您好!

    请参阅  C2000Ware_X_XX_XX_XX\driverlib\f28004x\examples\sci\中的 sci_ex2_interrupts 示例

    并检查您是否根据示例配置了所有内容?

    谢谢、Katta

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

    你好,Katta!

    我尝试执行的操作与 sci_EC2_interrupts 有很大不同。 您可以将其视为 ePWM_ex2_updown_AQ 和 sci_ex2_interrupts 的组合、但几乎没有扭曲。 如果您需要、我可以为您提供完整代码。 我当前的问题现在无法读取数据并同时更改占空比。 数据读取器件正在中断周期更改代码。 这是我要讨论的部分;

    void updateCompare (epwmInformation * epwmInfo)
    {
    uint16_t compAValue;
    
    compAValue = ePWM_getCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A);
    
    
    if (epwmInfo->epwmTimerIntCount =10U)
    {
    epwmInfo->epwmTimerIntCount = 0U;
    
    if (epwmInfo->epwmCompaDirection =ePWM_CMP_UP)
    {
    if (compAValue <(epwmInfo->epwmMaxCompA))
    {
    ePWM_setCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A、++compAValue);
    
    
    }
    其他
    {
    epwmInfo->epwmCompADirection = ePWM_CMP_DOWN;
    ePWM_setCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A、--compAValue);
    
    }
    }
    其他
    {
    if (compAValue ==(epwmInfo->epwmMinCompA))
    {
    epwmInfo->epwmCompADirection = ePWM_CMP_UP;
    ePWM_setCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A、++compAValue);
    
    }
    其他
    {
    ePWM_setCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A、--compAValue);
    
    }
    }
    
    
    其他
    {
    epwmInfo->epwmTimerIntCount++;
    }
    
    sci_writeCharArray (SCIA_BASE、(uint16_t*) msg、15);
    DEVICE_DELAY_US (50000);
    ltoa (compAValue、buffer);
    sci_writeCharArray (SCIA_BASE、(uint16_t*) buffer、5);
    DEVICE_DELAY_US (50000);
    } 

    您能看到什么问题吗? 我仍处于学习阶段、因此我相信您在相关主题方面的经验。

    感谢你能抽出时间。

    此致

    Anıl μ A

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

    您好 Katta、

    我仍在等待您的帮助。 请听我说。

    此致

    Anıl μ A

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

    尊敬的 Anil:

    我无法获得完整的图片。 我已通知各自的 ePWM 专家进行回复。

    同时、"我的当前问题现在无法读取数据并同时更改占空比"这一含义是什么。 数据读取器件正在中断周期更改代码。  "

    您是否有单独的数据读取和打印代码? 只读部件或打印可以正常工作、但不能同时阅读。 对吧?

    您是否检查了它是否与您的中断处理有关? ePWM 和 SCI 是否共享任何通用 GPIO 配置?

    谢谢、Katta

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

    您好 Katta、

    感谢您的回复。 否、它们不共享通用 GPIO。 我在上面发布的代码处理两个任务。 更改占空比的 IF 部件和后面的部件打印当前占空比。 当我移除打印件占空比时、会发生变化、但当它保持在该状态时、不会发生变化。 它从50开始计数、然后继续。 占空比保持不变。

    谢谢、Anıl

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

    您好 Katta、

    ePWM 专家的话吗?

    此致、Anıl

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

    您好!

    此更新比较 API 何时在您的代码中调用?

    另外,当您尝试打印 在 updateCompare()函数中递增或递减的 compAValue 值时,您的意思是“由于占空比没有变化,仍然无法正确读取占空比数据”。

    您可以共享代码以获得更好的帮助。

    谢谢

    Vasudha

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

    Vasudha、您好!

    我不知道它是否正确、但以下是所有代码;

    #include "driverlib.h"
    #include "device.h"
    #include "stdlib.h"
    #include "string.h"
    
    
    #define EPWM1_TIMER_TBPRD 2000U
    #define EPWM1_MAX_CMPA 1950U
    #define EPWM1_MIN_CMPA 50U
    
    #define ePWM_CMP_UP 1U
    #define ePWM_CMP_DOWN 0u
    
    typedef 结构
    {
    uint32_t epwmModule;
    uint16_t epwmCompADirection;
    uint16_t epwmCompBDirection;
    uint16_t epwmTimerIntCount;
    uint16_t epwmMaxCompA;
    uint16_t epwmMinCompA;
    
    }
    epwmInformation;
    
    epwmInformation epwm1Info;
    
    void initEPWM1 (void);
    
    __interrupt void epwm1ISR (void);
    
    void updateCompare (epwmInformation*epwminfo);
    
    char buffer[5];
    char *msg ="\r\n Duty cycle:%\0 ";
    
    
    void main (void)
    {
    
    
    device_init();
    DEVICE_initGPIO();
    
    GPIO_setMasterCore (28、GPIO_CORE_CPU1);
    GPIO_setPinConfig (GPIO_28_SCIRXDA);
    GPIO_setDirectionMode (28、GPIO_DIR_MODE_IN);
    GPIO_setPadConfig (28、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (28、GPIO_QUAL_异 步);
    
    GPIO_setMasterCore (29、GPIO_CORE_CPU1);
    GPIO_setPinConfig (GPIO_29_SCITXDA);
    GPIO_setDirectionMode (29、GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig (29、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (29、GPIO_QUAL_异 步);
    
    interrupt_initModule();
    interrupt_initVectorTable();
    
    SCI_performSoftwareReset (SCIA_BASE);
    SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、600、(SCI_CONFIG_WLEN_8| SCI_CONFIG_STOP_ONE | SCI_CONFIG_PAR_NONE));
    
    SCI_resetChannels (SCIA_BASE);
    SCI_resetRxFIFO (SCIA_BASE);
    SCI_resetTxFIFO (SCIA_BASE);
    SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF| SCI_INT_RXFF);
    SCI_enableFIFO (SCIA_BASE);
    SCI_enableModule (SCIA_BASE);
    SCI_performSoftwareReset (SCIA_BASE);
    
    //#ifdef 自动波特
    //
    ////////////执行自动波特锁定。
    ///// SCI 要求用'A'或'A'来锁定波特率。
    ////
    ////// SCI_lockAutobaud (SCIA_BASE);
    //#endif
    
    INTERRUPT_REGISTER (INT_EPWM1,&epwm1ISR);
    GPIO_setPadConfig (0、GPIO_PIN_TYPE_STD);
    GPIO_setPinConfig (GPIO_0_EPWM1A);
    GPIO_setPadConfig (1、GPIO_PIN_TYPE_STD);
    GPIO_setPinConfig (GPIO_1_EPWM1B);
    
    SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
    initEPWM1();
    SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
    
    INTERRUPT_ENABLE (INT_EPWM1);
    
    EINT;
    ERTM;
    
    
    }
    
    __interrupt void epwm1ISR (void)
    {
    updateCompare (epwm1Info);
    ePWM_clearEventTriggerInterruptFlag (EPWM1_BASE);
    interrupt_clearACKGroup (interrupt_ACK_Group3);
    }
    
    void initEPWM1()
    {
    ePWM_setTimeBasePeriod (EPWM1_base、EPWM1_TIMER_TBPRD);
    ePWM_setPhaseShift (EPWM1_base、0U);
    ePWM_setTimeBaseCounter (EPWM1_base、0U);
    
    ePWM_setCounterCompareValue (EPWM1_base、ePWM_COUNTER_COMPARE_A、EPWM1_MIN_CMPA);
    
    ePWM_setTimeBaseCounterMode (EPWM1_base、ePWM_COUNTER_MODE_UP_DOWN);
    ePWM_DisablePhaseShiftLoad (EPWM1_base);
    ePWM_setClockPrescaler (EPWM1_base、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 12);
    
    ePWM_setCounterCompareShadowImage LoadMode (EPWM1_base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);
    
    ePWM_setActionQualifierAction (EPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (EPWM1_base、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_CMPA);
    
    ePWM_setInterruptSource (EPWM1_base、ePWM_INT_TBCTR_ZERO);
    ePWM_enableInterrupt (EPWM1_base);
    ePWM_setInterruptEventCount (EPWM1_BASE、3U);
    
    epwm1Info.epwmCompADirection = ePWM_CMP_UP;
    epwm1Info.epwmTimerIntCount = 0U;
    epwm1Info.epwmMaxCompA = EPWM1_MAX_CMPA;
    epwm1Info.epwmMinCompA = EPWM1_MIN_CMPA;
    epwm1Info.epwmModule = EPWM1_base;
    
    }
    
    
    
    void updateCompare (epwmInformation * epwmInfo)
    {
    uint16_t compAValue;
    
    compAValue = ePWM_getCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A);
    
    
    if (epwmInfo->epwmTimerIntCount =10U)
    {
    epwmInfo->epwmTimerIntCount = 0U;
    
    if (epwmInfo->epwmCompaDirection =ePWM_CMP_UP)
    {
    if (compAValue <(epwmInfo->epwmMaxCompA))
    {
    ePWM_setCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A、++compAValue);
    
    
    }
    其他
    {
    epwmInfo->epwmCompADirection = ePWM_CMP_DOWN;
    ePWM_setCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A、--compAValue);
    
    }
    }
    其他
    {
    if (compAValue ==(epwmInfo->epwmMinCompA))
    {
    epwmInfo->epwmCompADirection = ePWM_CMP_UP;
    ePWM_setCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A、++compAValue);
    
    }
    其他
    {
    ePWM_setCounterCompareValue (epwmInfo->epwmModule、ePWM_COUNTER_COMPARE_A、--compAValue);
    
    }
    }
    
    
    其他
    {
    epwmInfo->epwmTimerIntCount++;
    }
    
    sci_writeCharArray (SCIA_BASE、(uint16_t*) msg、15);
    DEVICE_DELAY_US (50000);
    ltoa (compAValue、buffer);
    sci_writeCharArray (SCIA_BASE、(uint16_t*) buffer、5);
    DEVICE_DELAY_US (50000);
    } 

    此致。