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.

[参考译文] TMS570LS1224:两个 HET1 pwm1、pwm2通知

Guru**** 2528290 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1170004/tms570ls1224-two-het1-pwm1-pwm2-notification

器件型号:TMS570LS1224
主题中讨论的其他器件:HALCOGEN

您好、TI 支持

我想配置两个 PWM 信号。

pwm1:周期10'000us

pwm2:周期2'000us

然后、我想为两个信号启用 PWM 通知、但是到目前为止、只接收 pwm1通知、而 pwm2则不接收任何通知。

以下是我的代码:

int main(void)
{
    _enable_IRQ();
    _pmuInit_();
    _pmuEnableCountersGlobal_();

    GlobalTestCounter1 = 0;
    GlobalTestCounter2 = 0;

    hetSIGNAL_t PWMSignal;
    /*Initialise the HET1 timer signal pwm1 */
    PWMSignal.duty = 50; //Set PWM duty cycle in %
    PWMSignal.period = 10000; //Set PWM period in us
    pwmSetSignal(hetRAM1, pwm1, PWMSignal); //set the PWM duty-cylce and period

    /*Initialise the HET1 timer signal pwm2 */
    PWMSignal.duty = 50; //Set PWM duty cycle in %
    PWMSignal.period = 2000; //Set PWM period in us
    pwmSetSignal(hetRAM1, pwm2, PWMSignal); //set the PWM duty-cylce and period

    /*initialise the HET1 timer module */
    hetInit();
    
    pwmStart(hetRAM1,pwm1);//enable the pwm signal, which triggers the adc conversion
    pwmEnableNotification(hetREG1,pwm1, pwmEND_OF_PERIOD); /* enable the pwm1 end of period notification */
    pwmStart(hetRAM1,pwm2);//enable the pwm signal, which triggers the adc conversion
    pwmEnableNotification(hetREG1,pwm2, pwmEND_OF_PERIOD); /* enable the pwm1 end of period notification */
    while(1)
    {
    }
}


void pwmNotification(hetBASE_t * hetREG,uint32 pwm, uint32 notification)
{

    /*verify notification source */
    if(pwm == pwm1)
    {
        GlobalTestCounter1++;

    }

    /*verify notification source */
    if(pwm == pwm2)
    {
        GlobalTestCounter2++;
    }
    return;
}

在 HalCoGen 中、I 以相同的方式配置 pwm1和 pwm2。 由于我确实获得了 pwm1的 PWM 通知、我猜 HalCoGen 配置是可以的。

我在这里出了什么问题?

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

    您好、Simon、

    我已开始研究您的问题、我将很快向您提供更新。

    --
    谢谢、此致、
    Jagadish。

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

    您好、Simon、

    您是否未将 HALCoGen 用于代码生成、如果您使用 HALCoGen、则无需在代码中配置周期和占空比、您只需在 HALCoGen GUI 中配置所需的参数即可

    我在这里附上一个参考项目、您可以参考该项目

    e2e.ti.com/.../PWM_5F00_on_5F00_HET_5F00_LS3137.zip

    在此项目中、我将使用 HET 外设生成两个 PWM、分别在 HET1_28和 HET1_30的引脚上具有10mSec 和2mSec 的周期。 我验证了波形以及通知中断、它工作正常。

    --
    谢谢、此致、
    Jagadish。

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

    你好,Jagadish

    感谢您提供参考项目。 这两个计时器现在可以工作。 但是、我有一个相关的问题。

    我配置 pwm1的周期为4us、pwm2的周期为(1s -(4us * 4992)。 在我的代码中、我从仅启用 pwm1开始。 4992 EoPeriod-Notifications from pwm1之后,我停止 pwm1并启动 pwm2。 在 EoPeriod 通知 pwm2时、我停止 pwm2并重新启动 pwm1。

    我希望 pwm2在1秒后收到 EoPeriod 通知(pwm2周期+ 4992*pwm1_period)。 但是、我会在每个 pwm2_period 从 pwm2测量 EoPeriod 通知。

    这是我的代码:

    int main(void)
    {
        _enable_IRQ();
    
        /*initialise the GIO module */
        gioInit();
    
    
        /*initialise the HET1 timer module */
        hetInit();
    
        hetSIGNAL_t PWMSignal;
        PWMSignal.duty = 80; //Set PWM duty cycle in %
        PWMSignal.period = 4; //Set PWM period in us
        pwmSetSignal(hetRAM1, pwm1, PWMSignal); //set the PWM duty-cylce and period
    
        PWMSignal.duty = 20; //Set PWM duty cycle in %
        PWMSignal.period = (1000000-(4*4992)); //Set PWM period in us
        pwmSetSignal(hetRAM1, pwm2, PWMSignal); //set the PWM duty-cylce and period
    
        pwmEnableNotification(hetREG1,pwm1, pwmEND_OF_PERIOD); /* enable the pwm1 end of period notification */
        pwmDisableNotification(hetREG1,pwm2, pwmEND_OF_PERIOD); /* enable the pwm2 end of period notification */
    
        pwmStart(hetRAM1,pwm1);
        pwmStop(hetRAM1,pwm2);
        gioToggleBit(gioPORTA,BIT_7);//GIOA[0] = 0 -> RXen (low active)
    
        GlobalTestCounter2 = 0;
    
        while(1)
        {
    
            if(GlobalTestCounter0 > 10)
            {
                while(1)
                {
                }
            }
            if(GlobalTestCounter1 > 10)
            {
                while(1)
                {
                }
            }
        }
        return 0;
    }
    void pwmNotification(hetBASE_t * hetREG,uint32 pwm, uint32 notification)
    {
        /*verify notification source */
        if((hetREG == hetREG1) && (pwm == pwm1) && (notification == pwmEND_OF_PERIOD))
        {
            GlobalTestCounter2++;
            if(GlobalTestCounter2 == 4992)
            {
                pwmDisableNotification(hetREG1,pwm1, pwmEND_OF_PERIOD);
                pwmStop(hetRAM1,pwm1);
                pwmStart(hetRAM1,pwm2);
                pwmEnableNotification(hetREG1,pwm2, pwmEND_OF_PERIOD);
            }
        }
    
        /*verify notification source */
        if((hetREG == hetREG1) && (pwm == pwm2) && (notification == pwmEND_OF_PERIOD))
        {
            pwmDisableNotification(hetREG1,pwm2, pwmEND_OF_PERIOD);
            pwmStop(hetRAM1,pwm2);
            pwmStart(hetRAM1,pwm1);
            pwmEnableNotification(hetREG1,pwm1, pwmEND_OF_PERIOD);
            GlobalTestCounter2 = 0;
            gioToggleBit(gioPORTA,BIT_7);//GIOA[0] = 0 -> RXen (low active)
        }
        return;
    }
    

    我使用 GIOA_Bit7切换来测量时序

    基本上、我要实现的是使 pwm1运行4992个周期、然后暂停一段特定时间、再次运行4992个周期。

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

    您好、Simon、

    您是否获得了与下面相同的波形

    第一个信号是 PWM1、它生成4992个脉冲、PWM2应在 PWM1之后启动、但它与 PWM1同时启动。 这是您在右端观察到的行为吗?

    --
    谢谢、此致、
    Jagadish。

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

    您好、Simon、

    我了解我们所看到的行为的根本原因。  

    基本上、 pwmStart 和  pwmStop 函数只会停止输出引脚上的 PWM 信号、这些函数不会停止内部计数器和比较功能。 这意味着、当我们调用这些函数时、整个内部 PWM 功能将按原样发生、我们无法在外部引脚上看到波形。

    此外、您还应该知道另外一件事、即当您尝试再次启动 PWM (即希望在端口引脚上反映波形)时、它不会立即启动、它将仅在完成相应波形的周期后启动。 这是因为双缓冲行为、为了平滑波形生成、N2HET 模块的内部代码被写入、这样周期中的变化只在当前周期完成后才会被执行。

    请浏览 下图并从左到右阅读、然后您可以清楚地了解行为。

    我想建议一种变通办法来实现您的有意行为。

     

    使用的突出显示指令来启动 PWM2而不是 pwmStart 函数、除了这一点之外、不要进行任何其他修改。 实际上、该指令就像绕过双缓冲一样、PWM2波形将立即开始。 但请记住、您必须在这里调整周期和占空比、因为 PWM2计时器计数器在到达这里之前已经完成了一些计数、只有波形从这里开始。

    --
    谢谢、此致、
    Jagadish。

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

    你好 Jagadish

    感谢您的澄清和解决方法!

    Simon