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.

RM57L843: HET模块如何生成带有不同相位移的脉冲信号

Part Number: RM57L843

RM57L843的N2HET模块可以生成不同周期的占空比的脉冲信号,如何对这些脉冲信号施加不同的相位移phase shift?

  • 您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 您好,

    如何对这些脉冲信号施加不同的相位移phase shift?

    您说的phase shift是指两个 PWM 信号之间的死区吗? 

  • 你好,简单说就是两个脉冲信号之间如果相位移不一样,周期和占空比一样,那么波形是一样的,只是会有延迟,所以只有周期,占空比和相位移三者都确定了,那么最终的输出波形才确定了

  • 我可以给你贴张图,直观地描述相位移,只是无法上传图片

  • 您点击回复框中的“插入”--"图像/视频/文件"-点击灰色的“上传”按钮,然后选择您需要上传的图片即可(或直接将所需图片拖曳进来)。

  • 好的我们反馈给工程师看下哈。

  • 简单说就是两个脉冲信号之间如果相位移不一样,周期和占空比一样,那么波形是一样的,只是会有延迟,所以只有周期,占空比和相位移三者都确定了,那么最终的输出波形才确定了

    是的,您可以使用 N2HET 汇编指令来实现它。 下面是一个shifting第二代PWM 脉冲的示例:

    ====================

    L00 CNT { reg=A,max=0x1FFFFFF,data=0};

    L01 PWCNT { next=L02,cond_addr=L02,en_pin_action=ON,pin=0,action=PULSEHI,reg=NONE,data=5};
    L02 DJZ { next=L03,cond_addr=L014,reg=NONE};

    L03 SUB { src1=IMM,src2=A,dest=NONE,next=L04,data=7};
    L04 BR { next=L00,cond_addr=L05,event=N};

    L05 PWCNT { next=L06,cond_addr=L06,en_pin_action=ON,pin=1,action=PULSEHI,reg=NONE,data=5};
    L06 DJZ { next=L013,cond_addr=L016,reg=NONE};


    L013 BR { next=L00,cond_addr=L00,event=NOCOND};

    L014 MOV64 { next=L015,remote=L01,control=OFF,en_pin_action=ON,cond_addr=L02,pin=0,comp_mode=ECMP,action=PULSEHI,reg=NONE,data=5,hr_data=2};
    L015 MOV64 { next=L03,remote=L02,control=OFF,en_pin_action=ON,cond_addr=L014,pin=0,comp_mode=ECMP,action=PULSEHI,reg=NONE,data=9,hr_data=2};

    L016 MOV64 { next=L017,remote=L05,control=OFF,en_pin_action=ON,cond_addr=L06,pin=1,comp_mode=ECMP,action=PULSEHI,reg=NONE,data=5,hr_data=2};
    L017 MOV64 { next=L013,remote=L06,control=OFF,en_pin_action=ON,cond_addr=L016,pin=1,comp_mode=ECMP,action=PULSEHI,reg=NONE,data=9,hr_data=2};

    ======================

    使用 PWCNT 和 DJZ 指令生成 PWM 信号。

    MOV64用于更新 PWCNT 和 DJZ 的数据和控制

    SUB 和 BR 用于在第一个 PWM 和第二个 PWM 之前插入延迟。

    https://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/908/PWM.het

  • 你好,谢谢。能帮忙解释下,各条指令里面的参数是什么意思,以及每条指令如何映射成hetRAM的地址,这样我才知道如何将对应的指令的program,control和data写入具体的地址。能否帮忙以生成下面两列脉冲为例子进行说明:1.周期160ms,占空比0.375%,延迟0ms;2.周期160ms,占空比0.375%,延迟2ms。非常感谢!

  • 我们问下看哈。

  • 您好,

    对于脉宽为600us 的情况,您请参阅 PWCNT 指令说明。 PWCNT 的 DATA 和 HR_DATA 字段定义了脉冲的宽度。 在我们给出的工程师的示例代码中,脉宽== (PWCNT data - 1) * LRP 

    DJZ 指令的数据字段指定了周期的长度。 在工程师的示例中,Period =(DJZ Data + 1)* LRP

    两个波形之间的延迟=(SUB Data) * LRP

    假设 VCLK=75MHz、hr_LR=0、hr=1、并且 LR=32、--> LRP=1*32*13.33ns =426.67ns

    要获得600us 的脉冲宽度,PWCNT 的数据寄存器= 600*1000/426.67+1 = 1407.24 -> DATA=1407、hr_data=0.24*32 = 8

    要获得160ms 的周期,DJZ 的数据寄存器= 160*1000*1000/426.67-1 = 374998.71 -- >data=374998、hr_data=0.71*32 = 23

    为了获得2ms 的延迟,SubData = 2ms/LRP = 2000000/426.67 = 4687

    Example code:

    ;PWM code for given HCLK frequency = 150MHz, VCLK2=75MHz, hr=1, and lr=32, so LRP=426.67ns
    ;Pulse Width = 600us, and period = 160ms
    ;The delay between two PWM signals is 2ms
    L00 CNT { reg=A,max=0x1FFFFFF,data=0};

    L01 PWCNT { next=L02,hr_lr=HIGH,cond_addr=L02,en_pin_action=ON,pin=0,action=PULSEHI,reg=NONE,data=1407,hr_data=8};
    L02 DJZ { next=L03,cond_addr=L014,reg=NONE,data=374998};

    L03 SUB { src1=IMM,src2=A,dest=NONE,next=L04,data=4687};
    L04 BR { next=L00,cond_addr=L05,event=N};

    L05 PWCNT { next=L06,hr_lr=HIGH,cond_addr=L06,en_pin_action=ON,pin=1,action=PULSEHI,reg=NONE,data=1407,hr_data=8};
    L06 DJZ { next=L013,cond_addr=L016,reg=NONE,data=374998};


    L013 BR { next=L00,cond_addr=L00,event=NOCOND};

    L014 MOV64 { next=L015,remote=L01,control=OFF,en_pin_action=ON,cond_addr=L02,pin=0,comp_mode=ECMP,action=PULSEHI,reg=NONE,data=1407,hr_data=8};
    L015 MOV64 { next=L03,remote=L02,control=OFF,en_pin_action=ON,cond_addr=L014,pin=0,comp_mode=ECMP,action=PULSEHI,reg=NONE,data=374998,hr_data=23};

    L016 MOV64 { next=L017,remote=L05,control=OFF,en_pin_action=ON,cond_addr=L06,pin=1,comp_mode=ECMP,action=PULSEHI,reg=NONE,data=1407,hr_data=8};
    L017 MOV64 { next=L013,remote=L06,control=OFF,en_pin_action=ON,cond_addr=L016,pin=1,comp_mode=ECMP,action=PULSEHI,reg=NONE,data=374998,hr_data=23};

  • 非常感谢你们的精彩答复。还有两个问题:

    1.Next program address很好理解,就是下一条指令的RAM地址,那么Conditional address又该怎么理解,什么时候或者满足什么条件才会执行Conditional address指向的指令?如果执行了Conditional address上的指令,是不是指定的Next program address就不执行了?这个地方有点迷惑不解。

    2.LRP是计算MOV64和SUB的数据寄存器duty,period和delay值的关键,那么计算LRP的lr,hr和VCLK分别指什么?如何确认芯片实际的VCLK,lr和hr?

  •  好的我们跟进给工程师再看下哈。

  • 您好,

    1.Next program address很好理解,就是下一条指令的RAM地址,那么Conditional address又该怎么理解,什么时候或者满足什么条件才会执行Conditional address指向的指令?如果执行了Conditional address上的指令,是不是指定的Next program address就不执行了?这个地方有点迷惑不解。

    Next address是程序流中下一条指令的下一个程序地址。 

    Conditional address是condition发生时下一条指令的地址。 condition可以是等于零“equal to zero" 、"Negative" 或"falling edge".。 这个是基于指令的。 

    L01 PWCNT { next=L02,hr_lr=HIGH,cond_addr=L02,en_pin_action=ON,pin=0,action=PULSEHI,reg=NONE,data=1407,hr_data=8};
    L02 DJZ { next=L03,cond_addr=L014,reg=NONE,data=374998};

    在 DJZ 指令中,condition是数据字段递减至零。 

    L03 SUB { src1=IMM,src2=A,dest=NONE,next=L04,data=4687};
    L04 BR { next=L00,cond_addr=L05,event=N};

    在SUB指令中,condition是EVENT= negative。

    由指令生成的标志列在 HET 指令部分的一个表中。

    2.LRP是计算MOV64和SUB的数据寄存器duty,period和delay值的关键,那么计算LRP的lr,hr和VCLK分别指什么?如何确认芯片实际的VCLK,lr和hr?

    所有 N2HET 时序都来自 VCLK2,VCLK2是外设时钟之一。 VCLK 是主要外设时钟频率,VCLK2和 VCLK3是次要外设时钟频率。 HCLK 是系统时钟频率,GCLK 是 CPU 时钟频率。 

    hr: high resolution prescale factor (1, 2, 3, 4,..., 63, 64)                ---> HETPFR[5:0]
    lr: loop resolution prescale factor (1, 2, 4, 8, 16, 32, 64,128)        --->HETPFR[10:8] 
    HRP = high resolution clock period HRP = hr × TVCLK2 (ns)
    LRP = loop resolution clock period LRP = lr × HRP (ns)

    如果 PLL 被用作时钟源、GCLK = PLL 时钟

    HCLK=GCLK/2、3、... 最大 HCLK 为150MHz

    VCLK = HCLK/1.2.3…… 最大 VCLK 为110MHz

  • 你好,下面是我们一块RM57L843芯片的两个HET分别输出相同周期和占空比的脉冲信号,一个是HET1的PIN4输出,一个是HET2的PIN3输出。我们现在新的需求是要让HET2的PIN3输出比HET1的PIN4输出增加10ms延迟。

    1.如果PIN3和PIN4在同一个HET上面,似乎只要在PIN4的PWCNT/DJZ和PIN3的PWCNT/DJZ之间增加SUB/BR操作就可以了,如下图所示,是吗?

    2.但是现在PIN3和PIN4不在同一个HET上面,该如何实现HET2PIN3对HET1PIN4的10ms延迟?

  • 您好,

    N2HET1有32个引脚,N2HET2也有32个端子。 从同一个 N2HET 模块中选择两个引脚会让事情简单得多。

    如果您必须使用 N2NET1的一个引脚和 N2HET2的一个引脚,您可以将 N2HET2与 N2HET1同步。 N2HET 有一个同步机制。 Clk_master/slave (HETGCR.16)将 N2HET 配置为主控或受控模式(默认为受控模式)。 主控模式中的 N2HET 提供一个信号来同步受控 N2HET 的预分频器。 从器件 N2HET 将其环路分辨率与主器件发送的环路分辨率信号同步。 从器件在接收到第一个同步信号后不需要该信号。 但只要从器件接收到来自主器件的重新同步信号,从器件就必须再次进行自身同步。

  • 你好,N2HET1和N2HET2的同步问题,我们已经解决了。并且可以分别从两个HET的PIN脚输出相同周期和占空比的PWM脉冲。

    为了尽快收敛问题,我来总结一下我们实际的业务需求:

    1.我们需要在同一个N2HET之间的PIN脚产生的脉冲信号做相位移。这个之前贵公司的工程师已经给出方案,即插入SUB和BR指令。

    问题是我们需要进行C语言编程,需要知道每个指令program、control的field如何配置。尤其是如下红圈标记的field如果配置不当,相位移很可能功能实现不了。

    2.我们同时也需要在不同的HET的PIN脚产生的脉冲信号之间产生相位移(HET之间已经实现同步),该如何进行跨HET的相位移实现,或者说如何跨模块寻址?毕竟HET1和HET2的RAM的地址不一样。请给出具体的可行方案。

    以上两个问题请务必帮忙答复,否则我们的项目进度将会严重被delay!!非常感谢!!

  • 我们跟进给工程师了,英文链接也贴在下面了,您可以多多关注工程师的答复:

    e2e.ti.com/.../4402099

  • 你好!我已经看到英文论坛的回复了,第一个问题可能是回答问题的工程师理解错了,我们已经实现了C代码执行PWCNT/DJZ/MOV64指令来生成PWM脉冲,只是需要添加相位移功能,所以请提供SUB和BR所有program和control的配置,下面提供的配置不完整,需要补充其他必要的信息,如Smode,Scount,Request type,Request Number等。

    L03 SUB { src1=IMM,src2=A,dest=NONE,next=L04,data=4687};
    L04 BR { next=L00,cond_addr=L05,event=N}

    第二个问题,只要两个HET之间实现同步再加上在各自内部使用SUB和BR实现延迟就可以解决了,不过前提还是要能够正确配置SUB和BR指令。

    时间紧迫,请帮忙协助尽快解决。谢谢!

  • 我觉得这样沟通太费劲了,他还是没有回答我们的问题,麻烦你直接问他下面的field分别怎么配吧。谢谢。

  • 我们已跟进哈,您可以多多关注英文论坛的答复。

  • 谢谢您的support。但是我的问题始终没有得到答复。我真正想问的是如何为SUB和BR里面相关的field选择配置(不是方法而是不理解不同的配置值代表的意思)。需要指导如何为SUB的Smode,Scount,Remote address和BR的Branch Condition选择配置。比如smode和Branch Condition有如下选项,我该如何选择?非常感谢!

  • 您好,

    我们注意到您在英文论坛这边已跟进,那么我们会先将这个帖子关闭,如您仍有其他问题可以随时reopen该贴。

    e2e.ti.com/.../4402099

  • 你好!

    我们已经用N2HET模块成功生成两个同步的周期为160ms占空位600us的脉冲信号。它们分别由HET2的PIN3和PIN4发出。

    但是在按照贵公司技术专家QJ WANG的要求插入SUB和BR指令后,还是没有办法让这两支脉冲产生相位移。请帮忙看看SUB和BR指令的program和control的配置是否正确。项目因此严重delay,务请帮忙处理,非常感谢!

    首先,我使用以下代码成功地从HET2 PIN3和HET2 PIN4生成了两个pwm脉冲。周期为160ms,占空为600us,而且完全同步。

    /* P00_0 *//*L00 CNT*/
    {
    0x00002C80,
    0x01FFFFFF,
    0x00000000,
    0x00000000
    },
    /*Generate pwm pulse for HET2 PIN3*/
    /* P05_PIN03_DUTY_0 *//*L05 PWCNT*/
    {
    0x0000D5C0,
    0x0000C30E,
    0x00000000,
    0x00000000
    },
    /* P06_PIN03_PERIOD_0 *//*L06 DJZ*/
    {
    0x00013480, //next:9
    0x0000E006, //con_addr:7
    0x00000000,
    0x00000000
    },
    /* P07_PIN03_DUTY_UPDATE_0 *//*L07 MOV64*/
    {
    0x00010205,
    0x0040C30F,
    0x0000B000, //set duty
    0x00000000
    },
    /* P08_PIN03_PERIOD_UPDATE_0 *//*L08 MOV64*/
    {
    0x00012206,
    0x0000E006,
    0x00B71A80, //set period to 160ms
    0x00000000
    },
    /*Generate pwm pulse for HET2 PIN4*/
    /* P09_PIN04_DUTY_0 *//*L09 PWCNT*/
    {
    0x000155C0,
    0x0001440E,
    0x00000000,
    0x00000000
    },
    /* P10_PIN04_PERIOD_0 *//*L10 DJZ*/
    {
    0x0001B480,
    0x00016006,
    0x00000000,
    0x00000000
    },
    /* P11_PIN04_DUTY_UPDATE_0 *//*L11 MOV64*/
    {
    0x00018209,
    0x0041440F,
    0x0000B000,
    0x00000000
    },
    /* P12_PIN04_PERIOD_UPDATE_0 *//*L12 MOV64*/
    {
    0x0001A20A,
    0x00016006,
    0x00B71A80,
    0x00000000
    }

    然后,我在此基础上插入SUB/BR指令,希望在两个脉冲之间增加10ms延迟。来自PIN3的脉冲与之前相同,来自PIN4的脉冲非但没有延迟反而消失了。

    /* P00_0 *//*L00 CNT*/
    {
    0x00002C80,
    0x01FFFFFF,
    0x00000000,
    0x00000000
    },
    /*Generate pwm pulse for HET2 PIN3*/
    /* P05_PIN03_DUTY_0 *//*L05 PWCNT*/
    {
    0x0000D5C0,
    0x0000C30E,
    0x00000000,
    0x00000000
    },
    /* P06_PIN03_PERIOD_0 *//*L06 DJZ*/
    {
    0x00043480, //next:33
    0x0000E006, //con_addr:7
    0x00000000,
    0x00000000
    },
    /* P07_PIN03_DUTY_UPDATE_0 *//*L07 MOV64*/
    {
    0x00010205,
    0x0040C30F,
    0x0000B000,
    0x00000000
    },
    /* P08_PIN03_PERIOD_UPDATE_0 *//*L08 MOV64*/
    {
    0x00012206,
    0x0000E006,
    0x00B71A80, //set period to 160ms
    0x00000000
    },
    /*Generate pwm pulse for HET2 PIN4*/
    /* P09_PIN04_DUTY_0 *//*L09 PWCNT*/
    {
    0x000155C0,
    0x0001440E,
    0x00000000,
    0x00000000
    },
    /* P10_PIN04_PERIOD_0 *//*L10 DJZ*/
    {
    0x0001B480,
    0x00016006,
    0x00000000,
    0x00000000
    },
    /* P11_PIN04_DUTY_UPDATE_0 *//*L11 MOV64*/
    {
    0x00018209,
    0x0041440F,
    0x0000B000,
    0x00000000
    },
    /* P12_PIN04_PERIOD_UPDATE_0 *//*L12 MOV64*/
    {
    0x0001A20A,
    0x00016006,
    0x00B71A80,
    0x00000000
    }
    /*Insert 10ms delay between PIN3 pulse and PIN4 pulse*/
    /*P33_PIN4_SUB *//*L33 SUB*/
    {
    0x00042800, //000000,000,0,000100010,0100 ,000000000 //next:34 remote address:0
    0x028A0026, //00000,0,101,0001,010,000,00000,0,0,1,00,11,0
    0x000B7280, //0000000000000010010010100,0000000 //5861:10ms delay
    0x00000000
    },

    /*P34_PIN4_BR *//*L34 BR*/
    {
    0x00013A00, //000000,000,0,000000000,1101,000000000 //next:0
    0x0000A300, //000,00,0,0,000,000001001,00100,01001,00,0 //pin:4 con_addr:9
    0x00000000,
    0x00000000
    }

  • 十分抱歉给您带来的不便,目前您的问题我们只能求助QJ Wang。昨天和今天也是国外的休息日哦,所以工程师没有办法回复您。由于这周是国外的感恩节假期,所以回复都会相对慢一些,再次抱歉。

  • 你好!那就麻烦你帮忙催促一下,我们的开发进度因此受到严重影响了。非常感谢!

  • 你好,这个问题已经提出有近一个月了,请帮忙尽快找相关专家确认。谢谢!

  • 抱歉给您带来的不便,我们的专家目前在休假中,预计将于12月1日返回。如12.5日之前仍然没有新的进展,我们再来发邮件催促下哈。

  • 你好!贵公司的专家一定要我提供含汇编的.het文件,但是我们现在没有,需要利用HET IDE生成。请帮忙提供HET IDE,我尝试很多次下载,但都失败了。

  • 您好,关于汇编代码格式的问题我们还需要内部确认下,有结果之后会尽快为您提供转换的方法。

  • 请问有消息了吗?QJ坚持让我用HET IDE将汇编代码转为C代码。

  • 我们还在确认中哦,有新的进展会尽快跟进给您。

  • 您好,

    贵公司的专家一定要我提供含汇编的.het文件,但是我们现在没有,需要利用HET IDE生成。请帮忙提供HET IDE,我尝试很多次下载,但都失败了。

    请按照以下帖子中的步骤进行操作:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1097762/het_ide-not-able-to-download-het-ide

    (请注意下载时需要使用personal email注册的TI account,不要使用TI company account)

  • 你好,我尝试用私人邮箱的账号下载还是失败,表现为点击下面蓝色链接后没有反应。请帮忙尽快分析解决。非常感谢!

  • 请右键单击下载链接-->Save link as...:

  • 可以了,谢谢!请问关于这个开发工具,有操作指南吗?

  • 请参阅以下user guide:

    https://www.ti.com.cn/cn/lit/ug/spnu483a/spnu483a.pdf

    关于其他技术问题您可以继续在英文论坛跟进。

  • 你好,这个问题在英文论坛提了好几天了,QJ还是没有回复,请帮忙推动一下,谢谢!

  • 抱歉目前国外还是假期哦,您可以再耐心等待下。