ZHCAB39E January 2022 – February 2022 TMS320F28379D , TMS320F28379D-Q1 , TMS320F28379S
Code Composer Studio and C2000are TMs ofTI corporate name.
Other TMs
C2000 实时 MCU 脉冲序列输出 (PTO) API 利用类型 1 或更高版本的可配置逻辑块 (CLB),来生成指定的 PTO 或解码 PTI(脉冲序列输入)。
本文档介绍了用于下列每个模块的实现和相关软件:
PulseGen:输出一个简单脉冲和一个方向指示信号。
QepDiv:调节正交编码脉冲输入(QEP-A、QEP-B 和 QEP-Index)以输出减频的 PTO 信号。
Abs2Qep:将绝对位置的变化转换为等效的 QEP-A/B 和 QEP-I 信号。
QepOnClb 使用 CLB 实现基本 QEP 解码器。
提供两类软件:
应用程序工程示例:小型应用程序,用于配置 C2000 实时 MCU、合并适当的参考库并演示功能。Topic Link Label6介绍了如何访问源代码,将工程导入 CCS,然后构建和运行该示例。
参考 API 库:模块的软件实现。Topic Link Label7包括每个 API 的说明、如何访问源代码以及如何重新构建库。Topic Link Label8说明了如何在您的工程中使用 API。
PTO-PulseGen 函数可用于生成应用所需的脉冲和方向输出。图 2-1 所示为 PulseGen 输出,图 2-2 所示为实现图。
本节概述了如何实现 PTO-PulseGen 接口。此接口由以下组件实现:
PTO-PulseGen 操作具有以下使用限制:
若要实现Topic Link Label2.1中描述的所需功能,需要在 CLB 逻辑块中使用以下资源。
具体实现方式请参阅表 2-1 中的说明和图 2-3 中的图示。
资源 | 功能 | 注意事项 |
---|---|---|
输入 | ||
In0 | 开/关控制(通过 GPREG) | 启用 CLB |
In1 | 上升沿检测 | 通过 EPWM1A |
In2 | 开/关控制(通过 GPREG) | 运行信号(PTO 启动/停止) |
In3 | 未使用 | 未使用 |
In4 | 开/关控制(通过 GPREG) | 设置 PTO 方向 |
In5 | 未使用 | 未使用 |
In6 | 未使用 | 未使用 |
In7 | 未使用 | 未使用 |
输出 | ||
Out0 | 未使用 | 未使用 |
Out1 | 未使用 | 未使用 |
Out2 | 未使用 | 未使用 |
Out3 | 未使用 | 未使用 |
Out4 | 发送使能 | 通过输出 XBar;PTO 脉冲输出 |
Out5 | 发送使能 | 通过输出 XBar;PTO 方向输出 |
Out6 | 未使用 | 未使用 |
Out7 | 未使用 | 未使用 |
逻辑资源 | ||
LUT0 | HLC 中 Event0 的输入 | 使用 in1 或 CNT1 匹配值对编码器输入进行边沿检测。在 HLC 中触发事件以将新值加载到 HLC 寄存器中 |
LUT1 | CNT 1、2、3 的 Mode0 输入 | 用于确定 CNT1、CNT2 和 CNT3 所选模式的逻辑。启动所有三个计数器。 |
LUT2 | 未使用 | 未使用 |
FSM0 | 脉宽生成 | 该状态机将与 CNT0 一同生成若干高和低脉冲宽度。输出将设置 CNT0 的复位值。 |
FSM1 | 活跃周期和完整周期生成 | 根据 CNT1 的 match1 和 match2 输出来设置活跃周期和完整周期的值。输出活跃周期持续时间内的脉冲数,并且在完整周期和活跃周期差值之间不输出脉冲数 |
FSM2 | PTO 输出方向生成 | 生成 PTO 输出方向。输出方向一直保持到由 FSM1 设置的完整周期结束。 |
CNT0 | 脉宽生成 | 计数器 Match1 和 Match2 值决定了高脉冲宽度和低脉冲宽度的触发器。将匹配值加载到 FSM0 输入 e0 和 e1。 |
CNT1 | 活跃周期和完整周期时钟生成 | 生成 FSM1 和 FSM2 所需的输入。Match1 决定了活跃期间的触发器。Match2 决定了完整期间的触发器。FSM1 使用匹配事件来生成活跃周期和完整周期。Match2 用作 FSM0 中额外的外部输入,以确定保持 PTO 输出方向的时间。 |
CNT2 | 完整周期计数器 | Match1 事件用于触发 HLC 中的中断。当信号的完整周期达成后将重置计数器 |
高级控制器 | ||
HLC | Event0 用于触发任务,Event1 用于触发中断 | Event0 用于将 PTO 的新选项从 C28 内核加载到 CLB,Event1 用于根据 CNT2 的 match1 事件生成中断(对应于完整周期)。新的 PTO 选项在此事件后生效。 |
PTO-PulseGen 接口的芯片级输入:无。
PTO-PulseGen 接口的芯片级输出:脉冲输出和方向。在提供的示例中,这些输出将路由至 GPIO,如Topic Link Label6所述。
QepDiv PTO 函数可用于从 QEP 输入生成分离的脉冲流。图 3-1 所示为 QepDiv 输入和输出图。
图 3-2 所示为 CLB 互连图。
图 3-3 所示为 QepDiv 接口的实现图。
本节概述了如何实现 PTO QepDiv 接口。此接口主要由以下组件实现:
PTO-QepDiv 操作具有以下使用限制:
pto_qepdiv_config
函数和相应示例。分频器的初始化通过以下函数完成:
使用 CLB1 中的 COUNTER_2 控制索引脉冲宽度以设置 match1 值。
uint16_t
pto_qepdiv_config(uint16_t divider, uint16_t indexWidth)
{
CLB_writeInterface(CLB2_BASE, CLB_ADDR_COUNTER_0_MATCH2, divider * 4);
CLB_writeInterface(CLB2_BASE, CLB_ADDR_COUNTER_0_MATCH1, divider * 2);
CLB_writeInterface(CLB1_BASE, CLB_ADDR_COUNTER_2_MATCH1, indexWidth - 1);
return(divider);
}
PTO API 实现的源文件位于 [C2000Ware_MotorControl_SDK]\libraries\position_sensing\pto\source 下。
若要实现Topic Link Label3.1中描述的所需功能,需要在 CLB 逻辑块中使用以下资源。
具体实现请参阅以下详细说明和图 3-4 中的图示。
资源 | 功能 | 注意事项 |
---|---|---|
输入 | ||
In0 | 开/关控制(通过 GPREG) | 启用 CLB |
In1 | 开/关控制(通过 GPREG) | QEPA(通过 EPWM4A) |
In2 | 边沿检测 | QEPA(通过 EPWM4A) |
In3 | 未使用 | 未使用 |
In4 | 开/关控制(通过 GPREG) | QEPB(通过 EPWM5A) |
In5 | 边沿检测 | QEPB(通过 EPWM5A) |
In6 | 未使用 | 未使用 |
In7 | 边沿检测 | QEPI(通过 EPWM4B) |
输出 | ||
Out0 | 未使用 | 未使用 |
Out1 | 未使用 | 未使用 |
Out2 | 未使用 | 未使用 |
Out3 | 未使用 | 未使用 |
Out4 | 发送使能 | PTO 方向(通过输出 XBar);CLB 2 的输入 |
Out5 | 发送使能 | QEPI 输出(通过 OUTPUTXBAR3) |
Out6 | 未使用 | 未使用 |
Out7 | 未使用 | 未使用 |
逻辑资源 | ||
LUT0 | 未使用 | 未使用 |
LUT1 | 结合 FSM0 和 FSM1 以确定 QCLK 方向 | 为 FSM1 提供外部输入 0 的输入 |
LUT2 | 未使用 | 未使用 |
FSM0 | QEPA 和 QEPB 之间的交替输入 | 该状态机检查 QEP 信号并在不同信号之间交替 |
FSM1 | 设置 QCLK 方向 | 使用 LUT1 和 FSM0 的输出来设置 QCLK,进而设置方向。输出将路由到 CLB2 作为输入方向 |
FSM2 | 索引脉冲生成 | 接受 QEPI 输入并使用 CNT2 Match2 值来设置 QEPI 输出周期和占空比。 |
CNT0 | 设置索引脉冲宽度值 | 加载通过 CLB_writeInterface 函数设置的 indexWidth-1 值 |
CNT1 | 设置分频器值 | 加载通过 CLB_writeInterface 函数设置的 divider*4 值 |
CNT2 | 设置分频器值 | 加载通过 CLB_writeInterface 函数设置的 divider*2 值 |
高级控制器 | ||
HLC | 未使用 | 未使用 |
资源 | 功能 | 注意事项 |
---|---|---|
输入 | ||
In0 | 开/关控制(通过 GPREG) | 启用 CLB |
In1 | 开/关控制(通过 GPREG) | QEPA(通过 EPWM4A) |
In2 | 边沿检测 | QEPA(通过 EPWM4A) |
In3 | 未使用 | 未使用 |
In4 | 边沿检测 | QEPB(通过 EPWM5A) |
In5 | 未使用 | 未使用 |
In6 | 未使用 | 未使用 |
In7 | 开/关控制(通过 GPREG) | 从 CLB1 out4 路由的 PTO 方向 |
输出 | ||
Out0 | 发送使能 | QEPA 输出(通过 EPWM2A) |
Out1 | 未使用 | 未使用 |
Out2 | 发送使能 | QEPB 输出(通过 EPWM2B) |
Out3 | 未使用 | 未使用 |
Out4 | 发送使能 | 旁路逻辑 |
Out5 | 未使用 | 未使用 |
Out6 | 未使用 | 未使用 |
Out7 | 未使用 | 未使用 |
逻辑资源 | ||
LUT0 | QEPA/QEPB 信号输入 | 当逻辑块为开启状态时,将所选的 QEP 信号发送到 CNT0 作为 mode0 输入 |
LUT1 | 生成高低值 | 高低交替 |
LUT2 | 未使用 | 未使用 |
FSM0 | QEP 脉宽生成 | 该状态机将与 CNT0 一同为 LUT1 和 LUT2 生成若干高和低脉冲宽度。 |
FSM1 | QEPA 信号生成 | 使用 CNT0 和 LUT1 生成 QEPA 输出。 |
FSM2 | QEPB 信号生成 | 使用 CNT0 和 LUT2 生成 QEPB 输出。 |
CNT0 | 用于输出 QEP 信号生成的计数器 | 计数器 Match1 值是 FSM0 的外部输入。Match2 值是计数器的复位值。match2 值传递给 LUT1 和 LUT2。 |
CNT1 | 未使用 | 未使用 |
CNT2 | 未使用 | 未使用 |
高级控制器 | ||
HLC | 未使用 | 未使用 |
PTO-Abs2Qep 函数会将绝对位置的变化转换为正交编码器脉冲序列输出。图 4-1 所示为 PTO-Abs2Qep 接口的实现图。
Abs2Qep 实现方案中使用了以下 C2000 资源:
绝对编码器输出表示旋转轴的准确位置。如果 Qmax 是单次旋转的分辨率,则位置范围将是从 0 到 Qmax。Q17 = 217 或 Q20 = 220 范围内的分辨率很常见。当方向为正向(顺时针)时绝对位置增大,当方向为反向(逆时针)时绝对位置减小。
增量编码器的输出是正交编码器脉冲 (QEP)。此脉冲序列包含以下输出:QEP-A、QEP-B 和 QEP-I,这些输出具有以下特性:
增量编码器的分辨率由码盘周围的线数决定。当每条线通过传感器时,QEP-A 上都会产生一个边沿(下降沿或上升沿),如图 4-3 所示。可通过第二个线环添加第二个通道(位于外环内部并偏离外环)。在这种情况下,该内部线环可以生成 QEP-B。例如,一个 1024 线编码器将有 1024 条 QEP-A 线和 1024 条 QEP-B 线,因此在一次完整旋转中总共有 2048 个 QEP 状态变化。
在 Abs2Qep 中,头文件中的一个可配置参数将定义每条线产生多少个 QEP 状态转换。QEP 状态转换由被称为 QCLK 的内部 CLB 信号进行控制,如图 4-3 所示。默认设置是每条线对应两个 QCLK 脉冲。
表 4-1 中的示例进一步阐明了这一点。
线路 | QCLK | QEP-A | QEP-B |
---|---|---|---|
1 号线外环 | QCLK 1 | 上升沿 | |
1 号线内环 | QCLK 2 | 上升沿 | |
2 号线外环 | QCLK 3 | 下降沿 | |
2 号线内环 | QCLK 4 | 下降沿 |
所有 Abs2Qep 转换计算均由 C28x 处理。根据结果,随后将配置 CLB 逻辑块以生成特定的 QEP 信号。Topic Link Label4.3详细介绍了 CLB 配置。
在 Abs2Qep 转换中会使用 ABS_TO_INCR 比率将绝对位置的变化映射为相应的 QEP 边沿数。边沿的任何一部分都会受到跟踪。如果边沿小数累积值达到 1,则会生成额外的边沿。
其中
代表位置变化的 QCLK 或 QEP 边沿数量为:
其中:
对于给定的位置变化,QCLK 的频率使得边沿能够在整个位置采样周期内均分。该频率以 CLB 时钟周期表示。
给定以下参数:
ABS_TO_INCR 比率为:
表 4-2 显示了从绝对位置变化到生成的 QCLK 数量的转换示例。
请注意,在样片 2 和样片 3 中,边沿小数累积值大于 1。发生这种情况时会生成一个额外的 QCLK,并从边沿小数累积值减去一。
样片 | 位置 | 增量位置 (1) | QCLK | 小数边沿 | 生成的 QCLK 数 | 每个 QCLK 的 CLB 时钟数 (2) |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 24000 | 24000 | 46.875 | 0.875 | 46 | 217 |
2 | 53000 | 29000 | 56.6406 | 0.875 + 0.6406 = 1.515 → 0.515 (3) | 56+1 (3) | 175 |
3 | 62000 | 9000 | 17.5781 | 0.515 + 0.5781 = 1.09375 → 0.09375 (3) | 17+1 (3) | 555 |