[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(脉宽调制)系列的高级功能配置文档时,我们重点关注以下几个关键特性:
-
PWM信号同步
同步PWM信号确保了多个PWM通道之间或与外部时钟和事件的时间一致性。对于多相系统中的精确相位对齐至关重要。 -
PWM信号移相
移相技术允许调整PWM信号相对于参考点或其他PWM信号的相位角。这对于三相电机控制和其他需要精密相位调节的应用尤为重要。通过硬件或软件实现的移相可以提供灵活且精确的控制。 -
固定占空比下的频率调整
有时应用需求保持固定的占空比,同时调整PWM信号的频率。这种配置要求PWM生成器能够精准地维持设定的占空比,即使频率发生变化。 -
事件驱动与中断管理
高效的事件检测和中断触发机制使得PWM控制器能够在特定事件发生时即时响应,如周期结束或比较匹配。良好的事件和中断管理是实现实时操作的关键,提升了系统的响应速度和整体效率。 -
斩波功能
PWM斩波将连续的PWM信号分割成一系列短脉冲,以降低音频噪声或优化电源效率。通过调整PWM信号的开启和关闭时间来实施斩波,为某些应用场景提供了额外的优势。 -
故障保护和强制输出功能
- 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]向外进行输出。
- PWMV2支持匹配compare值向外部输出电平,在匹配compare值后,拉高电平,在关联的通道计数器到达reload值后,清除。
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、b
、c、d
两组点位决定,按照两点模式下大小关系生成对应的波形,再根据预设的PWM_LOGIC
寄存器所设置的模式将两组波形进行逻辑组合后输出。CHN1此时可使用互补模式进行输出。
- 为了保证比较寄存器和计数器更新的一致性,使用影子寄存器更新实际工作用的寄存器。当选择的影子寄存器更新时刻匹配时,影子寄存器的值会被更新到实际工作用的寄存器
代码配置
一般情况下,遵守如下流程就可以正确配置PWM输出波形
- 调用deinit函数复位PWMV2外设
- 解锁PWM影子寄存器
- 配置影子寄存器的值
- 计数器选择需要使用的影子寄存器(也可以选择值来自于计算单元)。此时选择的影子寄存器中的值就是计数器的重载值。
- 设置计数器重载值生效的时刻
如下代码设置生效时刻为reload点,这也是常用的影子寄存器生效时刻配置。pwmv2_set_reload_update_time(PWM, pwm_counter_0, pwm_reload_update_on_reload);
- 选择比较单元使用的影子寄存器(也可以选择值来自计算单元)
- 开启PWM输出
pwmv2_channel_enable_output(PWM, BOARD_APP_PWM_OUT1);
- 开启定时器
pwmv2_enable_counter(PWM, pwm_counter_0);
- 通过影子寄存器更新占空比或者频率
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占空比时,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波形的开始位置(上升沿),而结束位置保持不变。
\text{CMP0} = \text{Reload} - \text{Duty}
\text{CMP1} = \text{Reload}
结语
本文提供了从硬件功能介绍到软件实现的一整套流程,帮助开发者快速上手HPM芯片PWMV2外设的使用。希望这些信息能够为你的项目提供有价值的指导。一旦掌握了基础,就可以探索更复杂的PWM应用,比如电机控制、电源等。不同硬件平台的PWM实现细节可能会有所不同,但HPM系列芯片提供了功能强大的PWM外设实现各种复杂功能。同时也可以参考我们提供的例程以及解决方案深入了解PWMV2的使用方法。希望这些信息能帮助你快速入门PWM技术。如果有特定的应用场景,可以通过留言进行讨论,以便给出更加详细的建议。
请问高精度定时 的描述在什么位置?
高精度PWM的实现比较简单,可以参考pwmv2 pwmoutput 例程中的generate_pwm_cmpjit_edge_aligned_waveform函数中的实现。主要操作就是调用 pwmv2_enable_hrpwm.然后配置高精度部分的值即可。 高精度PWM只考虑比较器高精度的话,就是在现有的占空比基础上增加一段时间为t的输出。t的值是1 /(0-255)个PWM时钟周期。输出精度为100ps。 如果同时考虑计数器也使能高精度的话,问题会复杂一些,需要考虑计数器和比较器之间的影响。