[PWMv2] 快速入门

引言

PWMV2外设是专为先楫HPM6EXX及其后续系列微控制器(MCU)设计的先进PWM模块,提供了高效、灵活的脉宽调制功能。

本指南旨在帮助开发者快速掌握如何使用 PWMV2 外设进行编程和应用开发。本文内容注重简洁明了,旨在让读者轻松理解关键概念和基本操作。对于更高级的功能和详细配置,请参阅后续的系列文档以获取深入指导。

PWMV2系列文章主要从以下几个方向介绍先楫PWM外设的应用方法

主要功能

  • 波形输出
    • 中心对称PWM
    • 边沿对齐PWM(左侧边沿,右侧边沿)
    • Burst输出,指定输出多少个PWM脉冲后,pwm停止输出,最大支持65535个脉冲
    • 互补PWM输出,带死区控制
    • 故障保护功能,支持同步和异步保护
    • 强制输出功能
    • 输入捕获功能
    • 支持触发adc采样
    • 支持触发sigma-delta adc采样
    • 支持触发编码器采样
    • 支持PWM同步功能
    • 支持PWM移相功能
    • PWM中断和DMA功能

特色功能

  • 通用计算单元
    • 根据dac的输入值或者当前计数器值,计数器重载值以及预设的参数计算出一个结果,用于更新比较器的值
    • 使用硬件计算相关参数,运算速度快
    • 支持PWM占空比硬件限幅
    • 支持PWM频率硬件限幅
  • 支持关键寄存器加锁
  • 支持调试模式
    • 使用调试器进行调试时可以设置PWM输出为配置的电平状态
  • 高精度PWM

进阶篇

在准备PWM(脉宽调制)系列的高级功能配置文档时,我们重点关注以下几个关键特性:

  1. PWM信号同步
    同步PWM信号确保了多个PWM通道之间或与外部时钟和事件的时间一致性。对于多相系统中的精确相位对齐至关重要。

  2. PWM信号移相
    移相技术允许调整PWM信号相对于参考点或其他PWM信号的相位角。这对于三相电机控制和其他需要精密相位调节的应用尤为重要。通过硬件或软件实现的移相可以提供灵活且精确的控制。

  3. 固定占空比下的频率调整
    有时应用需求保持固定的占空比,同时调整PWM信号的频率。这种配置要求PWM生成器能够精准地维持设定的占空比,即使频率发生变化。

  4. 事件驱动与中断管理
    高效的事件检测和中断触发机制使得PWM控制器能够在特定事件发生时即时响应,如周期结束或比较匹配。良好的事件和中断管理是实现实时操作的关键,提升了系统的响应速度和整体效率。

  5. 斩波功能
    PWM斩波将连续的PWM信号分割成一系列短脉冲,以降低音频噪声或优化电源效率。通过调整PWM信号的开启和关闭时间来实施斩波,为某些应用场景提供了额外的优势。

  6. 故障保护和强制输出功能

    • PWMv2模块提供了全面的故障保护机制,能够在检测到异常情况时迅速采取措施,防止潜在的硬件损坏或危险发生。主要特性包括同步和异步故障输入,故障响应模式,故障恢复机制。
    • 强制输出功能允许用户在必要时直接控制PWM输出的状态,而不依赖于正常的PWM波形生成逻辑。可提供硬件强制输出和软件强制输出。

时钟配置

先楫PWM的时钟和电机系统共用一个时钟源,因此不需要单独进行PWM系统的时钟分频设置,简化用户的设计。使用如下接口可以获取PWM的频率

freq = clock_get_frequency(clock_mot0);

引脚配置

使用PWM输出,需要配置引脚的功能为PWM,代码如下所示,设置PE08引脚功能为PWM1的P0引脚:

HPM_IOC->PAD[IOC_PAD_PE08].FUNC_CTL = IOC_PE08_FUNC_CTL_PWM1_P_0;

影子寄存器

影子寄存器包含一组与工作寄存器相对应的寄存器,这些寄存器可以被直接读写,但其内容不会立即生效。只有当满足特定条件时,影子寄存器中的值才会被复制到相应的工作寄存器中,从而对PWM输出产生影响。
在修改影子寄存器之前,需要先解锁它们。这通常通过向UNLOCK寄存器写入一个特定的密钥来完成。
修改完成后,可以通过设置锁定位来重新锁定影子寄存器,防止意外更改。

  • 每个PWMV2外设含有28个独立的影子寄存器,可关联到PWMV2的4个通道的任意通道中,在特定的时机将影子寄存器的值更新到工作寄存器中。

  • 影子寄存器可用于配置 reload补偿值compare通用计算单元补偿值以及私有计算单元门限补偿值

  • 影子寄存器在一定程度上保证了多数据更新的一致性。更新影子寄存器如下

    pwmv2_enable_shadow_lock_feature(PWM);
    pwmv2_shadow_register_unlock(PWM);
    // set shadow registers
    pwmv2_shadow_register_lock(PWM);
  • 在更新时机选择为软件方式更新的情况下,影子寄存器中的值可以通过软件触发更新到工作寄存器中

    pwmv2_issue_shadow_register_lock_event(PWM);

生效时机

  • 输出极性取反配置更新
    • 软件更新
    • reload值重载更新
  • fault的恢复时机
    • 立即恢复(在PWMV2时钟的下一个周期)
    • reload值重载恢复
    • FAULT_REC_SEL选择的触发信号恢复
    • 软件写入FAULT_CLEAR寄存器恢复
  • force mode更新至工作寄存器时机
    • 软件更新
    • 指定compare值更新
    • reload值重载更新
    • FORCE_TRIG_SEL选中的输入信号更新
  • force mode工作时机
    • 立刻生效
    • reload值重载时生效
    • FORCE_ACT_SEL选择的触发信号到来生效
    • 关闭force mode
  • 通道reload值更新时机
    • 软件更新
    • 指定的compare值更新
    • reload值重载时更新
    • RLD_TRIG_SEL的输入信号到来更新
  • 比较点compare值更新时机
    • 软件更新
    • 立即更新(在pwmv2时钟的下一个周期)
    • 关联计数器reload值重载更新
    • CMP_TRIG_SEL选择的触发源信号到来更新
    • RLD_CMP_SEL0选择的比较值与计数值匹配时更新
    • RLD_CMP_SEL1选择的比较值与计数值匹配时更新
  • 计数器数值更新时机
    • 当选定的触发源信号到来时,将通用计算单元的值更新到计数器值

PWMV2外部输入与对外输出

  • 外部输入

    • QEO输出的数据,用来硬件生成SPWM或者SVPWM波形
    • 来自普通IO的输入捕获信号
    • PWM[x]_TRIG_IN[x]输入进来的硬件信号。PWMV2可以通过truggermux将支持的外部信号引入PWMV2模块中,用作触发输入
  • 对外输出

    • PWMV2支持匹配compare值向外部输出电平,在匹配compare值后,拉高电平,在关联的通道计数器到达reload值后,清除。
      信号需要通过triggermux的PWM[x]TRGO[x]向外进行输出。

PWM生成

PWMV2计数器是PWM模块的核心组件之一,它决定了PWM信号的时间基准和波形特性。

  • 计数器的基本概念

    • 计数模式:HPM6E00的PWMv2仅提供上升计数模式,即计数器从0开始递增直到达到预设的最大值(重载值),然后重新从0开始。
    • 周期:计数器的周期由重载值决定
  • 计数器的主要功能

    • 时间基准:为PWM信号生成提供时间参考,决定了PWM信号的周期和占空比。
    • 事件触发:当计数值匹配某个比较值时,可以触发中断或其他事件,如改变PWM输出状态或启动其他外设操作。
    • 重载机制:当计数器到达最大值时会发生重载事件,此时计数器会恢复到0,并可以根据需要更新某些寄存器的内容。

PWMV2 支持 4 个 PWM 生成子模块,每个子模块包含一个 32 位计数器和 4 个 32 位比较值,并支持输出 2路独立或者 1 对互补的 PWM 输出,计数器的值和比较值的关系,决定了 初始 PWM 的输出波形。
尽管某些MCU的计数器支持上升、下降及双向计数模式,HPM系列MCU中的PWMv2模块只提供上升计数功能。这种设计选择不仅简化了PWM信号的生成过程,而且在性能和功能性方面丝毫不逊色于其他复杂计数模式的MCU,甚至在某些方面展现出更强的优势。下文会通过中心对齐PWM的配置,说明上升计数在性能上没有任何问题。

为了帮助开发者快速上手,以下将重点介绍一些关键配置项,使PWM外设能够迅速投入工作。对于更复杂的定制化需求,参考进阶篇获取详细指导。

  • 每一个PWM外设有四个计数器,每个计数器有cmp0-cmp3四个比较器。一般情况下,cmp0和cmp1,cmp2和cmp3成对使用输出CHN0-1两路PWM。

    • 因为CHN0-1两路PWM共用一个计数器,所以这两路PWM频率一致
    • 互补PWM输出时候,CHN0-1成对使用,cmp0-cmp1有效,cmp2-cmp3无效
    • cmp0的值为a,cmp1的值为b,计数器的重载值为T,a和b的值可以在0-2T之间配置,组成各种不同的波形。一般情况下a和b的值在0-T之间配置,且a的值小于b即可满足基本需求。此时当计数器的值在a和b之间时(包含a和b)输出高电平,其他情况输出低电平。
    • 四点模式下,CHN0的电平变化由a、bc、d两组点位决定,按照两点模式下大小关系生成对应的波形,再根据预设的PWM_LOGIC寄存器所设置的模式将两组波形进行逻辑组合后输出。CHN1此时可使用互补模式进行输出。
  • 为了保证比较寄存器和计数器更新的一致性,使用影子寄存器更新实际工作用的寄存器。当选择的影子寄存器更新时刻匹配时,影子寄存器的值会被更新到实际工作用的寄存器

代码配置

一般情况下,遵守如下流程就可以正确配置PWM输出波形

  1. 调用deinit函数复位PWMV2外设
  2. 解锁PWM影子寄存器
  3. 配置影子寄存器的值
  4. 计数器选择需要使用的影子寄存器(也可以选择值来自于计算单元)。此时选择的影子寄存器中的值就是计数器的重载值。
  5. 设置计数器重载值生效的时刻
    如下代码设置生效时刻为reload点,这也是常用的影子寄存器生效时刻配置。

    pwmv2_set_reload_update_time(PWM, pwm_counter_0, pwm_reload_update_on_reload);
  6. 选择比较单元使用的影子寄存器(也可以选择值来自计算单元)
  7. 开启PWM输出
    pwmv2_channel_enable_output(PWM, BOARD_APP_PWM_OUT1);
  8. 开启定时器
    pwmv2_enable_counter(PWM, pwm_counter_0);
  9. 通过影子寄存器更新占空比或者频率
    pwmv2_shadow_register_unlock(PWM);
    pwmv2_set_shadow_val(PWM, PWMV2_SHADOW_INDEX(1), reload - duty, 0, false);
    pwmv2_issue_shadow_register_lock_event(PWM)

中心对齐PWM

中心对齐的PWM(脉宽调制)波形因其对称性而被广泛应用于电机控制、音频信号处理等领域。与边缘对齐PWM不同,中心对齐PWM在一个周期内的高电平和低电平时间是关于周期中点对称分布的。

  • 影子寄存器方法

    为了生成中心对齐的PWM波形,可以通过配置PWM模块中的两个比较单元来实现。具体来说,需要设置两个影子寄存器,分别对应于PWM波形的上升沿和下降沿位置。通过将这两个寄存器值设为以下表达式,可以确保PWM波形的中心对齐:

    • 上升沿位置(即PWM波形开始变为高电平的位置):

      \text{CMP0} = \frac{\text{Reload} - \text{Duty}}{2}
    • 下降沿位置(即PWM波形恢复为低电平的位置):

      \text{CMP1} = \frac{\text{Reload} + \text{Duty}}{2}

    其中:

    • Reload 是PWM周期结束时重新加载的计数值,决定了PWM的频率。
    • Duty 是PWM的占空比,表示高电平持续时间对应的计数值。

    上述配置确保了PWM信号在一个周期内的高电平和低电平时间是对称分布的,从而产生精确的中心对齐波形。这种方法不仅提高了PWM输出的精度,而且对于降低电磁干扰(EMI)和提高系统的整体性能具有重要作用。

    此外,当调整Duty值以改变PWM占空比时,CMP0CMP1 会相应地更新,保持波形始终关于周期中点对齐。这使得即使在动态调整占空比的情况下,也能维持波形的对称性和稳定性。

  • 计算单元方法
    使用影子寄存器生成中心对称的波形,需要修改两个寄存器,如果想只修改一个值就生成中心对称PWM,可以使用计算单元进行操作。

    • Cal_t_index, 从4个计数器计算单元输出值(reload_new)中选择一个
    • Cal_in_index,从4个dac输入值和4个计数器当前值中选择一个
    • Cal_in_off从28个shadow寄存器中选择一个作为偏移量,选择后四个为0,无偏移。
    • Cal_lim_up/cal_lim_lo,也是从28个shadow寄存器中选择一个作为计算上下限的偏移量
    • Cal_lu_en/cal_ll_en是上下限使能位
    • 以_param结尾的是五位有符号参数,所有从shadow寄存器中选的数都作为有符号数处理。
    • 下图中圆圈中的X或者+代表当前运算时乘法或者加法

    所以cal_t_index选择当前使用的计数器,cal_t_param配置为4,此时相当于reload/2,cal_in_index选择dac输入,此时CMP1对应的计算单元值cal_d_param配置为-4,CMP2对应的计算单元的值cal_d_param配置为+4。dac的值配置为duty即可。

边沿对齐PWM

边沿对齐PWM(脉宽调制)是一种常见的波形生成方式,广泛应用于各种控制和调节系统中。与中心对齐PWM不同,边沿对齐PWM的高电平或低电平时间不是关于周期中点对称分布的,而是相对于一个固定的边沿(上升沿或下降沿)进行调整。这种方式简化了硬件设计,并且在某些应用中提供了更好的灵活性。

  • 左边沿对齐
    左边沿对齐PWM是指PWM波形的每个周期都从同一个固定的时间点开始,即所有周期的上升沿是同步的。在这个模式下,占空比的变化只影响PWM波形的结束位置(下降沿),而起始位置保持不变。
    所以CMP0配置为0,CMP1配置为占空比即可

  • 右边沿对齐

    右边沿对齐PWM则是在每个周期结束时保持同步,即所有周期的下降沿是同步的。在这种模式下,占空比的变化会影响PWM波形的开始位置(上升沿),而结束位置保持不变。

    \text{CMP0} = \text{Reload} - \text{Duty}
    \text{CMP1} = \text{Reload}

结语

本文提供了从硬件功能介绍到软件实现的一整套流程,帮助开发者快速上手HPM芯片PWMV2外设的使用。希望这些信息能够为你的项目提供有价值的指导。一旦掌握了基础,就可以探索更复杂的PWM应用,比如电机控制、电源等。不同硬件平台的PWM实现细节可能会有所不同,但HPM系列芯片提供了功能强大的PWM外设实现各种复杂功能。同时也可以参考我们提供的例程以及解决方案深入了解PWMV2的使用方法。希望这些信息能帮助你快速入门PWM技术。如果有特定的应用场景,可以通过留言进行讨论,以便给出更加详细的建议。

0
0
发表回复 2

Your email address will not be published. Required fields are marked *


wen wen

wen wen

请问高精度定时 的描述在什么位置?

will chuai

will chuai

高精度PWM的实现比较简单,可以参考pwmv2 pwmoutput 例程中的generate_pwm_cmpjit_edge_aligned_waveform函数中的实现。主要操作就是调用 pwmv2_enable_hrpwm.然后配置高精度部分的值即可。 高精度PWM只考虑比较器高精度的话,就是在现有的占空比基础上增加一段时间为t的输出。t的值是1 /(0-255)个PWM时钟周期。输出精度为100ps。 如果同时考虑计数器也使能高精度的话,问题会复杂一些,需要考虑计数器和比较器之间的影响。