TI论坛
直播中

周臻庸

7年用户 850经验值
私信 关注
[问答]

HET指令执行序列PWCNT的分辨率就是HR设置的值62.5ns,请问是该指令62.5ns就执行了一次吗?

ti工程师:
                您好!
                现在正使用HET模块,在执行顺序上有些迷惑。
                我的程序使用到了CNT指令及PWCNT指令,HR设置为3,即4分频,LR设置为5,即32分频,使用64M的VCLK2,那么一次完整的LOOP执行时间为2us,而
                CNT的data field值也是间隔2us加1,这个是没问题的吧?
                如果这样的话PWCNT这个指令也应该是整个LOOP执行一次吧(假如整个LOOP只有一个PWCNT指令)?但是根据我设置的data field值来看,PWCNT
                的分辨率就是HR设置的值62.5ns,难道是该指令62.5ns就执行了一次吗?也就是说下边代码(PWCNT指令执行代码)62.5ns就运行了一次?
If (Data field value == 0)
[
Selected register = 0;
Jump to Next Program Address;
]
If (Data field value > 1)
[
Selected register = Data field value - 1;
Data field value = Counter value - 1;
If (Enable Pin action == 1)
Selected Pin = Pin Action AT next loop resolution clock;
Jump to Next Program Address;
]
If (Data field value == 1)
[
Selected register = 00000h;
Data field value = 00000h;
If (Opposite action == 1)
[
If (hr_lr bit == 0)
[
If (Enable Pin action == 1)
Selected Pin = Opposite level of Pin Action AT next loop
resolution clock + HR delay;
]
else
[
If (Enable Pin action == 1)
Selected Pin = Opposite level of Pin Action AT next loop
resolution clock;
]
]
If (Interrupt Enable == 1)
SW interrupt flag = 1;
Jump to Conditional Address
]
                请帮我解答下,谢谢!
               

回帖(5)

李麒铭

2018-8-13 07:08:07
Hi Pengyuan,
    已经开始深入到HET的编程了啊,进展很快啊!:)
    你提的这个问题很有价值,就是典型的HET工作原理问题。
    搞清楚这个问题,基本上HET上的编程就变得很轻松了。
    而且这个问题的答案其实很简单。

    HET中的代码运行是基于VCLK2的,比如手册中提到PWCNT指令执行一次,需要1个Cycle,那么就是指一个VCLK2 Cycle。
    换句话说,这条指令花掉1/VCLK2的时间。
    一般情况下,HET的代码有一个循环,也就是所谓的Loop,做一次循环的时间是一个Loop clock的时间。
    比如你程序中设置了2us的loop clock,那么,编写HET代码的时候,也要让循环在2us之内完成。
    要注意的是:
    1. 循环一般是以CNT指令开始的。如果循环不足2us,那么CNT指令会自动等待,直到Loop clock来临才加1。
    2. HET不会自动跳回CNT这条指令,用户一定要有自己的跳转指令,确保在循环结束后返回到CNT。
    3. 循环如果超过Loop clock的时间,HET的逻辑就会崩溃,硬件会给出一个特别的中断。这样的设计是绝对不允许的。

     以上是一些需要具备的基础概念。
     说到这里,好像还没解释你的具体问题....
    
    大多数有动作的指令如PWCNT,它的动作都是基于Loop clock的。
    如前所述,每个循环中,(一般来说)每条指令都只会被执行一次,PWCNT也不例外,也就是说,PWCNT每2us被执行一次。
    但是它的动作实在条件满足后的下一个loop clock + HR data的时刻触发的。
    比如,我设置了PWCNT的data为50,hr data为50 (不考虑移位),那么前49个loop中,PWCNT指令都不会触发引脚动作。
    第50个loop中,PWCNT的data条件满足了,那么HET会在 (下一个Loop clock来临的时刻) + (50 * HR clock)的时间处,使对应的引脚电平变化。
    所以你会看到PWCNT的分辨率远高于Loop clock的分辨率。

    希望能够解答你的问题。
    祝你开发顺利~
举报

周臻庸

2018-8-13 07:27:42
引用: testd27 发表于 2018-8-13 07:08
Hi Pengyuan,
    已经开始深入到HET的编程了啊,进展很快啊!:)
    你提的这个问题很有价值,就是典型的HET工作原理问题。

Hi Renton,
          首先非常感谢您的详细讲解,说点题外的,我发现你们TI的工程师都很专业和耐心啊,上次会上的马工也是这个风格,您不会就是吧?呵呵。
           回到这个问题,首先,我所使用的PWCNT并没有用到delay,即hr_lr=1。我要产生27Hz固定频率可调脉宽的波形,我将DJZ的data设为
           0x90AD0在其为0时跳至MOV64,其改变PWCNT的data改变占空度,而这个占空度也是百分率乘以0x90AD0而得到的。而(1/27)/0x90AD0=62.5ns,正
          好就是 VCLK时钟4分频后得到的,即HR clock。但这样却无法解释PWCNT指令2us运行一次的说法啊?
           还是没有弄明白,等待您的回复。
举报

李麒铭

2018-8-13 07:42:32
引用: 啦啦啦啦啦啦啦l 发表于 2018-8-13 07:27
Hi Renton,
          首先非常感谢您的详细讲解,说点题外的,我发现你们TI的工程师都很专业和耐心啊,上次会上的马工也是这个风格,您不会就是吧?呵呵。
           回到这个问题,首先,我所使用的PWCNT并没有用到delay,即hr_lr=1。我要产生27Hz固定频率可调脉宽的波形,我将DJZ的data设为

Hi Pengyuan,
    那应该就是我吧...过奖了,呵呵。
    能不能把HET的完整代码发过来看看呢?
举报

周臻庸

2018-8-13 07:51:01
引用: testd27 发表于 2018-8-13 07:42
Hi Pengyuan,
    那应该就是我吧...过奖了,呵呵。
    能不能把HET的完整代码发过来看看呢?

Hi Renton,
 下面是我的代码,你帮我看看。
void LLD_HETInit(void)
[
    hetREG->DIR = 0x0000AACAU;                    
hetREG->DOUT = 0x00000000U;                
hetREG->PDR = 0x00000000U;              
    hetREG->PULDIS = 0xFFFFFFFFU;              
    hetREG->PSL = 0x00000000U;           
    hetREG->HRSH = 0x00000000U;              
    memcpy((void *)hetRAM, (const void *)HETRAM_U32_Const, sizeof(HETRAM_U32_Const));
    hetREG->PFR = 0x00000503U;              
    hetREG->PRY = 0x00000000U;            
    hetREG->GCR = 0x00010003U;             
]
const hetINSTRUCTION_t HETRAM_U32_Const[] =
[
       /*捕获的部分,无异议*/
        [0x00001640U,0x000FFFFFU,0x00000000U],
        [0x00002A20U,0x00002437U,0x00000000U],
    [0x00003A20U,0x00003537U,0x00000000U],
    [0x00004A20U,0x00004637U,0x00000000U],
       [0x00005A20U,0x00005737U,0x00000000U],
    /*这个不是用来控制电机的请忽略*/
    [0x00006AE0U,0x0000649EU,0x00000000U],
    [0x00007A40U,0x0000A006U,0x00000000U],
    /*我所询问的就是这个PWCNT*/
    [0x00008AE0U,0x0000859EU,0x00000000U],
    /*这个是要在PWM低电平的1/2处做AD采样用的*/
    [0x00009A40U,0x00009006U,0x00000000U],
    /*设定周期的DJZ*/
    [0x00000A40U,0x0000C006U,0x00000000U],
    [0x0000B105U,0x0010649EU,16000],
    [0x00007106U,0x0000A006U,64000],
    [0x0000D107U,0x0010859EU,0x00000000U],
    [0x0000E108U,0x00009006U,0x00000000U],
    [0x00000109U,0x0000C006U,0x00000000U],//0x90AD0
];
程序开始时我会hetRAM->Instruction[14].Data = 0x90AD0;将设定周期的DJZ的data值更改
程序运行时我会 hetRAM->Instruction[12].Data = (U32)(0x90AD0 * LLD_MotorDutyCycle);
                             hetRAM->Instruction[13].Data = (U32)((hetRAM->Instruction[12].Data >> 1) + 0x48568);
更改占空度及相对应的PWM低电平1/2处
 
举报

更多回帖

发帖
×
20
完善资料,
赚取积分