一文讲清:PWMV2快速入门

2025-01-02
浏览量:
576

引 言

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


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


  • [PWM快速入门] 

    https://kb.hpmicro.com/2024/12/17/pwmv2快速入门/


  • [PWM同步方法] 

    https://kb.hpmicro.com/2024/12/26/pwmv2同步方法/


  • [PWM移相方法] 

    https://kb.hpmicro.com/2024/12/26/pwmv2移相方法/


  • [PWM固定占空比修改频率方法] 

    https://kb.hpmicro.com/2024/12/31/pwmv2固定占空比修改频率方法/


  • [PWM斩波功能] 

    https://kb.hpmicro.com/2024/12/26/pwmv2斩波方法/


  • [PWM触发和中断管理] 

    https://kb.hpmicro.com/2024/12/30/pwmv2触发和中断功能/


  • [PWM故障保护和强制输出功能] 

    https://kb.hpmicro.com/2024/12/30/pwmv2故障保护和强制输出/




主要功能



  • 波形输出

  • 中心对称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 registerspwmv2_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波形开始变为高电平的位置):

CMP0=ReloadDuty2


  • 下降沿位置(即PWM波形恢复为低电平的位置):

CMP1=Reload+Duty2


其中:

  • Reload是PWM周期结束时重新加载的计数值,决定了PWM的频率。

  • Duty 是PWM的占空比,表示高电平持续时间对应的计数值。


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


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


  • 计算单元方法


使用影子寄存器生成中心对称的波形,需要修改两个寄存器,如果想只修改一个值就生成中心对称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波形的开始位置(上升沿),而结束位置保持不变。

CMP0=ReloadDuty

CMP1=Reload


结 语

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


(图源网络)



/

/




先楫半导体

“先楫半导体”(HPMicro)是一家致力于高性能嵌入式解决方案的半导体公司,产品覆盖微控制器、微处理器和周边芯片,以及配套的开发工具和生态系统。公司成立于2020年6月,总部坐落于上海市浦东软件园区,并在天津、苏州和深圳均设立分公司。核心研发团队来自世界知名半导体公司团队,具有15年以上、超过20个SoC的丰富的开发及量产经验。市场及销售团队来自全球领先半导体分销公司,管理近10亿美金的半导体元器件年销售额,服务超过5000家中国区客户。先楫半导体以产品质量为本,所有产品均通过严格的可靠性测试。目前已经量产6大系列高性能通用MCU产品,产品性能及通用性领先国际同类产品并通过AEC-Q100认证。公司已完成ISO9001质量管理和ISO 26262/IEC61508功能安全管理体系双认证,全力服务中国乃至全球的工业、汽车和能源市场。更多信息,请访问 https://hpmicro.com/