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.

求助:TMS570 NHET 如何利用HAL Code Generatr 实现输入捕捉程序??

Other Parts Discussed in Thread: HALCOGEN

求助:TMS570  NHET 如何利用HAL Code Generatr 实现输入捕捉程序??

   我用利用HAL Code Generatr配置rti 的counter0的campare0 产生10ms中断,

配置rti compare0中断
 
设置rti中断间隔
然后根据中断计数实现一个占空比50%的周期200ms的脉冲
把NHET3配置成输入捕捉
  
在NHET13脚输出到NHET3脚作为输入信号, 用rti.c的capGetSignal(cap0);
但是我发现我的程序好像什么都没捕捉到
串口数据全部为零
至少占空比不应为零  我做的是50%的脉冲啊
下边是主程序的代码:
 

/* USER CODE BEGIN (0) */

#include "rti.h" #include "gio.h"

 #include "het.h"

 #include "sci.h"

 /* USER CODE END */

/* Include Files */

#include "sys_common.h"

#include "system.h"

/* USER CODE BEGIN (1) */

/* USER CODE END */

/** @fn void main(void) *   @brief Application main function *   @note This function is empty by default. * *   This function is called after startup. *   The user can use this function to implement the application. */

/* USER CODE BEGIN (2) */ /* USER CODE END */

void main(void) {

/* USER CODE BEGIN (3) */

 hetSIGNAL_t  CAP;  

unsigned char a,b,c;

  

gioInit();  

rtiInit();  

hetInit();  

sciInit();

  rtiEnableNotification(rtiNOTIFICATION_COMPARE0);

 rtiEnableNotification(rtiNOTIFICATION_COMPARE1);

 rtiEnableNotification(rtiNOTIFICATION_COMPARE2);  

rtiEnableNotification(rtiNOTIFICATION_COMPARE3);  

rtiStartCounter(rtiCOUNTER_BLOCK0);

  _enable_IRQ();//开启中断  

 sciSendByte(sciREG2, 0);

  CAP=capGetSignal(cap0);   

  a=(unsigned char)(CAP.duty);   

  sciSendByte(sciREG2, a);    

sciSendByte(sciREG2, 0);    

 b=(unsigned char)(CAP.period/256);    

c=(unsigned char)(CAP.period);

 sciSendByte(sciREG2, b);  

sciSendByte(sciREG2, c);  

sciSendByte(sciREG2, 0);

 while(1){

  //capGetSignal(cap0);  

             }

/* USER CODE END */

 }

附件是完整代码,请帮助查看一下,

我想测量输入信号的频率,希望您能帮助提出解决意见。或者提供个例程。

CAPTURE.zip
  • Hi WDY,

       发现两个问题:

        1. 您调用capGetSignal的方式不正确。

            570系列中一般需要指定哪个het单元,所以参数中应该有hetRAM1或hetRAM2.

           如 pulse = capGetSignal(hetRAM1, cap0);

        2. capGetSignal自身的问题

        的确,HALCoGen的捕获Capture功能接口是针对双pin捕获设计的。

        也就是说,举个例子,测量从pin0输入的脉冲,HALCoGen生成的HET程序使用了一条汇编来测量pin0上的duty,而用另外一条语句来测量pin1上的period。

       (可能是出于兼容旧方案的考虑吧,以前很多老的MCU都需要两个pin才能同时测量一个信号的周期和占空比。)

        实际上,这样做没有必要,在HET中使用两条PCNT指令可以完成同一个引脚上的周期和占空比的测量。

        解决眼下的问题,需要稍微修改HET的汇编指令,您可以在het.c的const hetINSTRUCTION_t het1PROGRAM[]数组中找到对应的PCNT指令位置。

        比如,您使用cap0的指令应该是第25和26条指令。

        如图:

        

    可以看到,第26条指令在测量pin1而不是pin0上的信号........这样导致capGetSignal不能正常工作。

    们可以把这个1U去掉,让这条指令针对pin0.

    另外,(0U<<6U这里,是在配置目标脉冲的"极性"这里我把它改成"3U",即上升沿到上升沿之间的宽度

    而第25条指令处,这里我改为"1U",即上升沿到下降沿之间的宽度。

    这样,就相当于对一个"正极性"的脉冲进行测量了

    修改之后如

    这样修改之后就可以正常使用了

    附件是我这个用来测试的例子。

    需要注意的是,由于修改了HET汇编代码,每次HALCoGen中有设置变化并生成源文件时,这部分的修改会被覆盖掉,所以用户要自己保存一下

    570_HET_Cap.zip
  • 修改后的图:

  • 你好,请问为什么我每次一调用capGetSignal(hetRAM1, cap1, pwmSignal);这个函数,系统就会跳到sys_intvecs.asm文件中的

    undefEntry
    b undefEntry

    或是

    prefetchEntry
    b prefetchEntry
    b _dabort

  • 请问您的问题解决了吗 我也遇到了相同的问题 还望您指教