UCD3138数字电源控制器架构和电源外设简介

+荐课 提问/讨论 评论 收藏
  • 课程目录
  • 相关资源
  • 课程笔记

在本教程中,我将介绍数字电源 外设,尤其着重介绍 数字脉冲宽度调制,或者说 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 ComposerStudio 中构建代码 并使用该器件 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 寄存器初始化
课程介绍 共计1课时,25分15秒

UCD3138数字电源控制器架构和电源外设简介

电源 ARM 控制器 架构 闪存 数字 PMBus UCD3138 DPWM 外设

在本教程中, 我将介绍数字电源 外设, 尤其着重介绍 数字脉冲宽度调制, 或者说 DPWM 块。 此演示 随实验练习二一起提供。 在上一教程中,我们已简要 介绍了 ARM 内核、 闪存以及 PMBus 接口。 现在,我们将着重介绍 DPWM 模块及其两个 关联的输出引脚。

推荐帖子

我的2407无法仿真,观察到如下现象,网帮忙检查原因
用usb20emurst程序可以扫描到芯片?? 你只能判断是否连上了,仿真器,不能说你能扫描到芯片,...
yhen 微控制器 MCU
进行2812设计时需要注意的几点
如何提高F2812 AD的转换精度 采用软件补偿,参考文档spra989a。 程序经常跑飞 程序没有结尾或不是循环的程序。 nmi管脚没有上拉。 在看门狗动作的时候程序会经常跑飞。 程序编制不当也会引起程序跑飞。 硬件系统有问题。 程序访问了非法的地址。 用示波器观测的时候程序跑飞 示波器的探头接地不好,探头上的电位可能会比较高,接到信号线上产生干扰会跑飞。 大程...
Aguilera DSP 与 ARM 处理器
关于C6748 的 VPIF 的读取
求各位指点 C6748通过tvp5150am1采样,8bits视频信号输入,有代理给出的例程,但是只有一个视频dec之后,又enc输出的程序。 输入PAL制式,输出PAL制式。 但是想通过DSP对视频进行处理,但是在这方面毫无经验,小弟希望各位能给指点, 如何将读出的图像变成灰度图像,然后存在RAM里面进行处理呢?...
dldlimdl TI技术论坛
关于GPIOPadConfigSet()函数
关于GPIOPadConfigSet()函数,小弟想请教推挽、开漏、弱上拉、弱下拉分别在什么时候使用。...
yuanzhiqian 微控制器 MCU

hawkier

学习了哦,视频不错

2020年05月14日 14:56:55

shakencity

学习{UCD3138数字电源控制器架构和电源外设简介} 。

2019年11月22日 09:10:24

zwei9

看看视频,学习{UCD3138数字电源控制器架构和电源外设简介} 。

2019年05月01日 01:44:48

分享到X
微博
QQ
QQ空间
微信

EEWorld订阅号

EEWorld服务号

汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新文章 手机版

站点相关: EEWORLD首页 EE大学堂 论坛 下载中心 Datasheet 活动专区 博客

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved