UCD3138数字电源控制器架构和电源外设简介
Loading the player...
将在30s后自动为您播放下一课程
在本教程中, 我将介绍数字电源 外设, 尤其着重介绍 数字脉冲宽度调制, 或者说 DPWM 块。 此演示 随实验练习二一起提供。 在上一教程中,我们已简要 介绍了 ARM 内核、 闪存以及 PMBus 接口。 现在,我们将着重介绍 DPWM 模块及其两个 关联的输出引脚。 UCD3138 系列 每个成员产品的内核 是数控 环路外设, 也称作数字电源 外设,或简称 DPP。 这些器件用于 控制电源中的 高速电压和 电流环路。 它们旨在 替代基于 模拟电压管理 控制器 IC 的电源中 采用的模拟 补偿网络和 PWM 生成系统, 并向系统 添加增强的 数字功能。 在许多情况下, 在启动时, 由固件初始化后, DPP 可以完全自主控制电源, 且无任何 固件干预。 这使处理器资源 得到更为改善的监控、 通信以及 其他功能。 这里是数字 电源外设 最为简单的 配置, 突显了环路控制中 涉及的关键模块。 在前端,误差 ADC 接受以差动电压 信号作为输入。 它测量在该输入 和数字控制的 基准电压 之间的差异, 并生成 数字误差输出。 误差 ADC 或 EADC 是 专业的高速、 高分辨率 ADC, 具有专为电源误差测量 而优化的 小动态范围。 滤波器获得 误差信号 并通过可补偿 外部环路特性的 基于 PID 的 数字滤波器 传递信号。 可对该滤波器 重新动态编程 以更改电源负载、 源和环路特性。 它还提供非线性 响应能力, 以更好地 处理瞬态。 补偿器的输出会 传入数字 PWM 生成器, 也称作 DPWM 生成器。 DPWM 具有 两项可通过 许多不同方式使用的输出。 具有针对同步整流、 多相、 各种桥接拓扑 以及 LLC 配置的模式。 本系列教程 稍后将介绍 一些其他选项。 UCD3138 器件系列 支持多组 数字电源 外设, 提供控制 多达三种反馈回路, 电压或电流, 以及同时驱动 8 种输出的能力。 在实验练习二中,我们将着重介绍 数字 PWM 块。 目标是获得对开环模式下的 DPWM 操作的基本认识; 输出数字 PWM 输出引脚上的 简单波形图; 使用 内存调试器更改 波形脉冲宽度。 在较早一期教程中, 我们介绍了内存调试器。 这是 UCD3138 器件 GUI 的 工具包的一部分。 我们将使用内存调试器的 HyperKnob 功能来调整 波形脉冲宽度。 在 DPWM 模块中央 是 DPWM 周期寄存器 和 DPWM 计数器。 两个寄存器均为 14 位宽。 DPWM 计数器 数值递增,直至 其等于周期 寄存器中的值。 当出现此情况时, DPWM 计数器 会复位并再次启动。 DPWM 计数器 可从 PCLK 计时, PCLK 以 250 MHz 运行。 因此,DPWM 计数器数值 每 4 ns 按一定增量递增。 在开关式 电源控制上下文中, 周期值表示 一个开关周期。 现在,我将演示 如何设置周期。 四个 DPWM 模块中, 每个模块均有称作 DPWM PRD 的 周期寄存器。 该寄存器中的相关字段 称作 PRD。 它存在于位 17 至位 4, 含位 17 以及位 4。 寄存器中保留了 四个最低有效位, 因此,不应使用 除 0 以外的任何值 覆盖。 现在,我将演示 如何将 DPWM 模块的周期 设置为 0 至 10 ms。 要获取 14 位值 以置于 PRD 字段, 应将周期除以时基, 两者均以秒为单位, 并将结果 取整为最近的整数。 在我们的例子中,周期 是 10 ms, 并且时基是 4 ns, 所以结果是 2,500。 要将该值直接至于 DPWM PRD 寄存器中, 我们需要计入 周期字段的位 0 与 寄存器的 位 4 对齐这一事实。 因此,我们 需要将结果 左移 4 位,这相当于 乘以 16,即 2 的 4 次方。 在 C 代码中 语句将是这样的。 这些寄存器本身 及其内部的字段 在 C 代码中 将以结构体的形式组织。 第一条语句 将寄存器中的所有位 设置为 常量值, 以获得 10 ms 的 开关周期。 第二条语句仅 设置寄存器内 PRD 字段中的位。 它计入寄存器内部 PRD 字段的对齐, 且不修改 任何其他位。 第一条语句 灵活度较低,但是 在处理生成的 ARM 汇编 代码方面更高效。 它仅是单 注册器写入。 第二条语句将 产生更多的汇编码, 因为其涉及将寄存器的 内容复制到 ARM 内核,使用 逻辑操作 修改与 PRD 字段关联的位, 然后将修改的值 写回寄存器。 因此,与第一个操作相比,第二个操作 将占用更多字节 和耗费更多 处理器时钟周期。 但是,第二条 C 语言更易支持, 因为您无需 担心寄存器中 其他字段的 内容。 好的做法是, 在开发过程中使用 .bit 结构, 然后,当需要 更高效的代码时, 将其改为 .all 结构。 现在,我将演示 如何 在开环模式下控制 DPWM 的 A 和 B 两项输出。 开环模式意味着 DPWM 完全由其 自身的寄存器控制, 而非滤波器输出控制。 换句话说,电源 控制环路未闭合。 我们将在稍后的 实验练习中闭合环路。 在开环模式下,输出 A 的 上升沿和下降沿 由事件 1 和 事件 1 控制。 事件 1 和事件 2 是 两个寄存器的内容。 输出 B 的 上升沿和下降沿 由事件 3 和 事件 4 控制。 同样,这些值存储在两个 单独的寄存器中。 在此我们可以看到 DPWM 计数器 从 0 增大到事件 1。 当计数器值 等于事件 1 时,输出 DPWM A 会被置位。 当计数器值等于事件 2 时, DPWM A 会被复位。 当计数器值 等于事件 3 时, 输出 B 会被置位; 当计数器值达到 事件 4 时,输出 B 会被复位。 当计数器值等于 周期寄存器中的值时, 计数器会复位 且另一开关周期 会启动。 事件 1 存储在 寄存器 DPWMEV1 中。 因此,每个 DPWM 模块将 具有一个独特的 DPWMEV1 寄存器与其相关联。 寄存器 从 PCLK 驱动, 因此具有与 周期寄存器 相同的 4 ns 时基。 它还具有与周期寄存器 相同的校准, 因此,事件 1 字段 与 DPWMEV1 寄存器的 位 4 对齐。 在上一示例中, 通过将 2,500 置于 PRD 字段中, 我们将周期 设为 10 ms。 为将输出 A 设为在 10% 周期时处于高位, 我们将事件 1 设为 250,即将 PRD 值除以 10。 事件 2 存储在 称作 DPWMEV2 的寄存器中。 每个 DPWM 模块可作为 唯一的 DPWMEV2 寄存器。 事件 2 的分辨率 和周期比 事件 1 高 16 倍。 它具有 250 ps 的 时基。 通过提供 DPWM 模块 可取得额外的分辨率, 前提是该模块具有 16 个分别 为 250 MHz 的移相时钟信号。 我们已将周期 设为 10 ms, 并将输出 A 的 上升沿 设为在周期的 10% 时发生。 为将输出 A 在 25% 周期时复位, 我们将周期除以 4。 然后,我们将结果乘以 16 以计入 事件 2 的 比该周期精度高 16 倍的时基。 值得注意的是, 即使事件 2 比事件 1 及该周期的分辨率 高 16 倍, 事件 1 以及 周期字段均会 在其相应 寄存器中抵消, 以计入 更小的时基。 因此,您在写入 整个寄存器时, 无需考虑事件 2 更小的时基。 因此,出于明确性 和简洁性考虑, 我们不建议在写入 这些寄存器时 使用 .bit 结构。 使用 .all 结构 并将事件寄存器 设为周期百分比。 在此代码示例中,我们使用 预处理程序 #define 指令 来定义 PCLK 周期 和开关周期, 单位为秒。 然后,我们使用 这两个值计算 要置于周期寄存器中的值。 通过将周期值简单乘以 0.1、0.25、 0.5 和 0.75, 事件 1、2、3 和 4 寄存器会 设为等于周期的 10%、25%、50% 和 75%。 如果我们决定更改 开关周期, 我们只需更改 指派给 #define 周期的秒数, 然后所有 事件寄存器 将自动扩展。 事件 3 和事件 4 将 分别存储在 DPWMEV3 和 EV4 中。 他们具有与事件 2 相同的 对齐和时基, 即,它们为 18 位宽且具有 250 ps 的时基。 这是 DPWM 模块的 简化逻辑图, 涵盖迄今为止 我们已讨论的问题。 我们看了开环模式中的 DPWM 操作。 即,DPWM 输出完全 由其寄存器 而非滤波器 输出控制。 有多得多的逻辑 以及更多的寄存器 与 DPWM 操作关联,我们将这些实验中 讨论其中的部分内容。 现在,我们将事件寄存器的 输出直接传入 并经过大量 可配置的时序 逻辑。 我们将在稍后的实验中 回顾该逻辑的某些内容。 现在,对于其他 初始化, 您将需要 置于 C 代码中, 以在开环模式下 使用 DPWM 模块。 您应在初始化前 关闭 DPWM0, 具体方法是清除 DPWM 控制 寄存器 0 中的 PWM 启用位。 默认情况下, 该位实际上会被清除, 因此,严格意义上而言, 这不是必需的, 但是,尽管如此,这仍然是 好的做法。 由于我们在开环模式下 操作 DPWM 模块, 因此我们需要关闭 DPWM 的滤波器输入, 从而 DPWM 操作 完全由 其自身的寄存器控制。 我们所采取的具体方法是清除 PWM 控制 寄存器 0 中的 CLA 启用位。 CLA 是控制律加速器的 缩写词。 这只是滤波器的 另一名称。 接下来,我们需要在本地 开启 DPWM 模块, 具体方法是在 DPWM 控制 寄存器 0 中设置 PWM 启用位。 最后,我们需要在全局 开启 DPWM 模块, 具体方法是在 GLB 启用模块中 设置相关全局启用位。 每个 DPWM 具有其 自身的全局启用位。 我们在此为 DPWM 模块 0 设置位。 如果您要查找有关 该实验目前为止 所涵盖主题的 更全面的信息, 请参阅 UCD3138 数字电源外设 程序员手册。 现在,我们来看一下 C 源代码和 内存调试器 HyperKnob。 此处是 Code Composer Studio 中 实验练习二的 main.c。 要存储所有 初始化代码, 我们创建了 名为 init_dpwm0 的函数。 这主要是为了清楚直观。 如果您愿意,您也可以将 初始化代码直接 放在主程序自身的开始处。 此处,我们于初始化前 在本地禁用了 DPWM0 模块。 此处,我们禁用了 至 DPWM0 的滤波器输入, 以便为开环操作设置 DPWM0 模块。 我们在此设置 事件 1 寄存器的周期。 请注意,对于加载至 寄存器的值, 我使用符号引用。 我已在主程序顶部 使用 C #define 指令 添加了这些符号引用。 可将它们平等地置于 一个单独的头文件中。 使用符号引用 有关个人风格。 您可以平等地使用 硬编码常量。 在此,我们使用符号引用来 增加代码清晰度。 例如,清楚可见该周期为 10 ms。 请注意,事件 1 随周期扩展。 如果我们更改周期,则事件 1 将相应扩展。 对于该实验,请 添加 C 代码 以使事件 2、3 和 4 相应 在周期的 25%、50% 的 读数。 本教程稍后 将展示该解决方案。 最终,我们以本地方式和 全局方式启用了 DPWM0。 这是主程序。 此处是用于清除 校验和的后门, 以防锁定 编程闪存。 如果您要包括 该代码,请 确保连接要 相应拉动的引脚。 在本例中,您应将 FAULT3 引脚 接地,以使操作正常。 此处,我们调用函数来 初始化 PMBus 处理程序。 然后,我们调用 我们刚才添加的 函数以初始化 DPWM0。 这是具有 PMBus 处理程序 调用例程的主循环, 如实验练习一中所示。 这使我们能够 在固件运行时 通过 PMBus 与器件联系。 其他代码片段 与 HyperKnob 关联, 我将很快进行详细讨论。 当您将代码添加到 整个实验练习二时, 在 Code Composer Studio 中构建代码 并使用该器 件 GUI 下载。 这是 UCD 器件 GUI。 如前下载代码。 请勿写入 程序校验和。 如果在下载该固件时 已选定该选项, 则您刚才下载至 编程闪存的代码 将在其下载至 编程闪存后 立即开 始执行。 如未执行,请单击该链接 以开始执行该代码。 如果您将示波器 探针置于开环板的 引脚 DPWM0A 和 DPWM0B 您应看到这些波形。 传感器位于开关周期的 开头和末尾。 您可以看到 开关周期为 10 ms。 您还可以看到 输出 A 的上升沿 就位于开关周期的开头, 该上升沿与事件 1 相对应。 与事件 2 相 对应的下降沿 是在周期路线的 25 %处。 对于输出 B,您可以看到 上升沿和下降沿 分别在开关周期的 50% 和 75% 处出现。 现在,我将演示如何 设置内存调试器的 HyperKnob 功能。 我们将使用 HyperKnob 经由 PMBus 接口 即时修改 事件 2 的值。 要设置 HyperKnob, 我们首先在 C 源代码中 定义 RAM 的位置。 在此,我们定义了称作 ram_event2 的 RAM 变量。 非常重要的是, 务必在 RAM 变量定义后 添加以下注释。 内存调试器 解析 C 代码。 如果在变量定义后看到该 常见结构体, 它会在内存 调试器中 为该变量 启用 HyperKnob 功能。 我们希望 通过 HyperKnob 控制的 最小、最大以及 步进变量值 均位于注释中的 方括号内。 HyperKnob 仅适用于离散变量, 而不适用于 复杂的外设结构。 因此,我们用其 修改整型变量, 并将变量映射至 代码内部外设结构中的 某个字段 以修改该字段。 此处, 我们初始化 将与 HyperKnob 一起 使用的 RAM 变量, 方法是将该变量 设为事件 2 的值。 这是在主循环 前完成。 此处,事件 2 已设为 我们将使用 HyperKnob 控制的 RAM 变量的值。 当我们使用 HyperKnob 功能时, 我们通过 PMBus 修改了 变量 ram_event2 的值, 我稍后将 展示该功能的用法。 记住, PMBus 通信 是使用 C 代码中的 PMBus 处理程序实现的。 在我们退出 PMBus 处理程序例程时, 如果 ram_event2 因 我们使用 HyperKnob 对其进行了更改 而更改了值, 则事件 2 会在从 PMBus 处理 程序例程返回后, 在主循环中被 设为 ram_event2 的新值。 现在,我将展示 如何使用 HyperKnob。 打开内存调试器。 通过导航至含有实验练习二 映射文件的文件夹, 加载 存储器映射。 对于我们, 这会在存储 C 源文件的 文件夹中的 UCD3138 目录。 查找内存 调试器中 称作 ram_event2 的变量。 选中最右侧 Autowrite 列中的框。 选中后,您对该 变量值的变更 将自动 写入器件。 单击“Refresh”(刷新) 可通过 PMBus 接口 读取 ram_event2 的值。 单击含有 该值的单元格。 您将看到 ram_event2 等于 10,000, 这是事件 2 的初始值, 对应 10 ms 周期的 25%。 当选中单元格时, 您还会在单元格最右侧 看到向上和向下箭头。 这是 HyperKnob。 单击向上箭头键。 观察 ram_event2 的 值增长 2,500。 单击向下箭头键。 观察 ram_event2 的 值减少 2,500。 这是因为 C 代码中 在变量定义后紧跟的 备注字段 内的“step” 已设为 2,500。 当我们使用 HyperKnob 降低 ram_event2 的值时, 我们可以看到 事件 2 同时增长。 与此类似,如果我们 降低变量 ram_event2 的值。 该值反映了在 出现输出 A 的 下降沿的周期 中的时间 量。 这是因为 事件 2 已映射 至 C 代码的主循环中的 变量 ram_event2。 这里是实验练习二的解决方案。 我们为事件 2、事 件 3 和事件 4 创建了三个 符号引用, 并将这些符号引用的 值分别设置为 周期的 25%、50% 以及 75%。 此处,我们将 事件 2、3 以及 4 寄存器初始化 为其相应的值。
在本教程中, 我将介绍数字电源 外设, 尤其着重介绍 数字脉冲宽度调制, 或者说 DPWM 块。 此演示 随实验练习二一起提供。 在上一教程中,我们已简要 介绍了 ARM 内核、 闪存以及 PMBus 接口。 现在,我们将着重介绍 DPWM 模块及其两个 关联的输出引脚。 UCD3138 系列 每个成员产品的内核 是数控 环路外设, 也称作数字电源 外设,或简称 DPP。 这些器件用于 控制电源中的 高速电压和 电流环路。 它们旨在 替代基于 模拟电压管理 控制器 IC 的电源中 采用的模拟 补偿网络和 PWM 生成系统, 并向系统 添加增强的 数字功能。 在许多情况下, 在启动时, 由固件初始化后, DPP 可以完全自主控制电源, 且无任何 固件干预。 这使处理器资源 得到更为改善的监控、 通信以及 其他功能。 这里是数字 电源外设 最为简单的 配置, 突显了环路控制中 涉及的关键模块。 在前端,误差 ADC 接受以差动电压 信号作为输入。 它测量在该输入 和数字控制的 基准电压 之间的差异, 并生成 数字误差输出。 误差 ADC 或 EADC 是 专业的高速、 高分辨率 ADC, 具有专为电源误差测量 而优化的 小动态范围。 滤波器获得 误差信号 并通过可补偿 外部环路特性的 基于 PID 的 数字滤波器 传递信号。 可对该滤波器 重新动态编程 以更改电源负载、 源和环路特性。 它还提供非线性 响应能力, 以更好地 处理瞬态。 补偿器的输出会 传入数字 PWM 生成器, 也称作 DPWM 生成器。 DPWM 具有 两项可通过 许多不同方式使用的输出。 具有针对同步整流、 多相、 各种桥接拓扑 以及 LLC 配置的模式。 本系列教程 稍后将介绍 一些其他选项。 UCD3138 器件系列 支持多组 数字电源 外设, 提供控制 多达三种反馈回路, 电压或电流, 以及同时驱动 8 种输出的能力。 在实验练习二中,我们将着重介绍 数字 PWM 块。 目标是获得对开环模式下的 DPWM 操作的基本认识; 输出数字 PWM 输出引脚上的 简单波形图; 使用 内存调试器更改 波形脉冲宽度。 在较早一期教程中, 我们介绍了内存调试器。 这是 UCD3138 器件 GUI 的 工具包的一部分。 我们将使用内存调试器的 HyperKnob 功能来调整 波形脉冲宽度。 在 DPWM 模块中央 是 DPWM 周期寄存器 和 DPWM 计数器。 两个寄存器均为 14 位宽。 DPWM 计数器 数值递增,直至 其等于周期 寄存器中的值。 当出现此情况时, DPWM 计数器 会复位并再次启动。 DPWM 计数器 可从 PCLK 计时, PCLK 以 250 MHz 运行。 因此,DPWM 计数器数值 每 4 ns 按一定增量递增。 在开关式 电源控制上下文中, 周期值表示 一个开关周期。 现在,我将演示 如何设置周期。 四个 DPWM 模块中, 每个模块均有称作 DPWM PRD 的 周期寄存器。 该寄存器中的相关字段 称作 PRD。 它存在于位 17 至位 4, 含位 17 以及位 4。 寄存器中保留了 四个最低有效位, 因此,不应使用 除 0 以外的任何值 覆盖。 现在,我将演示 如何将 DPWM 模块的周期 设置为 0 至 10 ms。 要获取 14 位值 以置于 PRD 字段, 应将周期除以时基, 两者均以秒为单位, 并将结果 取整为最近的整数。 在我们的例子中,周期 是 10 ms, 并且时基是 4 ns, 所以结果是 2,500。 要将该值直接至于 DPWM PRD 寄存器中, 我们需要计入 周期字段的位 0 与 寄存器的 位 4 对齐这一事实。 因此,我们 需要将结果 左移 4 位,这相当于 乘以 16,即 2 的 4 次方。 在 C 代码中 语句将是这样的。 这些寄存器本身 及其内部的字段 在 C 代码中 将以结构体的形式组织。 第一条语句 将寄存器中的所有位 设置为 常量值, 以获得 10 ms 的 开关周期。 第二条语句仅 设置寄存器内 PRD 字段中的位。 它计入寄存器内部 PRD 字段的对齐, 且不修改 任何其他位。 第一条语句 灵活度较低,但是 在处理生成的 ARM 汇编 代码方面更高效。 它仅是单 注册器写入。 第二条语句将 产生更多的汇编码, 因为其涉及将寄存器的 内容复制到 ARM 内核,使用 逻辑操作 修改与 PRD 字段关联的位, 然后将修改的值 写回寄存器。 因此,与第一个操作相比,第二个操作 将占用更多字节 和耗费更多 处理器时钟周期。 但是,第二条 C 语言更易支持, 因为您无需 担心寄存器中 其他字段的 内容。 好的做法是, 在开发过程中使用 .bit 结构, 然后,当需要 更高效的代码时, 将其改为 .all 结构。 现在,我将演示 如何 在开环模式下控制 DPWM 的 A 和 B 两项输出。 开环模式意味着 DPWM 完全由其 自身的寄存器控制, 而非滤波器输出控制。 换句话说,电源 控制环路未闭合。 我们将在稍后的 实验练习中闭合环路。 在开环模式下,输出 A 的 上升沿和下降沿 由事件 1 和 事件 1 控制。 事件 1 和事件 2 是 两个寄存器的内容。 输出 B 的 上升沿和下降沿 由事件 3 和 事件 4 控制。 同样,这些值存储在两个 单独的寄存器中。 在此我们可以看到 DPWM 计数器 从 0 增大到事件 1。 当计数器值 等于事件 1 时,输出 DPWM A 会被置位。 当计数器值等于事件 2 时, DPWM A 会被复位。 当计数器值 等于事件 3 时, 输出 B 会被置位; 当计数器值达到 事件 4 时,输出 B 会被复位。 当计数器值等于 周期寄存器中的值时, 计数器会复位 且另一开关周期 会启动。 事件 1 存储在 寄存器 DPWMEV1 中。 因此,每个 DPWM 模块将 具有一个独特的 DPWMEV1 寄存器与其相关联。 寄存器 从 PCLK 驱动, 因此具有与 周期寄存器 相同的 4 ns 时基。 它还具有与周期寄存器 相同的校准, 因此,事件 1 字段 与 DPWMEV1 寄存器的 位 4 对齐。 在上一示例中, 通过将 2,500 置于 PRD 字段中, 我们将周期 设为 10 ms。 为将输出 A 设为在 10% 周期时处于高位, 我们将事件 1 设为 250,即将 PRD 值除以 10。 事件 2 存储在 称作 DPWMEV2 的寄存器中。 每个 DPWM 模块可作为 唯一的 DPWMEV2 寄存器。 事件 2 的分辨率 和周期比 事件 1 高 16 倍。 它具有 250 ps 的 时基。 通过提供 DPWM 模块 可取得额外的分辨率, 前提是该模块具有 16 个分别 为 250 MHz 的移相时钟信号。 我们已将周期 设为 10 ms, 并将输出 A 的 上升沿 设为在周期的 10% 时发生。 为将输出 A 在 25% 周期时复位, 我们将周期除以 4。 然后,我们将结果乘以 16 以计入 事件 2 的 比该周期精度高 16 倍的时基。 值得注意的是, 即使事件 2 比事件 1 及该周期的分辨率 高 16 倍, 事件 1 以及 周期字段均会 在其相应 寄存器中抵消, 以计入 更小的时基。 因此,您在写入 整个寄存器时, 无需考虑事件 2 更小的时基。 因此,出于明确性 和简洁性考虑, 我们不建议在写入 这些寄存器时 使用 .bit 结构。 使用 .all 结构 并将事件寄存器 设为周期百分比。 在此代码示例中,我们使用 预处理程序 #define 指令 来定义 PCLK 周期 和开关周期, 单位为秒。 然后,我们使用 这两个值计算 要置于周期寄存器中的值。 通过将周期值简单乘以 0.1、0.25、 0.5 和 0.75, 事件 1、2、3 和 4 寄存器会 设为等于周期的 10%、25%、50% 和 75%。 如果我们决定更改 开关周期, 我们只需更改 指派给 #define 周期的秒数, 然后所有 事件寄存器 将自动扩展。 事件 3 和事件 4 将 分别存储在 DPWMEV3 和 EV4 中。 他们具有与事件 2 相同的 对齐和时基, 即,它们为 18 位宽且具有 250 ps 的时基。 这是 DPWM 模块的 简化逻辑图, 涵盖迄今为止 我们已讨论的问题。 我们看了开环模式中的 DPWM 操作。 即,DPWM 输出完全 由其寄存器 而非滤波器 输出控制。 有多得多的逻辑 以及更多的寄存器 与 DPWM 操作关联,我们将这些实验中 讨论其中的部分内容。 现在,我们将事件寄存器的 输出直接传入 并经过大量 可配置的时序 逻辑。 我们将在稍后的实验中 回顾该逻辑的某些内容。 现在,对于其他 初始化, 您将需要 置于 C 代码中, 以在开环模式下 使用 DPWM 模块。 您应在初始化前 关闭 DPWM0, 具体方法是清除 DPWM 控制 寄存器 0 中的 PWM 启用位。 默认情况下, 该位实际上会被清除, 因此,严格意义上而言, 这不是必需的, 但是,尽管如此,这仍然是 好的做法。 由于我们在开环模式下 操作 DPWM 模块, 因此我们需要关闭 DPWM 的滤波器输入, 从而 DPWM 操作 完全由 其自身的寄存器控制。 我们所采取的具体方法是清除 PWM 控制 寄存器 0 中的 CLA 启用位。 CLA 是控制律加速器的 缩写词。 这只是滤波器的 另一名称。 接下来,我们需要在本地 开启 DPWM 模块, 具体方法是在 DPWM 控制 寄存器 0 中设置 PWM 启用位。 最后,我们需要在全局 开启 DPWM 模块, 具体方法是在 GLB 启用模块中 设置相关全局启用位。 每个 DPWM 具有其 自身的全局启用位。 我们在此为 DPWM 模块 0 设置位。 如果您要查找有关 该实验目前为止 所涵盖主题的 更全面的信息, 请参阅 UCD3138 数字电源外设 程序员手册。 现在,我们来看一下 C 源代码和 内存调试器 HyperKnob。 此处是 Code Composer Studio 中 实验练习二的 main.c。 要存储所有 初始化代码, 我们创建了 名为 init_dpwm0 的函数。 这主要是为了清楚直观。 如果您愿意,您也可以将 初始化代码直接 放在主程序自身的开始处。 此处,我们于初始化前 在本地禁用了 DPWM0 模块。 此处,我们禁用了 至 DPWM0 的滤波器输入, 以便为开环操作设置 DPWM0 模块。 我们在此设置 事件 1 寄存器的周期。 请注意,对于加载至 寄存器的值, 我使用符号引用。 我已在主程序顶部 使用 C #define 指令 添加了这些符号引用。 可将它们平等地置于 一个单独的头文件中。 使用符号引用 有关个人风格。 您可以平等地使用 硬编码常量。 在此,我们使用符号引用来 增加代码清晰度。 例如,清楚可见该周期为 10 ms。 请注意,事件 1 随周期扩展。 如果我们更改周期,则事件 1 将相应扩展。 对于该实验,请 添加 C 代码 以使事件 2、3 和 4 相应 在周期的 25%、50% 的 读数。 本教程稍后 将展示该解决方案。 最终,我们以本地方式和 全局方式启用了 DPWM0。 这是主程序。 此处是用于清除 校验和的后门, 以防锁定 编程闪存。 如果您要包括 该代码,请 确保连接要 相应拉动的引脚。 在本例中,您应将 FAULT3 引脚 接地,以使操作正常。 此处,我们调用函数来 初始化 PMBus 处理程序。 然后,我们调用 我们刚才添加的 函数以初始化 DPWM0。 这是具有 PMBus 处理程序 调用例程的主循环, 如实验练习一中所示。 这使我们能够 在固件运行时 通过 PMBus 与器件联系。 其他代码片段 与 HyperKnob 关联, 我将很快进行详细讨论。 当您将代码添加到 整个实验练习二时, 在 Code Composer Studio 中构建代码 并使用该器 件 GUI 下载。 这是 UCD 器件 GUI。 如前下载代码。 请勿写入 程序校验和。 如果在下载该固件时 已选定该选项, 则您刚才下载至 编程闪存的代码 将在其下载至 编程闪存后 立即开 始执行。 如未执行,请单击该链接 以开始执行该代码。 如果您将示波器 探针置于开环板的 引脚 DPWM0A 和 DPWM0B 您应看到这些波形。 传感器位于开关周期的 开头和末尾。 您可以看到 开关周期为 10 ms。 您还可以看到 输出 A 的上升沿 就位于开关周期的开头, 该上升沿与事件 1 相对应。 与事件 2 相 对应的下降沿 是在周期路线的 25 %处。 对于输出 B,您可以看到 上升沿和下降沿 分别在开关周期的 50% 和 75% 处出现。 现在,我将演示如何 设置内存调试器的 HyperKnob 功能。 我们将使用 HyperKnob 经由 PMBus 接口 即时修改 事件 2 的值。 要设置 HyperKnob, 我们首先在 C 源代码中 定义 RAM 的位置。 在此,我们定义了称作 ram_event2 的 RAM 变量。 非常重要的是, 务必在 RAM 变量定义后 添加以下注释。 内存调试器 解析 C 代码。 如果在变量定义后看到该 常见结构体, 它会在内存 调试器中 为该变量 启用 HyperKnob 功能。 我们希望 通过 HyperKnob 控制的 最小、最大以及 步进变量值 均位于注释中的 方括号内。 HyperKnob 仅适用于离散变量, 而不适用于 复杂的外设结构。 因此,我们用其 修改整型变量, 并将变量映射至 代码内部外设结构中的 某个字段 以修改该字段。 此处, 我们初始化 将与 HyperKnob 一起 使用的 RAM 变量, 方法是将该变量 设为事件 2 的值。 这是在主循环 前完成。 此处,事件 2 已设为 我们将使用 HyperKnob 控制的 RAM 变量的值。 当我们使用 HyperKnob 功能时, 我们通过 PMBus 修改了 变量 ram_event2 的值, 我稍后将 展示该功能的用法。 记住, PMBus 通信 是使用 C 代码中的 PMBus 处理程序实现的。 在我们退出 PMBus 处理程序例程时, 如果 ram_event2 因 我们使用 HyperKnob 对其进行了更改 而更改了值, 则事件 2 会在从 PMBus 处理 程序例程返回后, 在主循环中被 设为 ram_event2 的新值。 现在,我将展示 如何使用 HyperKnob。 打开内存调试器。 通过导航至含有实验练习二 映射文件的文件夹, 加载 存储器映射。 对于我们, 这会在存储 C 源文件的 文件夹中的 UCD3138 目录。 查找内存 调试器中 称作 ram_event2 的变量。 选中最右侧 Autowrite 列中的框。 选中后,您对该 变量值的变更 将自动 写入器件。 单击“Refresh”(刷新) 可通过 PMBus 接口 读取 ram_event2 的值。 单击含有 该值的单元格。 您将看到 ram_event2 等于 10,000, 这是事件 2 的初始值, 对应 10 ms 周期的 25%。 当选中单元格时, 您还会在单元格最右侧 看到向上和向下箭头。 这是 HyperKnob。 单击向上箭头键。 观察 ram_event2 的 值增长 2,500。 单击向下箭头键。 观察 ram_event2 的 值减少 2,500。 这是因为 C 代码中 在变量定义后紧跟的 备注字段 内的“step” 已设为 2,500。 当我们使用 HyperKnob 降低 ram_event2 的值时, 我们可以看到 事件 2 同时增长。 与此类似,如果我们 降低变量 ram_event2 的值。 该值反映了在 出现输出 A 的 下降沿的周期 中的时间 量。 这是因为 事件 2 已映射 至 C 代码的主循环中的 变量 ram_event2。 这里是实验练习二的解决方案。 我们为事件 2、事 件 3 和事件 4 创建了三个 符号引用, 并将这些符号引用的 值分别设置为 周期的 25%、50% 以及 75%。 此处,我们将 事件 2、3 以及 4 寄存器初始化 为其相应的值。
在本教程中, 我将介绍数字电源
外设, 尤其着重介绍
数字脉冲宽度调制, 或者说 DPWM 块。
此演示 随实验练习二一起提供。
在上一教程中,我们已简要 介绍了 ARM 内核、
闪存以及 PMBus 接口。
现在,我们将着重介绍 DPWM 模块及其两个
关联的输出引脚。
UCD3138 系列 每个成员产品的内核
是数控 环路外设,
也称作数字电源 外设,或简称 DPP。
这些器件用于 控制电源中的
高速电压和 电流环路。
它们旨在 替代基于
模拟电压管理 控制器 IC 的电源中
采用的模拟 补偿网络和
PWM 生成系统, 并向系统
添加增强的 数字功能。
在许多情况下, 在启动时,
由固件初始化后, DPP 可以完全自主控制电源,
且无任何 固件干预。
这使处理器资源 得到更为改善的监控、
通信以及 其他功能。
这里是数字 电源外设
最为简单的 配置,
突显了环路控制中 涉及的关键模块。
在前端,误差 ADC 接受以差动电压
信号作为输入。
它测量在该输入 和数字控制的
基准电压 之间的差异,
并生成 数字误差输出。
误差 ADC 或 EADC 是 专业的高速、
高分辨率 ADC, 具有专为电源误差测量
而优化的 小动态范围。
滤波器获得 误差信号
并通过可补偿 外部环路特性的
基于 PID 的 数字滤波器
传递信号。
可对该滤波器 重新动态编程
以更改电源负载、 源和环路特性。
它还提供非线性 响应能力,
以更好地 处理瞬态。
补偿器的输出会 传入数字 PWM 生成器,
也称作 DPWM 生成器。
DPWM 具有 两项可通过
许多不同方式使用的输出。
具有针对同步整流、 多相、
各种桥接拓扑 以及 LLC 配置的模式。
本系列教程 稍后将介绍
一些其他选项。
UCD3138 器件系列 支持多组
数字电源 外设,
提供控制 多达三种反馈回路,
电压或电流, 以及同时驱动
8 种输出的能力。
在实验练习二中,我们将着重介绍 数字 PWM 块。
目标是获得对开环模式下的 DPWM 操作的基本认识;
输出数字 PWM 输出引脚上的
简单波形图; 使用
内存调试器更改 波形脉冲宽度。
在较早一期教程中, 我们介绍了内存调试器。
这是 UCD3138 器件 GUI 的 工具包的一部分。
我们将使用内存调试器的 HyperKnob 功能来调整
波形脉冲宽度。
在 DPWM 模块中央
是 DPWM 周期寄存器 和 DPWM 计数器。
两个寄存器均为 14 位宽。
DPWM 计数器 数值递增,直至
其等于周期 寄存器中的值。
当出现此情况时, DPWM 计数器
会复位并再次启动。
DPWM 计数器 可从 PCLK 计时,
PCLK 以 250 MHz 运行。
因此,DPWM 计数器数值 每 4 ns 按一定增量递增。
在开关式 电源控制上下文中,
周期值表示 一个开关周期。
现在,我将演示 如何设置周期。
四个 DPWM 模块中, 每个模块均有称作 DPWM PRD 的
周期寄存器。
该寄存器中的相关字段 称作 PRD。
它存在于位 17 至位 4, 含位 17 以及位 4。
寄存器中保留了 四个最低有效位,
因此,不应使用 除 0 以外的任何值
覆盖。
现在,我将演示 如何将 DPWM 模块的周期
设置为 0 至 10 ms。
要获取 14 位值 以置于 PRD 字段,
应将周期除以时基, 两者均以秒为单位,
并将结果 取整为最近的整数。
在我们的例子中,周期 是 10 ms,
并且时基是 4 ns,
所以结果是 2,500。
要将该值直接至于 DPWM PRD 寄存器中,
我们需要计入 周期字段的位 0 与
寄存器的 位 4 对齐这一事实。
因此,我们 需要将结果
左移 4 位,这相当于 乘以 16,即
2 的 4 次方。
在 C 代码中 语句将是这样的。
这些寄存器本身 及其内部的字段
在 C 代码中 将以结构体的形式组织。
第一条语句 将寄存器中的所有位
设置为 常量值,
以获得 10 ms 的 开关周期。
第二条语句仅 设置寄存器内
PRD 字段中的位。
它计入寄存器内部 PRD 字段的对齐,
且不修改 任何其他位。
第一条语句 灵活度较低,但是
在处理生成的 ARM 汇编 代码方面更高效。
它仅是单 注册器写入。
第二条语句将 产生更多的汇编码,
因为其涉及将寄存器的 内容复制到
ARM 内核,使用 逻辑操作
修改与 PRD 字段关联的位, 然后将修改的值
写回寄存器。
因此,与第一个操作相比,第二个操作 将占用更多字节
和耗费更多 处理器时钟周期。
但是,第二条 C 语言更易支持,
因为您无需 担心寄存器中
其他字段的 内容。
好的做法是, 在开发过程中使用 .bit 结构,
然后,当需要 更高效的代码时,
将其改为 .all 结构。
现在,我将演示 如何
在开环模式下控制 DPWM 的 A 和 B 两项输出。
开环模式意味着 DPWM 完全由其
自身的寄存器控制, 而非滤波器输出控制。
换句话说,电源 控制环路未闭合。
我们将在稍后的 实验练习中闭合环路。
在开环模式下,输出 A 的 上升沿和下降沿
由事件 1 和 事件 1 控制。
事件 1 和事件 2 是 两个寄存器的内容。
输出 B 的 上升沿和下降沿
由事件 3 和 事件 4 控制。
同样,这些值存储在两个 单独的寄存器中。
在此我们可以看到 DPWM 计数器 从 0 增大到事件 1。
当计数器值 等于事件 1 时,输出
DPWM A 会被置位。
当计数器值等于事件 2 时, DPWM A 会被复位。
当计数器值 等于事件 3 时,
输出 B 会被置位; 当计数器值达到
事件 4 时,输出 B 会被复位。
当计数器值等于 周期寄存器中的值时,
计数器会复位 且另一开关周期
会启动。
事件 1 存储在 寄存器 DPWMEV1 中。
因此,每个 DPWM 模块将 具有一个独特的 DPWMEV1
寄存器与其相关联。
寄存器 从 PCLK 驱动,
因此具有与 周期寄存器
相同的 4 ns 时基。
它还具有与周期寄存器 相同的校准,
因此,事件 1 字段 与 DPWMEV1 寄存器的
位 4 对齐。
在上一示例中, 通过将 2,500 置于 PRD 字段中,
我们将周期 设为 10 ms。
为将输出 A 设为在 10% 周期时处于高位,
我们将事件 1 设为 250,即将 PRD 值除以 10。
事件 2 存储在 称作 DPWMEV2 的寄存器中。
每个 DPWM 模块可作为 唯一的 DPWMEV2 寄存器。
事件 2 的分辨率 和周期比
事件 1 高 16 倍。
它具有 250 ps 的 时基。
通过提供 DPWM 模块 可取得额外的分辨率,
前提是该模块具有 16 个分别 为 250 MHz 的移相时钟信号。
我们已将周期 设为 10 ms,
并将输出 A 的 上升沿
设为在周期的 10% 时发生。
为将输出 A 在 25% 周期时复位,
我们将周期除以 4。
然后,我们将结果乘以 16 以计入
事件 2 的 比该周期精度高 16 倍的时基。
值得注意的是, 即使事件 2 比事件 1
及该周期的分辨率 高 16 倍,
事件 1 以及 周期字段均会
在其相应 寄存器中抵消,
以计入 更小的时基。
因此,您在写入 整个寄存器时,
无需考虑事件 2 更小的时基。
因此,出于明确性 和简洁性考虑,
我们不建议在写入 这些寄存器时
使用 .bit 结构。
使用 .all 结构 并将事件寄存器
设为周期百分比。
在此代码示例中,我们使用 预处理程序 #define 指令
来定义 PCLK 周期 和开关周期,
单位为秒。
然后,我们使用 这两个值计算
要置于周期寄存器中的值。
通过将周期值简单乘以 0.1、0.25、
0.5 和 0.75, 事件 1、2、3 和 4
寄存器会 设为等于周期的
10%、25%、50% 和 75%。
如果我们决定更改 开关周期,
我们只需更改 指派给 #define 周期的秒数,
然后所有 事件寄存器
将自动扩展。
事件 3 和事件 4 将 分别存储在 DPWMEV3
和 EV4 中。
他们具有与事件 2 相同的 对齐和时基,
即,它们为 18 位宽且具有
250 ps 的时基。
这是 DPWM 模块的 简化逻辑图,
涵盖迄今为止 我们已讨论的问题。
我们看了开环模式中的 DPWM 操作。
即,DPWM 输出完全 由其寄存器
而非滤波器 输出控制。
有多得多的逻辑 以及更多的寄存器
与 DPWM 操作关联,我们将这些实验中
讨论其中的部分内容。
现在,我们将事件寄存器的 输出直接传入
并经过大量 可配置的时序
逻辑。
我们将在稍后的实验中 回顾该逻辑的某些内容。
现在,对于其他 初始化,
您将需要 置于 C 代码中,
以在开环模式下 使用 DPWM 模块。
您应在初始化前 关闭 DPWM0,
具体方法是清除 DPWM 控制 寄存器 0 中的 PWM 启用位。
默认情况下, 该位实际上会被清除,
因此,严格意义上而言, 这不是必需的,
但是,尽管如此,这仍然是 好的做法。
由于我们在开环模式下 操作 DPWM 模块,
因此我们需要关闭 DPWM 的滤波器输入,
从而 DPWM 操作 完全由
其自身的寄存器控制。
我们所采取的具体方法是清除 PWM 控制 寄存器 0 中的 CLA
启用位。
CLA 是控制律加速器的 缩写词。
这只是滤波器的 另一名称。
接下来,我们需要在本地 开启 DPWM 模块,
具体方法是在 DPWM 控制 寄存器 0 中设置 PWM
启用位。
最后,我们需要在全局 开启 DPWM 模块,
具体方法是在 GLB 启用模块中
设置相关全局启用位。
每个 DPWM 具有其 自身的全局启用位。
我们在此为 DPWM 模块 0 设置位。
如果您要查找有关 该实验目前为止
所涵盖主题的 更全面的信息,
请参阅 UCD3138 数字电源外设
程序员手册。
现在,我们来看一下 C 源代码和 内存调试器
HyperKnob。
此处是 Code Composer Studio 中 实验练习二的 main.c。
要存储所有 初始化代码,
我们创建了 名为 init_dpwm0 的函数。
这主要是为了清楚直观。
如果您愿意,您也可以将 初始化代码直接
放在主程序自身的开始处。
此处,我们于初始化前 在本地禁用了
DPWM0 模块。
此处,我们禁用了 至 DPWM0 的滤波器输入,
以便为开环操作设置 DPWM0 模块。
我们在此设置 事件 1 寄存器的周期。
请注意,对于加载至 寄存器的值,
我使用符号引用。
我已在主程序顶部 使用 C #define 指令
添加了这些符号引用。
可将它们平等地置于 一个单独的头文件中。
使用符号引用 有关个人风格。
您可以平等地使用 硬编码常量。
在此,我们使用符号引用来 增加代码清晰度。
例如,清楚可见该周期为 10 ms。
请注意,事件 1 随周期扩展。
如果我们更改周期,则事件 1 将相应扩展。
对于该实验,请 添加 C 代码
以使事件 2、3 和 4 相应 在周期的 25%、50% 的
读数。
本教程稍后 将展示该解决方案。
最终,我们以本地方式和 全局方式启用了 DPWM0。
这是主程序。
此处是用于清除 校验和的后门,
以防锁定 编程闪存。
如果您要包括 该代码,请
确保连接要 相应拉动的引脚。
在本例中,您应将 FAULT3 引脚
接地,以使操作正常。
此处,我们调用函数来 初始化 PMBus 处理程序。
然后,我们调用 我们刚才添加的
函数以初始化 DPWM0。
这是具有 PMBus 处理程序 调用例程的主循环,
如实验练习一中所示。
这使我们能够 在固件运行时
通过 PMBus 与器件联系。
其他代码片段 与 HyperKnob
关联, 我将很快进行详细讨论。
当您将代码添加到 整个实验练习二时,
在 Code Composer Studio 中构建代码
并使用该器 件 GUI 下载。
这是 UCD 器件 GUI。
如前下载代码。
请勿写入 程序校验和。
如果在下载该固件时 已选定该选项,
则您刚才下载至 编程闪存的代码
将在其下载至 编程闪存后
立即开 始执行。
如未执行,请单击该链接 以开始执行该代码。
如果您将示波器 探针置于开环板的
引脚 DPWM0A 和 DPWM0B
您应看到这些波形。
传感器位于开关周期的 开头和末尾。
您可以看到 开关周期为 10 ms。
您还可以看到 输出 A 的上升沿
就位于开关周期的开头, 该上升沿与事件 1
相对应。
与事件 2 相 对应的下降沿
是在周期路线的 25 %处。
对于输出 B,您可以看到 上升沿和下降沿
分别在开关周期的 50% 和 75% 处出现。
现在,我将演示如何 设置内存调试器的
HyperKnob 功能。
我们将使用 HyperKnob 经由 PMBus 接口
即时修改 事件 2 的值。
要设置 HyperKnob, 我们首先在 C 源代码中
定义 RAM 的位置。
在此,我们定义了称作 ram_event2 的 RAM 变量。
非常重要的是, 务必在 RAM 变量定义后
添加以下注释。
内存调试器 解析 C 代码。
如果在变量定义后看到该 常见结构体,
它会在内存 调试器中
为该变量 启用 HyperKnob 功能。
我们希望 通过 HyperKnob 控制的
最小、最大以及 步进变量值
均位于注释中的 方括号内。
HyperKnob 仅适用于离散变量, 而不适用于
复杂的外设结构。
因此,我们用其 修改整型变量,
并将变量映射至 代码内部外设结构中的
某个字段 以修改该字段。
此处, 我们初始化
将与 HyperKnob 一起 使用的 RAM 变量,
方法是将该变量 设为事件 2 的值。
这是在主循环 前完成。
此处,事件 2 已设为
我们将使用 HyperKnob 控制的 RAM 变量的值。
当我们使用 HyperKnob 功能时,
我们通过 PMBus 修改了 变量 ram_event2 的值,
我稍后将 展示该功能的用法。
记住, PMBus 通信
是使用 C 代码中的 PMBus 处理程序实现的。
在我们退出 PMBus 处理程序例程时,
如果 ram_event2 因 我们使用 HyperKnob 对其进行了更改
而更改了值, 则事件 2
会在从 PMBus 处理 程序例程返回后,
在主循环中被 设为 ram_event2 的新值。
现在,我将展示 如何使用 HyperKnob。
打开内存调试器。
通过导航至含有实验练习二 映射文件的文件夹,
加载 存储器映射。
对于我们, 这会在存储 C 源文件的
文件夹中的 UCD3138 目录。
查找内存 调试器中
称作 ram_event2 的变量。
选中最右侧 Autowrite 列中的框。
选中后,您对该 变量值的变更
将自动 写入器件。
单击“Refresh”(刷新) 可通过 PMBus 接口
读取 ram_event2 的值。
单击含有 该值的单元格。
您将看到 ram_event2 等于 10,000,
这是事件 2 的初始值, 对应 10 ms 周期的
25%。
当选中单元格时, 您还会在单元格最右侧
看到向上和向下箭头。
这是 HyperKnob。
单击向上箭头键。
观察 ram_event2 的 值增长 2,500。
单击向下箭头键。
观察 ram_event2 的 值减少 2,500。
这是因为 C 代码中 在变量定义后紧跟的
备注字段 内的“step”
已设为 2,500。
当我们使用 HyperKnob 降低 ram_event2 的值时,
我们可以看到 事件 2
同时增长。
与此类似,如果我们 降低变量
ram_event2 的值。
该值反映了在 出现输出 A 的
下降沿的周期 中的时间
量。
这是因为 事件 2 已映射
至 C 代码的主循环中的 变量 ram_event2。
这里是实验练习二的解决方案。
我们为事件 2、事 件 3 和事件 4
创建了三个 符号引用,
并将这些符号引用的 值分别设置为
周期的 25%、50% 以及 75%。
此处,我们将 事件 2、3 以及 4
寄存器初始化 为其相应的值。
在本教程中, 我将介绍数字电源 外设, 尤其着重介绍 数字脉冲宽度调制, 或者说 DPWM 块。 此演示 随实验练习二一起提供。 在上一教程中,我们已简要 介绍了 ARM 内核、 闪存以及 PMBus 接口。 现在,我们将着重介绍 DPWM 模块及其两个 关联的输出引脚。 UCD3138 系列 每个成员产品的内核 是数控 环路外设, 也称作数字电源 外设,或简称 DPP。 这些器件用于 控制电源中的 高速电压和 电流环路。 它们旨在 替代基于 模拟电压管理 控制器 IC 的电源中 采用的模拟 补偿网络和 PWM 生成系统, 并向系统 添加增强的 数字功能。 在许多情况下, 在启动时, 由固件初始化后, DPP 可以完全自主控制电源, 且无任何 固件干预。 这使处理器资源 得到更为改善的监控、 通信以及 其他功能。 这里是数字 电源外设 最为简单的 配置, 突显了环路控制中 涉及的关键模块。 在前端,误差 ADC 接受以差动电压 信号作为输入。 它测量在该输入 和数字控制的 基准电压 之间的差异, 并生成 数字误差输出。 误差 ADC 或 EADC 是 专业的高速、 高分辨率 ADC, 具有专为电源误差测量 而优化的 小动态范围。 滤波器获得 误差信号 并通过可补偿 外部环路特性的 基于 PID 的 数字滤波器 传递信号。 可对该滤波器 重新动态编程 以更改电源负载、 源和环路特性。 它还提供非线性 响应能力, 以更好地 处理瞬态。 补偿器的输出会 传入数字 PWM 生成器, 也称作 DPWM 生成器。 DPWM 具有 两项可通过 许多不同方式使用的输出。 具有针对同步整流、 多相、 各种桥接拓扑 以及 LLC 配置的模式。 本系列教程 稍后将介绍 一些其他选项。 UCD3138 器件系列 支持多组 数字电源 外设, 提供控制 多达三种反馈回路, 电压或电流, 以及同时驱动 8 种输出的能力。 在实验练习二中,我们将着重介绍 数字 PWM 块。 目标是获得对开环模式下的 DPWM 操作的基本认识; 输出数字 PWM 输出引脚上的 简单波形图; 使用 内存调试器更改 波形脉冲宽度。 在较早一期教程中, 我们介绍了内存调试器。 这是 UCD3138 器件 GUI 的 工具包的一部分。 我们将使用内存调试器的 HyperKnob 功能来调整 波形脉冲宽度。 在 DPWM 模块中央 是 DPWM 周期寄存器 和 DPWM 计数器。 两个寄存器均为 14 位宽。 DPWM 计数器 数值递增,直至 其等于周期 寄存器中的值。 当出现此情况时, DPWM 计数器 会复位并再次启动。 DPWM 计数器 可从 PCLK 计时, PCLK 以 250 MHz 运行。 因此,DPWM 计数器数值 每 4 ns 按一定增量递增。 在开关式 电源控制上下文中, 周期值表示 一个开关周期。 现在,我将演示 如何设置周期。 四个 DPWM 模块中, 每个模块均有称作 DPWM PRD 的 周期寄存器。 该寄存器中的相关字段 称作 PRD。 它存在于位 17 至位 4, 含位 17 以及位 4。 寄存器中保留了 四个最低有效位, 因此,不应使用 除 0 以外的任何值 覆盖。 现在,我将演示 如何将 DPWM 模块的周期 设置为 0 至 10 ms。 要获取 14 位值 以置于 PRD 字段, 应将周期除以时基, 两者均以秒为单位, 并将结果 取整为最近的整数。 在我们的例子中,周期 是 10 ms, 并且时基是 4 ns, 所以结果是 2,500。 要将该值直接至于 DPWM PRD 寄存器中, 我们需要计入 周期字段的位 0 与 寄存器的 位 4 对齐这一事实。 因此,我们 需要将结果 左移 4 位,这相当于 乘以 16,即 2 的 4 次方。 在 C 代码中 语句将是这样的。 这些寄存器本身 及其内部的字段 在 C 代码中 将以结构体的形式组织。 第一条语句 将寄存器中的所有位 设置为 常量值, 以获得 10 ms 的 开关周期。 第二条语句仅 设置寄存器内 PRD 字段中的位。 它计入寄存器内部 PRD 字段的对齐, 且不修改 任何其他位。 第一条语句 灵活度较低,但是 在处理生成的 ARM 汇编 代码方面更高效。 它仅是单 注册器写入。 第二条语句将 产生更多的汇编码, 因为其涉及将寄存器的 内容复制到 ARM 内核,使用 逻辑操作 修改与 PRD 字段关联的位, 然后将修改的值 写回寄存器。 因此,与第一个操作相比,第二个操作 将占用更多字节 和耗费更多 处理器时钟周期。 但是,第二条 C 语言更易支持, 因为您无需 担心寄存器中 其他字段的 内容。 好的做法是, 在开发过程中使用 .bit 结构, 然后,当需要 更高效的代码时, 将其改为 .all 结构。 现在,我将演示 如何 在开环模式下控制 DPWM 的 A 和 B 两项输出。 开环模式意味着 DPWM 完全由其 自身的寄存器控制, 而非滤波器输出控制。 换句话说,电源 控制环路未闭合。 我们将在稍后的 实验练习中闭合环路。 在开环模式下,输出 A 的 上升沿和下降沿 由事件 1 和 事件 1 控制。 事件 1 和事件 2 是 两个寄存器的内容。 输出 B 的 上升沿和下降沿 由事件 3 和 事件 4 控制。 同样,这些值存储在两个 单独的寄存器中。 在此我们可以看到 DPWM 计数器 从 0 增大到事件 1。 当计数器值 等于事件 1 时,输出 DPWM A 会被置位。 当计数器值等于事件 2 时, DPWM A 会被复位。 当计数器值 等于事件 3 时, 输出 B 会被置位; 当计数器值达到 事件 4 时,输出 B 会被复位。 当计数器值等于 周期寄存器中的值时, 计数器会复位 且另一开关周期 会启动。 事件 1 存储在 寄存器 DPWMEV1 中。 因此,每个 DPWM 模块将 具有一个独特的 DPWMEV1 寄存器与其相关联。 寄存器 从 PCLK 驱动, 因此具有与 周期寄存器 相同的 4 ns 时基。 它还具有与周期寄存器 相同的校准, 因此,事件 1 字段 与 DPWMEV1 寄存器的 位 4 对齐。 在上一示例中, 通过将 2,500 置于 PRD 字段中, 我们将周期 设为 10 ms。 为将输出 A 设为在 10% 周期时处于高位, 我们将事件 1 设为 250,即将 PRD 值除以 10。 事件 2 存储在 称作 DPWMEV2 的寄存器中。 每个 DPWM 模块可作为 唯一的 DPWMEV2 寄存器。 事件 2 的分辨率 和周期比 事件 1 高 16 倍。 它具有 250 ps 的 时基。 通过提供 DPWM 模块 可取得额外的分辨率, 前提是该模块具有 16 个分别 为 250 MHz 的移相时钟信号。 我们已将周期 设为 10 ms, 并将输出 A 的 上升沿 设为在周期的 10% 时发生。 为将输出 A 在 25% 周期时复位, 我们将周期除以 4。 然后,我们将结果乘以 16 以计入 事件 2 的 比该周期精度高 16 倍的时基。 值得注意的是, 即使事件 2 比事件 1 及该周期的分辨率 高 16 倍, 事件 1 以及 周期字段均会 在其相应 寄存器中抵消, 以计入 更小的时基。 因此,您在写入 整个寄存器时, 无需考虑事件 2 更小的时基。 因此,出于明确性 和简洁性考虑, 我们不建议在写入 这些寄存器时 使用 .bit 结构。 使用 .all 结构 并将事件寄存器 设为周期百分比。 在此代码示例中,我们使用 预处理程序 #define 指令 来定义 PCLK 周期 和开关周期, 单位为秒。 然后,我们使用 这两个值计算 要置于周期寄存器中的值。 通过将周期值简单乘以 0.1、0.25、 0.5 和 0.75, 事件 1、2、3 和 4 寄存器会 设为等于周期的 10%、25%、50% 和 75%。 如果我们决定更改 开关周期, 我们只需更改 指派给 #define 周期的秒数, 然后所有 事件寄存器 将自动扩展。 事件 3 和事件 4 将 分别存储在 DPWMEV3 和 EV4 中。 他们具有与事件 2 相同的 对齐和时基, 即,它们为 18 位宽且具有 250 ps 的时基。 这是 DPWM 模块的 简化逻辑图, 涵盖迄今为止 我们已讨论的问题。 我们看了开环模式中的 DPWM 操作。 即,DPWM 输出完全 由其寄存器 而非滤波器 输出控制。 有多得多的逻辑 以及更多的寄存器 与 DPWM 操作关联,我们将这些实验中 讨论其中的部分内容。 现在,我们将事件寄存器的 输出直接传入 并经过大量 可配置的时序 逻辑。 我们将在稍后的实验中 回顾该逻辑的某些内容。 现在,对于其他 初始化, 您将需要 置于 C 代码中, 以在开环模式下 使用 DPWM 模块。 您应在初始化前 关闭 DPWM0, 具体方法是清除 DPWM 控制 寄存器 0 中的 PWM 启用位。 默认情况下, 该位实际上会被清除, 因此,严格意义上而言, 这不是必需的, 但是,尽管如此,这仍然是 好的做法。 由于我们在开环模式下 操作 DPWM 模块, 因此我们需要关闭 DPWM 的滤波器输入, 从而 DPWM 操作 完全由 其自身的寄存器控制。 我们所采取的具体方法是清除 PWM 控制 寄存器 0 中的 CLA 启用位。 CLA 是控制律加速器的 缩写词。 这只是滤波器的 另一名称。 接下来,我们需要在本地 开启 DPWM 模块, 具体方法是在 DPWM 控制 寄存器 0 中设置 PWM 启用位。 最后,我们需要在全局 开启 DPWM 模块, 具体方法是在 GLB 启用模块中 设置相关全局启用位。 每个 DPWM 具有其 自身的全局启用位。 我们在此为 DPWM 模块 0 设置位。 如果您要查找有关 该实验目前为止 所涵盖主题的 更全面的信息, 请参阅 UCD3138 数字电源外设 程序员手册。 现在,我们来看一下 C 源代码和 内存调试器 HyperKnob。 此处是 Code Composer Studio 中 实验练习二的 main.c。 要存储所有 初始化代码, 我们创建了 名为 init_dpwm0 的函数。 这主要是为了清楚直观。 如果您愿意,您也可以将 初始化代码直接 放在主程序自身的开始处。 此处,我们于初始化前 在本地禁用了 DPWM0 模块。 此处,我们禁用了 至 DPWM0 的滤波器输入, 以便为开环操作设置 DPWM0 模块。 我们在此设置 事件 1 寄存器的周期。 请注意,对于加载至 寄存器的值, 我使用符号引用。 我已在主程序顶部 使用 C #define 指令 添加了这些符号引用。 可将它们平等地置于 一个单独的头文件中。 使用符号引用 有关个人风格。 您可以平等地使用 硬编码常量。 在此,我们使用符号引用来 增加代码清晰度。 例如,清楚可见该周期为 10 ms。 请注意,事件 1 随周期扩展。 如果我们更改周期,则事件 1 将相应扩展。 对于该实验,请 添加 C 代码 以使事件 2、3 和 4 相应 在周期的 25%、50% 的 读数。 本教程稍后 将展示该解决方案。 最终,我们以本地方式和 全局方式启用了 DPWM0。 这是主程序。 此处是用于清除 校验和的后门, 以防锁定 编程闪存。 如果您要包括 该代码,请 确保连接要 相应拉动的引脚。 在本例中,您应将 FAULT3 引脚 接地,以使操作正常。 此处,我们调用函数来 初始化 PMBus 处理程序。 然后,我们调用 我们刚才添加的 函数以初始化 DPWM0。 这是具有 PMBus 处理程序 调用例程的主循环, 如实验练习一中所示。 这使我们能够 在固件运行时 通过 PMBus 与器件联系。 其他代码片段 与 HyperKnob 关联, 我将很快进行详细讨论。 当您将代码添加到 整个实验练习二时, 在 Code Composer Studio 中构建代码 并使用该器 件 GUI 下载。 这是 UCD 器件 GUI。 如前下载代码。 请勿写入 程序校验和。 如果在下载该固件时 已选定该选项, 则您刚才下载至 编程闪存的代码 将在其下载至 编程闪存后 立即开 始执行。 如未执行,请单击该链接 以开始执行该代码。 如果您将示波器 探针置于开环板的 引脚 DPWM0A 和 DPWM0B 您应看到这些波形。 传感器位于开关周期的 开头和末尾。 您可以看到 开关周期为 10 ms。 您还可以看到 输出 A 的上升沿 就位于开关周期的开头, 该上升沿与事件 1 相对应。 与事件 2 相 对应的下降沿 是在周期路线的 25 %处。 对于输出 B,您可以看到 上升沿和下降沿 分别在开关周期的 50% 和 75% 处出现。 现在,我将演示如何 设置内存调试器的 HyperKnob 功能。 我们将使用 HyperKnob 经由 PMBus 接口 即时修改 事件 2 的值。 要设置 HyperKnob, 我们首先在 C 源代码中 定义 RAM 的位置。 在此,我们定义了称作 ram_event2 的 RAM 变量。 非常重要的是, 务必在 RAM 变量定义后 添加以下注释。 内存调试器 解析 C 代码。 如果在变量定义后看到该 常见结构体, 它会在内存 调试器中 为该变量 启用 HyperKnob 功能。 我们希望 通过 HyperKnob 控制的 最小、最大以及 步进变量值 均位于注释中的 方括号内。 HyperKnob 仅适用于离散变量, 而不适用于 复杂的外设结构。 因此,我们用其 修改整型变量, 并将变量映射至 代码内部外设结构中的 某个字段 以修改该字段。 此处, 我们初始化 将与 HyperKnob 一起 使用的 RAM 变量, 方法是将该变量 设为事件 2 的值。 这是在主循环 前完成。 此处,事件 2 已设为 我们将使用 HyperKnob 控制的 RAM 变量的值。 当我们使用 HyperKnob 功能时, 我们通过 PMBus 修改了 变量 ram_event2 的值, 我稍后将 展示该功能的用法。 记住, PMBus 通信 是使用 C 代码中的 PMBus 处理程序实现的。 在我们退出 PMBus 处理程序例程时, 如果 ram_event2 因 我们使用 HyperKnob 对其进行了更改 而更改了值, 则事件 2 会在从 PMBus 处理 程序例程返回后, 在主循环中被 设为 ram_event2 的新值。 现在,我将展示 如何使用 HyperKnob。 打开内存调试器。 通过导航至含有实验练习二 映射文件的文件夹, 加载 存储器映射。 对于我们, 这会在存储 C 源文件的 文件夹中的 UCD3138 目录。 查找内存 调试器中 称作 ram_event2 的变量。 选中最右侧 Autowrite 列中的框。 选中后,您对该 变量值的变更 将自动 写入器件。 单击“Refresh”(刷新) 可通过 PMBus 接口 读取 ram_event2 的值。 单击含有 该值的单元格。 您将看到 ram_event2 等于 10,000, 这是事件 2 的初始值, 对应 10 ms 周期的 25%。 当选中单元格时, 您还会在单元格最右侧 看到向上和向下箭头。 这是 HyperKnob。 单击向上箭头键。 观察 ram_event2 的 值增长 2,500。 单击向下箭头键。 观察 ram_event2 的 值减少 2,500。 这是因为 C 代码中 在变量定义后紧跟的 备注字段 内的“step” 已设为 2,500。 当我们使用 HyperKnob 降低 ram_event2 的值时, 我们可以看到 事件 2 同时增长。 与此类似,如果我们 降低变量 ram_event2 的值。 该值反映了在 出现输出 A 的 下降沿的周期 中的时间 量。 这是因为 事件 2 已映射 至 C 代码的主循环中的 变量 ram_event2。 这里是实验练习二的解决方案。 我们为事件 2、事 件 3 和事件 4 创建了三个 符号引用, 并将这些符号引用的 值分别设置为 周期的 25%、50% 以及 75%。 此处,我们将 事件 2、3 以及 4 寄存器初始化 为其相应的值。
在本教程中, 我将介绍数字电源
外设, 尤其着重介绍
数字脉冲宽度调制, 或者说 DPWM 块。
此演示 随实验练习二一起提供。
在上一教程中,我们已简要 介绍了 ARM 内核、
闪存以及 PMBus 接口。
现在,我们将着重介绍 DPWM 模块及其两个
关联的输出引脚。
UCD3138 系列 每个成员产品的内核
是数控 环路外设,
也称作数字电源 外设,或简称 DPP。
这些器件用于 控制电源中的
高速电压和 电流环路。
它们旨在 替代基于
模拟电压管理 控制器 IC 的电源中
采用的模拟 补偿网络和
PWM 生成系统, 并向系统
添加增强的 数字功能。
在许多情况下, 在启动时,
由固件初始化后, DPP 可以完全自主控制电源,
且无任何 固件干预。
这使处理器资源 得到更为改善的监控、
通信以及 其他功能。
这里是数字 电源外设
最为简单的 配置,
突显了环路控制中 涉及的关键模块。
在前端,误差 ADC 接受以差动电压
信号作为输入。
它测量在该输入 和数字控制的
基准电压 之间的差异,
并生成 数字误差输出。
误差 ADC 或 EADC 是 专业的高速、
高分辨率 ADC, 具有专为电源误差测量
而优化的 小动态范围。
滤波器获得 误差信号
并通过可补偿 外部环路特性的
基于 PID 的 数字滤波器
传递信号。
可对该滤波器 重新动态编程
以更改电源负载、 源和环路特性。
它还提供非线性 响应能力,
以更好地 处理瞬态。
补偿器的输出会 传入数字 PWM 生成器,
也称作 DPWM 生成器。
DPWM 具有 两项可通过
许多不同方式使用的输出。
具有针对同步整流、 多相、
各种桥接拓扑 以及 LLC 配置的模式。
本系列教程 稍后将介绍
一些其他选项。
UCD3138 器件系列 支持多组
数字电源 外设,
提供控制 多达三种反馈回路,
电压或电流, 以及同时驱动
8 种输出的能力。
在实验练习二中,我们将着重介绍 数字 PWM 块。
目标是获得对开环模式下的 DPWM 操作的基本认识;
输出数字 PWM 输出引脚上的
简单波形图; 使用
内存调试器更改 波形脉冲宽度。
在较早一期教程中, 我们介绍了内存调试器。
这是 UCD3138 器件 GUI 的 工具包的一部分。
我们将使用内存调试器的 HyperKnob 功能来调整
波形脉冲宽度。
在 DPWM 模块中央
是 DPWM 周期寄存器 和 DPWM 计数器。
两个寄存器均为 14 位宽。
DPWM 计数器 数值递增,直至
其等于周期 寄存器中的值。
当出现此情况时, DPWM 计数器
会复位并再次启动。
DPWM 计数器 可从 PCLK 计时,
PCLK 以 250 MHz 运行。
因此,DPWM 计数器数值 每 4 ns 按一定增量递增。
在开关式 电源控制上下文中,
周期值表示 一个开关周期。
现在,我将演示 如何设置周期。
四个 DPWM 模块中, 每个模块均有称作 DPWM PRD 的
周期寄存器。
该寄存器中的相关字段 称作 PRD。
它存在于位 17 至位 4, 含位 17 以及位 4。
寄存器中保留了 四个最低有效位,
因此,不应使用 除 0 以外的任何值
覆盖。
现在,我将演示 如何将 DPWM 模块的周期
设置为 0 至 10 ms。
要获取 14 位值 以置于 PRD 字段,
应将周期除以时基, 两者均以秒为单位,
并将结果 取整为最近的整数。
在我们的例子中,周期 是 10 ms,
并且时基是 4 ns,
所以结果是 2,500。
要将该值直接至于 DPWM PRD 寄存器中,
我们需要计入 周期字段的位 0 与
寄存器的 位 4 对齐这一事实。
因此,我们 需要将结果
左移 4 位,这相当于 乘以 16,即
2 的 4 次方。
在 C 代码中 语句将是这样的。
这些寄存器本身 及其内部的字段
在 C 代码中 将以结构体的形式组织。
第一条语句 将寄存器中的所有位
设置为 常量值,
以获得 10 ms 的 开关周期。
第二条语句仅 设置寄存器内
PRD 字段中的位。
它计入寄存器内部 PRD 字段的对齐,
且不修改 任何其他位。
第一条语句 灵活度较低,但是
在处理生成的 ARM 汇编 代码方面更高效。
它仅是单 注册器写入。
第二条语句将 产生更多的汇编码,
因为其涉及将寄存器的 内容复制到
ARM 内核,使用 逻辑操作
修改与 PRD 字段关联的位, 然后将修改的值
写回寄存器。
因此,与第一个操作相比,第二个操作 将占用更多字节
和耗费更多 处理器时钟周期。
但是,第二条 C 语言更易支持,
因为您无需 担心寄存器中
其他字段的 内容。
好的做法是, 在开发过程中使用 .bit 结构,
然后,当需要 更高效的代码时,
将其改为 .all 结构。
现在,我将演示 如何
在开环模式下控制 DPWM 的 A 和 B 两项输出。
开环模式意味着 DPWM 完全由其
自身的寄存器控制, 而非滤波器输出控制。
换句话说,电源 控制环路未闭合。
我们将在稍后的 实验练习中闭合环路。
在开环模式下,输出 A 的 上升沿和下降沿
由事件 1 和 事件 1 控制。
事件 1 和事件 2 是 两个寄存器的内容。
输出 B 的 上升沿和下降沿
由事件 3 和 事件 4 控制。
同样,这些值存储在两个 单独的寄存器中。
在此我们可以看到 DPWM 计数器 从 0 增大到事件 1。
当计数器值 等于事件 1 时,输出
DPWM A 会被置位。
当计数器值等于事件 2 时, DPWM A 会被复位。
当计数器值 等于事件 3 时,
输出 B 会被置位; 当计数器值达到
事件 4 时,输出 B 会被复位。
当计数器值等于 周期寄存器中的值时,
计数器会复位 且另一开关周期
会启动。
事件 1 存储在 寄存器 DPWMEV1 中。
因此,每个 DPWM 模块将 具有一个独特的 DPWMEV1
寄存器与其相关联。
寄存器 从 PCLK 驱动,
因此具有与 周期寄存器
相同的 4 ns 时基。
它还具有与周期寄存器 相同的校准,
因此,事件 1 字段 与 DPWMEV1 寄存器的
位 4 对齐。
在上一示例中, 通过将 2,500 置于 PRD 字段中,
我们将周期 设为 10 ms。
为将输出 A 设为在 10% 周期时处于高位,
我们将事件 1 设为 250,即将 PRD 值除以 10。
事件 2 存储在 称作 DPWMEV2 的寄存器中。
每个 DPWM 模块可作为 唯一的 DPWMEV2 寄存器。
事件 2 的分辨率 和周期比
事件 1 高 16 倍。
它具有 250 ps 的 时基。
通过提供 DPWM 模块 可取得额外的分辨率,
前提是该模块具有 16 个分别 为 250 MHz 的移相时钟信号。
我们已将周期 设为 10 ms,
并将输出 A 的 上升沿
设为在周期的 10% 时发生。
为将输出 A 在 25% 周期时复位,
我们将周期除以 4。
然后,我们将结果乘以 16 以计入
事件 2 的 比该周期精度高 16 倍的时基。
值得注意的是, 即使事件 2 比事件 1
及该周期的分辨率 高 16 倍,
事件 1 以及 周期字段均会
在其相应 寄存器中抵消,
以计入 更小的时基。
因此,您在写入 整个寄存器时,
无需考虑事件 2 更小的时基。
因此,出于明确性 和简洁性考虑,
我们不建议在写入 这些寄存器时
使用 .bit 结构。
使用 .all 结构 并将事件寄存器
设为周期百分比。
在此代码示例中,我们使用 预处理程序 #define 指令
来定义 PCLK 周期 和开关周期,
单位为秒。
然后,我们使用 这两个值计算
要置于周期寄存器中的值。
通过将周期值简单乘以 0.1、0.25、
0.5 和 0.75, 事件 1、2、3 和 4
寄存器会 设为等于周期的
10%、25%、50% 和 75%。
如果我们决定更改 开关周期,
我们只需更改 指派给 #define 周期的秒数,
然后所有 事件寄存器
将自动扩展。
事件 3 和事件 4 将 分别存储在 DPWMEV3
和 EV4 中。
他们具有与事件 2 相同的 对齐和时基,
即,它们为 18 位宽且具有
250 ps 的时基。
这是 DPWM 模块的 简化逻辑图,
涵盖迄今为止 我们已讨论的问题。
我们看了开环模式中的 DPWM 操作。
即,DPWM 输出完全 由其寄存器
而非滤波器 输出控制。
有多得多的逻辑 以及更多的寄存器
与 DPWM 操作关联,我们将这些实验中
讨论其中的部分内容。
现在,我们将事件寄存器的 输出直接传入
并经过大量 可配置的时序
逻辑。
我们将在稍后的实验中 回顾该逻辑的某些内容。
现在,对于其他 初始化,
您将需要 置于 C 代码中,
以在开环模式下 使用 DPWM 模块。
您应在初始化前 关闭 DPWM0,
具体方法是清除 DPWM 控制 寄存器 0 中的 PWM 启用位。
默认情况下, 该位实际上会被清除,
因此,严格意义上而言, 这不是必需的,
但是,尽管如此,这仍然是 好的做法。
由于我们在开环模式下 操作 DPWM 模块,
因此我们需要关闭 DPWM 的滤波器输入,
从而 DPWM 操作 完全由
其自身的寄存器控制。
我们所采取的具体方法是清除 PWM 控制 寄存器 0 中的 CLA
启用位。
CLA 是控制律加速器的 缩写词。
这只是滤波器的 另一名称。
接下来,我们需要在本地 开启 DPWM 模块,
具体方法是在 DPWM 控制 寄存器 0 中设置 PWM
启用位。
最后,我们需要在全局 开启 DPWM 模块,
具体方法是在 GLB 启用模块中
设置相关全局启用位。
每个 DPWM 具有其 自身的全局启用位。
我们在此为 DPWM 模块 0 设置位。
如果您要查找有关 该实验目前为止
所涵盖主题的 更全面的信息,
请参阅 UCD3138 数字电源外设
程序员手册。
现在,我们来看一下 C 源代码和 内存调试器
HyperKnob。
此处是 Code Composer Studio 中 实验练习二的 main.c。
要存储所有 初始化代码,
我们创建了 名为 init_dpwm0 的函数。
这主要是为了清楚直观。
如果您愿意,您也可以将 初始化代码直接
放在主程序自身的开始处。
此处,我们于初始化前 在本地禁用了
DPWM0 模块。
此处,我们禁用了 至 DPWM0 的滤波器输入,
以便为开环操作设置 DPWM0 模块。
我们在此设置 事件 1 寄存器的周期。
请注意,对于加载至 寄存器的值,
我使用符号引用。
我已在主程序顶部 使用 C #define 指令
添加了这些符号引用。
可将它们平等地置于 一个单独的头文件中。
使用符号引用 有关个人风格。
您可以平等地使用 硬编码常量。
在此,我们使用符号引用来 增加代码清晰度。
例如,清楚可见该周期为 10 ms。
请注意,事件 1 随周期扩展。
如果我们更改周期,则事件 1 将相应扩展。
对于该实验,请 添加 C 代码
以使事件 2、3 和 4 相应 在周期的 25%、50% 的
读数。
本教程稍后 将展示该解决方案。
最终,我们以本地方式和 全局方式启用了 DPWM0。
这是主程序。
此处是用于清除 校验和的后门,
以防锁定 编程闪存。
如果您要包括 该代码,请
确保连接要 相应拉动的引脚。
在本例中,您应将 FAULT3 引脚
接地,以使操作正常。
此处,我们调用函数来 初始化 PMBus 处理程序。
然后,我们调用 我们刚才添加的
函数以初始化 DPWM0。
这是具有 PMBus 处理程序 调用例程的主循环,
如实验练习一中所示。
这使我们能够 在固件运行时
通过 PMBus 与器件联系。
其他代码片段 与 HyperKnob
关联, 我将很快进行详细讨论。
当您将代码添加到 整个实验练习二时,
在 Code Composer Studio 中构建代码
并使用该器 件 GUI 下载。
这是 UCD 器件 GUI。
如前下载代码。
请勿写入 程序校验和。
如果在下载该固件时 已选定该选项,
则您刚才下载至 编程闪存的代码
将在其下载至 编程闪存后
立即开 始执行。
如未执行,请单击该链接 以开始执行该代码。
如果您将示波器 探针置于开环板的
引脚 DPWM0A 和 DPWM0B
您应看到这些波形。
传感器位于开关周期的 开头和末尾。
您可以看到 开关周期为 10 ms。
您还可以看到 输出 A 的上升沿
就位于开关周期的开头, 该上升沿与事件 1
相对应。
与事件 2 相 对应的下降沿
是在周期路线的 25 %处。
对于输出 B,您可以看到 上升沿和下降沿
分别在开关周期的 50% 和 75% 处出现。
现在,我将演示如何 设置内存调试器的
HyperKnob 功能。
我们将使用 HyperKnob 经由 PMBus 接口
即时修改 事件 2 的值。
要设置 HyperKnob, 我们首先在 C 源代码中
定义 RAM 的位置。
在此,我们定义了称作 ram_event2 的 RAM 变量。
非常重要的是, 务必在 RAM 变量定义后
添加以下注释。
内存调试器 解析 C 代码。
如果在变量定义后看到该 常见结构体,
它会在内存 调试器中
为该变量 启用 HyperKnob 功能。
我们希望 通过 HyperKnob 控制的
最小、最大以及 步进变量值
均位于注释中的 方括号内。
HyperKnob 仅适用于离散变量, 而不适用于
复杂的外设结构。
因此,我们用其 修改整型变量,
并将变量映射至 代码内部外设结构中的
某个字段 以修改该字段。
此处, 我们初始化
将与 HyperKnob 一起 使用的 RAM 变量,
方法是将该变量 设为事件 2 的值。
这是在主循环 前完成。
此处,事件 2 已设为
我们将使用 HyperKnob 控制的 RAM 变量的值。
当我们使用 HyperKnob 功能时,
我们通过 PMBus 修改了 变量 ram_event2 的值,
我稍后将 展示该功能的用法。
记住, PMBus 通信
是使用 C 代码中的 PMBus 处理程序实现的。
在我们退出 PMBus 处理程序例程时,
如果 ram_event2 因 我们使用 HyperKnob 对其进行了更改
而更改了值, 则事件 2
会在从 PMBus 处理 程序例程返回后,
在主循环中被 设为 ram_event2 的新值。
现在,我将展示 如何使用 HyperKnob。
打开内存调试器。
通过导航至含有实验练习二 映射文件的文件夹,
加载 存储器映射。
对于我们, 这会在存储 C 源文件的
文件夹中的 UCD3138 目录。
查找内存 调试器中
称作 ram_event2 的变量。
选中最右侧 Autowrite 列中的框。
选中后,您对该 变量值的变更
将自动 写入器件。
单击“Refresh”(刷新) 可通过 PMBus 接口
读取 ram_event2 的值。
单击含有 该值的单元格。
您将看到 ram_event2 等于 10,000,
这是事件 2 的初始值, 对应 10 ms 周期的
25%。
当选中单元格时, 您还会在单元格最右侧
看到向上和向下箭头。
这是 HyperKnob。
单击向上箭头键。
观察 ram_event2 的 值增长 2,500。
单击向下箭头键。
观察 ram_event2 的 值减少 2,500。
这是因为 C 代码中 在变量定义后紧跟的
备注字段 内的“step”
已设为 2,500。
当我们使用 HyperKnob 降低 ram_event2 的值时,
我们可以看到 事件 2
同时增长。
与此类似,如果我们 降低变量
ram_event2 的值。
该值反映了在 出现输出 A 的
下降沿的周期 中的时间
量。
这是因为 事件 2 已映射
至 C 代码的主循环中的 变量 ram_event2。
这里是实验练习二的解决方案。
我们为事件 2、事 件 3 和事件 4
创建了三个 符号引用,
并将这些符号引用的 值分别设置为
周期的 25%、50% 以及 75%。
此处,我们将 事件 2、3 以及 4
寄存器初始化 为其相应的值。
视频报错
手机看
扫码用手机观看
收藏本课程
-
未学习 UCD3138数字电源控制器架构和电源外设简介
00:25:15
播放中
视频简介
UCD3138数字电源控制器架构和电源外设简介
所属课程:UCD3138数字电源控制器架构和电源外设简介
发布时间:2019.03.11
视频集数:1
本节视频时长:00:25:15
DPWM模块是功率级控制回路的核心。 了解如何在开环模式下配置DPWM,在DPWM输出上输出简单波形,以及使用内存调试器超级旋钮来更改波形脉冲宽度。
//=$v1;?>
//=$v['id']?>//=$v['down_category']?>//=$v['link']?>//=$v['is_dl']?>//=$v['link']?>//=$v['name']?>//=$v['name']?>
//=$v['id']?>//=$v['down_category']?>//=$v['path']?>//=$v['is_dl']?>//=$v['path']?>//=$v['name']?>//=$v['name']?>
////=count($lesson['bbsinfo'])?>
//=$elink?>//=$elink?>//=$tags[0]?>//=$tags[0]?>//=$elink?>//= $elink?>//=$tags[1]?>//=$tags[1]?>
//=$lesson['bbs'];?>
//=count($lesson['bbsinfo'])?>