主题中讨论的其他器件: HALCOGEN
大家好、
N2HET 模块可生成具有不同占空比的脉冲信号、客户想知道如何将不同的相移应用于这些脉冲信号?
谢谢。
此致、
樱桃
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.
这里的"相移"是否意味着 两个 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、con_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};
LMOV64{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};
LMOV64{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 之前插入延迟。
假设 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
示例代码:
;PWM 编码对应给定的 HCLK 频率= 150MHz、VCLK2=75MHz、hr=1且 LR=32、因此 LRP=426.67ns
;脉宽= 600us,周期= 160ms
;两个 PWM 信号之间的延迟为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、con_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};
LMOV64{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};
您好!
再次感谢您的答复!
客户还有2个问题:
1) 1)下一个程序地址是下一条指令的 RAM 地址。 那么、条件地址意味着什么?在执行条件地址指向的指令之前何时满足条件?如果执行条件地址上的指令、那么指定的下一个程序地址是否不执行?
2) 2) LRP 是计算 MOV64及 SUB 数据寄存器占空比、周期和延迟值的关键。 那么、LRP 分别代表 lr、hr 和 VCLK 是什么意思? 如何确认芯片的实际 VCLK、LR 和 hr?
谢谢。此致、
樱桃
您好、Cherry:
下一个地址是 程序流中下一条指令的下一个程序地址。
条件地址是条件发生时下一条指令的地址。 该条件可以是"等于零"、"负"或"下降沿"。 它基于指令。
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 指令中、条件是数据字段递减到零。
l03 sub{src1=IMM、src2=a、dest=none、next=L04、data=4687};
L04 BR{next=L00、con_addr=L05、event=N};
在子指令中、条件为 EVENT=负。
在 HET 指令部分的一个表中列出了由指令生成的标志。
2) LRP 是计算 MOV64和 SUB 的数据寄存器占空比、周期和延迟值的关键。 那么、LRP 分别代表 lr、hr 和 VCLK 是什么意思? 如何确认芯片的实际 VCLK、LR 和 hr?
所有的 N2HET 时序来自 VCLK2、它是外设时钟中的一个。 VCLK 是主要外设时钟频率、而 VCLK2和 VCLK3是次要外设时钟频率。 HCLK 是系统时钟频率、GCLK 是 CPU 时钟频率。
hr:高分辨率预分频因子(1、2、3、4、...、63、 64) --> HETPFR[5:0]
lr:环路分辨率预分频因子(1、2、4、8、16、 32、64、128) --> HETPFR[10:8]
HRP =高分辨率时钟周期 HRP = hr×TVCLK2 (ns)
LRP =环路分辨率时钟周期 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) 1)如果 PIN3和 PIN4在同一 HET 上、只需在 PIN4的 PWCNT/DJZ 以及 PIN3的 PWCNT/DJZ 之间添加 SUB/BR 操作、如下图所示、是否正确?
2)但现在情况是引脚3和引脚4不在同一 HET 上、如何在 HET2PIN3和 HET1PIN4之间实现10ms 的延迟?
谢谢。此致、
樱桃
您好、Cherry:
N2HET1有32个引脚、而 N2HET2也有32个端子。 从同一 N2HET 模块中选择两个引脚可以 简化一切。
如果您必须使用 N2NET1的一个引脚和 N2HET2的一个引脚、您可以使 N2HET2与 N2HET1同步。 N2HET 提供一个同步机制。 Clk_master/slave (HETGCR.16)将 N2HET 配置为主控或受控模式(缺省为受控模式)。 一个处于主控模式中的 N2HET 提供一个信号 来同步受控 N2HET 的预分频器。 受控 N2HET 将它的环路分辨 率与主控发出的环路分辨率信号同步。 在它接收到第一个同步信号后、从器件不需要这个信号。 然而、只要从器件接收到主器件发出的重新同步信号、从器件就必须再次进行自我同步。
您好、QJ:
N2HET1和 N2HET2的同步问题已得到解决。
1) 1)客户需要在同一 N2HET 之间对 PIN 引脚生成的脉冲信号进行相移。 解决方法是插入 SUB 和 BR 指令。
但情况是、需要 C 编程、客户想知道每个指令程序、控制字段是如何配置的? 尤其是 标记为红色的字段、如下所示:
2) 不同 HET 的引脚生成的脉冲信号之间也需要相移(已经在 HET 间执行了同步)。 如何在 HET 上实现相移? 或者、由于 HET1和 HET2的 RAM 地址不同、如何在模块间寻址?
谢谢。此致、
樱桃
但情况是需要 C 编程,客户希望知道每个指令程序的字段如何配置?
请使用 HET IDE 对我的代码进行仿真并修改代码以满足您的要求。 HET IDE 可生成 c 代码和 c 头文件。 您可以将 HET IDE 生成的 c 代码和头文件添加到您的 CCS 项目中。
2) 不同 HET 的 PIN 引脚生成的脉冲信号之间也需要相移(HET 之间已实现同步)。 如何在 HET 上实现相移? 或者、由于 HET1和 HET2的 RAM 地址不同、如何在模块间寻址?
同步意味着 两个 HET 同时启动其循环计数器。 如果引脚0使用 N2HET1、引脚1使用 N2HET2、则 PIN0边沿和引脚1边沿之间需要延时。 为此、您可以修改我的示例代码。 N2HET1只切换 PIN0、而 N2HET2使用 SUB+BR 指令来切换 PIN1和插入延迟。
请阅读 N2HET 一章和 N2HET 指令的说明。
您好、QJ:
关于问题1、请允许我澄清一下:
客户已实施 C 代码来执行 PWCNT/DJZ/MOV64指令以生成 PWM 脉冲、同时还增加了相移功能。
您能帮助提供所有程序的配置以及对 SUB 和 BR 的控制吗? 以下配置不完整、需要补充其他必要信息、例如 SMODE、Smount、请求类型、请求编号、 依此类推。
l03 sub{src1=IMM、src2=a、dest=none、next=L04、data=4687};
L04 BR{next=L00、COND_addr=L05、EVENT=N}
同步意味着 两个 HET 同时启动其循环计数器。 如果引脚0使用 N2HET1、引脚1使用 N2HET2、则 PIN0边沿和引脚1边沿之间需要延时。 为此、您可以修改我的示例代码。 N2HET1只切换 PIN0、而 N2HET2使用 SUB+BR 指令来切换 PIN1和插入延迟。
请阅读 N2HET 一章和 N2HET 指令的说明。
[/报价]只要两个 HET 之间实现了同步、加上彼此内部使用 SUB 和 BR 实现的延迟、就可以实现这一目的。 前提是 SUB 和 BR 指令配置正确(我认为这里就是这种情况)。
谢谢。此致、
樱桃
请您帮助提供所有程序和控制的配置和 SUB 和 BR 吗? 以下配置不完整、需要补充其他必要信息、例如 SMODE、Smount、请求类型、请求编号、 依此类推。
我介绍了插入延迟的方法、但您需要自行调整子中的参数。 请参阅器件 TRM 中说明。
两个波形之间的延迟=(子数据)* LRP
对于 N2HET1和 N2HET2同步、两个 N2HET 模块同时启动 LRP 计数器。 对于 N2HET1代码、您不需要 SUB 和 BR 指令;对于 N2HET2代码、您需要 sub/BR 来插入延迟。
在 N2HET2代码中、您无需第一个 PWCNT 和 DJZ:
l00 CNT{reg=a、max=0x1FFFFFF、data=0};
l03 sub{src1=IMM、src2=a、dest=none、next=L04、data=4687};
L04 BR{next=L00、con_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};
您好、Cherry:
请使用 HET IDE 来设计和调试 N2HET 代码。 HET IDE 是一个基于 Windows 的应用、它提供了一种开始为 HET 开发和调试代码的简单方法。
HET_IDE IDE IDE、配置、编译器或调试器| TI.com
双击 BR 指令、将弹出 UI、因此您对 GUI 中的字段进行编程。
您好、Cherry:
这是子指令的控制字段:
结果= Src1 - Src2
Src1可以是寄存器(A、B、R、S 或 T)的值、或0、1、或此子指令的数据字段、或远程指令的数据字段。
Src2可以是寄存器(A、B、R、S 或 T)的值、也可以是0、1或此子指令的数据字段的值。
远程地址:其数据字段用作 src1的远程指令的地址
Result=Src1 - Src2存储在"目标"地址中。 "目标"可以是 A、B、R、S、T 或无。 "无"表示结果未保存。
子指令将影响表23-74中定义的标志。 当结果(src1-src2)= 0时、将设置 Z (零标志)。 当结果为负时、N *** 将被设定。
BR 指令中的分支条件指定了触发到条件地址跳转的事件。
分支条件可以是表23-83中列出的任何事件。 如果它为"N"、如果 NEGATIEV 标志被置位(可能由另一指令设置、例如 SUB)、代码将跳转到条件地址。 如果上升、所选引脚的上升沿(PIN 选择字段)将触发跳变。
子指令中的 SMODE 字段指定移位类型或旋转类型。 scount 字段指定将要移位的位数。 将被移位的数据是立即数据字段、进位标志等
你好 QJ,我是 Jonny 来自 SIASUN 机器人。 您能告诉我 在下面的情况下、我应该给 SMODE 和 Snount 分配哪个值吗?
l00 CNT{reg=a、max=0x1FFFFFF、data=0};
l03 sub{src1=IMM、src2=a、dest=none、next=L04、data=4687};
L04 BR{next=L00、con_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};
您好、QJ:
1.在您的指导下、我已经将 src1设置为0001 (IMM)、将 src2设置为010 (a)。 如何设置 Rdest?
2.我不明白这句话的含义"远程地址:数据字段用作 src1"的远程指令的地址。
我们应该为"远程地址"选择哪个值?
如果可能、您能在以下情况下帮助提供所有字段值用于 SUB/BR 说明吗? 非常感谢。
l00 CNT{reg=a、max=0x1FFFFFF、data=0};
L03 sub{src1=IMM、src2=a、dest=none、next=L04、data=4687};src=0001?src2=010?smode=000?scount=00000?远程地址?REST?寄存器选择?RESH?
L04 BR{next=L00、COND_ADDR=L05、EVENT=N};Branch COND = 01001?Request Number=000?request type=00?
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};
您好 QJ:
我 在遵循指导原则的前提下尝试向两个 PWM 脉冲添加10ms 相移、但失败了。 您能帮助更正我在 SUB 和 BR?上的设置吗
首先、我使用以下代码成功地从 HET2引脚3和 HET2引脚4生成两个 PWM 脉冲。
它们具有160ms 周期和600us 占空比的完全同步。
/* P00_0 *//* L00 CNT*/
{
0x00002C80、
0x01FFFFFF、
0x00000000、
0x00000000
}、
/*为 HET2引脚3*/生成 PWM 脉冲
/* P05_PIN03_DUTY_0 *//* L05 PWCNT*/
{
0x0000D5C0、//next:6
0x0000C30E、//COND_addr:6
0x00000000、
0x00000000
}、
/* P06_PIN03_PERIOD_0 *//* L06 DJZ*/
{
0x00013480、//下一个:9
0x0000E006、//COND_addr:7
0x00000000、
0x00000000
}、
/* P07_PIN03_DUTY_UPDATE_0 *//* L07 MOV64*/
{
0x00010205、//next:8
0x0040C30F、//COND_addr:6引脚选择:3
0x0000B000、//设置占空比
0x00000000
}、
/* P08_PIN03_PERIOD_UPDATE_0 *//* L08 MOV64*/
{
0x00012206、//下一个:9
0x0000E006、//COND_addr:7
0x00B71A80、//将周期设置为160ms
0x00000000
}、
/*为 HET2引脚4*/生成 PWM 脉冲
/* P09_PIN04_DUTY_0 *//* l09 PWCNT*/
{
0x000155C0、//next:10
0x0001440E、//COND_addr:10
0x00000000、
0x00000000
}、
/* P10_PIN04_PERIOD_0 *//* L10 DJZ*/
{
0x0001B480、//next:13
0x00016006、//COND_addr:11
0x00000000、
0x00000000
}、
/* P11_PIN04_DUTY_UPDATE_0 *//* L11 MOV64*/
{
0x00018209、//下一个:12
0x0041440F、//COND_addr:10引脚选择:4
0x0000B000、
0x00000000
}、
/* P12_PIN04_PERIOD_UPDATE_0 *//* L12 MOV64*/
{
0x0001A20A、//next:13
0x00016006、//COND_addr:11
0x00B71A80、
0x00000000
}
其次、我插入了 SUB/BR 指令、以便在两个脉冲之间添加10ms。 来自 PIN3的脉冲与之前一样、来自 PIN4的脉冲消失了。
/* P00_0 *//* L00 CNT*/
{
0x00002C80、
0x01FFFFFF、
0x00000000、
0x00000000
}、
/*为 HET2引脚3*/生成 PWM 脉冲
/* P05_PIN03_DUTY_0 *//* L05 PWCNT*/
{
0x0000D5C0、 //next:6
0x0000C30E、 //COND_addr:6
0x00000000、
0x00000000
}、
/* P06_PIN03_PERIOD_0 *//* L06 DJZ*/
{
0x00043480、//next:33
0x0000E006、//COND_addr:7
0x00000000、
0x00000000
}、
/* P07_PIN03_DUTY_UPDATE_0 *//* L07 MOV64*/
{
0x00010205、 //next:8
0x0040C30F、 //COND_addr:6引脚选择:3
0x0000B000、
0x00000000
}、
/* P08_PIN03_PERIOD_UPDATE_0 *//* L08 MOV64*/
{
0x00012206、 //下一个:9
0x0000E006、 //COND_addr:7
0x00B71A80、//将周期设置为160ms
0x00000000
}、
/*为 HET2引脚4*/生成 PWM 脉冲
/* P09_PIN04_DUTY_0 *//* l09 PWCNT*/
{
0x000155C0、 //next:10
0x0001440E、 //COND_addr:10
0x00000000、
0x00000000
}、
/* P10_PIN04_PERIOD_0 *//* L10 DJZ*/
{
0x0001B480、 //next:13
0x00016006、 //COND_addr:11
0x00000000、
0x00000000
}、
/* P11_PIN04_DUTY_UPDATE_0 *//* L11 MOV64*/
{
0x00018209、 //下一个:12
0x0041440F、 //COND_addr:10引脚选择:4
0x0000B000、
0x00000000
}、
/* P12_PIN04_PERIOD_UPDATE_0 *//* L12 MOV64*/
{
0x0001A20A、 //next:13
0x00016006、 //COND_addr:11
0x00B71A80、
0x00000000
}
/*在 PIN3脉冲和 PIN4脉冲之间插入10ms 延迟*/
/* P33_PIN4_SUB *//* L33 sub*/
{
0x00042800、//000000、000、0、000100010、0100、000000000 //下一个:34远程地址:0
0x028A0026、//00、0、101、0001、010、000、00、0、0、1、00、11、0
0x000B7280、//0000000000000010010010100、0000000 //5861:10ms 延迟
0x00000000
}、
/*P34_PIN4_BR *//* L34 BR*/
{
0x00013A00、//000000、000、0、000000000、1101、000000000 //下一个:0
0x0000A300、//000、00、0、0、000、000001001、00100、01001、00、0 //引脚:4 con_addr:9
0x00000000、
0x00000000
}
非常感谢您的大力支持!!
以上示例中应选择哪些信号?
选择代码中使用的引脚编号。 引脚0和引脚1用于代码中,因此请在左侧面板(隐藏信号)中选择0和1,然后单击箭头"->""将这两个信号添加到右侧面板(可见面板)。 然后依次单击"Apply"和"OK"
要运行您的代码、请单击"run"按钮、"run for loops"或"step 指令"或"run to end of loop"、波形将出现在 SynaptiCAD 窗口中。
请阅读 HET IDE 安装文件夹中的用户指南。
对于指令:
1. PWCNT
如果数据> 1;所选引脚(引脚0) =下一个环路分辨率时钟上的引脚操作(PULSEHI)
如果 DATA = 1; 所选引脚(引脚0)=下一个环路时与引脚动作(PULSELOW)电平相反
因此、如果您希望 DUTY = x * LRP、则 PWCNT 中的数据应为:X+1
2. DJZ
当 DATA = 0时、使用 MOV64指令重新加载 PWCNT 和 DJZ 中的数据字段
因此、如果您希望周期= y * LRP、则 DJZ 中的数据字段应为 y-1
您好、QJ:
通过仿真器移植汇编程序代码中的 C 代码后、我可以 实现2ms 的相移、如下所示:
但不幸的是,它只持续不到30秒,然后第二波形消失了大约30秒。
当第二个波形在30s 以后再次出现时、它 从后面变为前面的第一个波形。
也许你可以想象它将-再次消失-更先进-再次消失,这样一个循环。
如果通过删除 SUB/BR 指令消除两个波形的相移、则可以保持两个波形的长期稳定的同步输出
如下所示:
您是否可以在测试平台上长时间运行仿真器程序并观察到意外的外观?
并帮助指出仿真程序中存在什么错误。 非常感谢!
此问题是由计数器溢出导致的。 请对 NHET 代码进行以下更改:
;PWM 编码对应给定的 HCLK 频率= 150MHz、VCLK2=75MHz、hr=1且 LR=32、因此 LRP=426.67ns
;Pulse Width = 600us、PWCNT Data=1407、Period = 160ms、DJZ DATA=374998
;两个 PWM 信号之间的延迟为2ms,subdata=4687
l00 CNT{reg=a、max=374998、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、con_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=L013、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};