在现代嵌入式系统中,脉冲宽度调制(PWM)技术被广泛应用于电机驱动、灯光调光、电源稳压等场景。小华半导体的 HC32F460 系列 32 位 ARM® Cortex®-M4 微控制器凭借其丰富的定时器资源,提供了灵活且高性能的 PWM 功能。本文将详细介绍 HC32F460 的 PWM 核心特性、关键模块及应用配置。
PWM 功能概述
HC32F460 系列通过多个专用定时器模块实现 PWM 功能,涵盖从基础到高级的各类 PWM 需求。其 PWM 系统具备以下核心优势:
多通道输出能力:支持多路独立 PWM 输出,满足复杂设备的多负载控制需求;
互补输出与死区控制:针对功率器件驱动场景,提供互补 PWM 输出及可编程死区时间,防止上下桥臂直通;
灵活的波形控制:支持锯齿波、三角波等多种调制波形,可动态调整周期和占空比;
硬件同步与缓存功能:支持多定时器同步工作,通过缓存机制实现 PWM 参数的无间断更新;
故障保护机制:结合紧急刹车(EMB)模块,可在故障时快速关闭 PWM 输出,提升系统安全性。
HC32F460 的 PWM 功能主要由三类定时器模块实现:高级控制定时器(Timer6)、电机 PWM 定时器(Timer4)和通用定时器(TimerA),各模块针对不同应用场景优化设计。
核心定时器模块的 PWM 特性
高级控制定时器(Timer6)
Timer6 是 HC32F460 中功能最丰富的 PWM 模块,主要面向高精度电机控制等场景,其 PWM 核心特性如下:
输出能力:每个 Timer6 支持 6 路互补 PWM 输出,可配置为 3 组互补通道,满足三相电机驱动需求;
波形模式:支持锯齿波(递增计数)和三角波(递增 / 递减计数)两种调制模式。在三角波模式下,可生成对称 PWM 波形,降低谐波失真;
死区控制:通过死区时间基准值寄存器(TMR6_DTUxAR、TMR6_DTUxBR)可精确设置互补输出的死区时间,范围支持纳秒级到毫秒级调整,适应不同功率器件的开关特性;
缓存功能:具备双缓存机制,可在当前周期结束后自动加载新的周期值和比较值,实现 PWM 参数的无缝更新,避免波形突变导致的系统冲击;
同步与触发:支持硬件同步功能,可与其他定时器或外部信号同步,确保多通道 PWM 的相位一致性;同时支持外部触发启动 / 停止 PWM 输出,增强系统灵活性。
Timer6 的 PWM 输出配置通过端口控制寄存器(TMR6_PCONR) 实现,可设置输出极性、空闲状态等参数;通过通用比较基准值寄存器(TMR6_GCMAR-GCMFR) 设定比较值,进而控制 PWM 占空比。
电机 PWM 定时器(Timer4)
Timer4 专为多相电机驱动设计,聚焦高集成度和可靠性,其 PWM 特性包括:
通道规模:每个 Timer4 支持 6 路 PWM 输出,3 个 Timer4 模块可提供 18 路互补 PWM 输出,满足多相电机或多电机控制场景;
灵活的调制模式:支持锯齿波和三角波调制,可通过通用模式控制寄存器(TMR4_OCMRm) 配置输出波形的边沿对齐或中心对齐模式;
周期间隔响应:支持基于周期匹配的中断或事件输出,可用于同步 ADC 采样、电流检测等外设动作,提升电机控制的闭环精度;
故障保护集成:与 EMB 模块深度联动,当检测到过流、过压等故障时,可快速将 PWM 输出置为高阻或预设安全状态,保护功率器件。
在三相互补 PWM 应用中,Timer4 的死区控制寄存器(TMR4_PDAxBRn) 可精准设置上下桥臂的死区时间,配合紧急刹车控制寄存器(TMR4_ECSR) 实现故障下的安全关断。
通用定时器(TimerA)
TimerA 提供基础但灵活的 PWM 功能,适用于灯光调光、阀门控制等场景,其核心特性如下:
多通道独立控制:每个 TimerA 支持 8 路 PWM 输出,6 个 TimerA 模块可提供 48 路独立 PWM 通道,每路 PWM 占空比可单独调节;
简单波形生成:基于锯齿波或三角波计数模式,通过比较基准值寄存器(TMRA_CMPAR1~8) 设定比较值,实现占空比 0%~100% 的连续调节;
低功耗优化:支持在低功耗模式下运行,可通过外部触发或定时器同步唤醒,适合电池供电设备的节能需求。
PWM 关键技术特性
死区时间配置
死区时间是功率电子应用中保障安全的关键参数。HC32F460 通过专用寄存器实现高精度死区控制:
Timer6 的死区时间由TMR6_DTUxAR和TMR6_DTUxBR寄存器设定,计算公式为:死区时间 = 基准值 × 定时器时钟周期;
Timer4 通过TMR4_PDAxBRn寄存器配置死区,支持对称和非对称死区模式,适应不同类型的功率管特性。
合理设置死区时间可避免上下桥臂同时导通导致的电源短路,典型值需根据功率器件的开关速度(如 MOSFET 的栅极延迟)确定。
波形同步与联动
HC32F460 支持多 PWM 通道的同步与联动,提升系统协同性:
硬件同步:通过 Timer6 的同步控制寄存器可实现多个 Timer6 模块的相位同步,确保多轴电机驱动的一致性;
事件触发:PWM 周期匹配事件可触发 ADC 转换、DMA 传输等动作,例如在电机控制中,可同步采集相电流信号,实现闭环控制;
外部同步输入:支持通过外部引脚(如编码器信号)触发 PWM 相位调整,适应动态负载变化。
动态参数更新
为实现 PWM 参数的无扰动调整,HC32F460 采用缓存机制:
Timer6 的缓存控制寄存器(TMR6_BCONR) 可配置周期值和比较值的缓存使能,新参数在当前周期结束后自动生效;
Timer4 的OCCR 缓冲数据传输功能支持在周期间隔响应时更新比较值,确保波形平滑过渡。
故障保护机制
结合紧急刹车(EMB)模块,PWM 系统可实现多层级故障保护:
外部故障检测:当 EMB 模块检测到外部引脚电平异常(如过流信号),可立即将 PWM 输出置为高阻状态;
振荡器故障保护:外部高速振荡器异常停振时,EMB 可触发 PWM 输出关闭,防止因时钟异常导致的输出失控;
软件强制刹车:通过写EMB_SOEx 寄存器可软件强制关闭 PWM 输出,用于系统调试或紧急停机场景。
PWM 配置流程
以 Timer6 生成三相互补 PWM 为例,典型配置步骤如下:
时钟初始化:通过时钟控制器(CMU)配置 Timer6 的时钟源(如 MPLL 分频),确保时钟频率满足 PWM 精度需求;
定时器基础配置:设置TMR6_GCONR寄存器选择计数模式(锯齿波 / 三角波)、使能自动重载等功能;
周期与比较值设置:写入TMR6_PERAR设定 PWM 周期(周期 = (PERAR值 + 1) × 时钟周期),通过TMR6_GCMAR设置比较值(占空比 = 比较值 / 周期值);
死区配置:在TMR6_DTUxAR和TMR6_DTUxBR中设置死区时间,根据功率器件参数调整;
输出使能:通过TMR6_PCONR配置 PWM 输出引脚、极性及空闲状态,置位输出使能位;
启动定时器:置位TMR6_GCONR的计数使能位,开始生成 PWM 波形。
应用场景
HC32F460 的 PWM 功能可满足多领域应用需求:
电机驱动:通过 Timer6/Timer4 的三相互补 PWM 输出,配合死区控制和同步采样,实现无刷直流电机(BLDC)、永磁同步电机(PMSM)的精准驱动;
电源管理:利用 TimerA 的多路独立 PWM,实现开关电源的多通道电压调节或 LED 阵列的调光控制;
工业控制:通过 PWM 的硬件同步功能,实现多轴运动控制或精密阀门的比例调节。
示例代码
基于ddl库的timerA定时器输出PWM
#ifndef __IPWM_H__
#define __IPWM_H__
#include "hc32_ll.h"
#include "hc32f460.h"
#define TMRA_PWM_UNIT CM_TMRA_4 // TMRA 单元
#define TMRA_PWM_CH TMRA_CH3 // PWM 通道
#define TMRA_PWM_PERIOD_VALUE 9999UL // PWM 周期值(0~9999)
#define TMRA_PCLK2_FREQ 100000000UL // PCLK1 时钟频率(100MHz)
#define TMRA_PWM_PORT GPIO_PORT_B // 输出端口:PB8
#define TMRA_PWM_PIN GPIO_PIN_08 // 输出引脚
#define TMRA_PWM_FUNC GPIO_FUNC_4 // PB8 复用为 TMRA4_CH3
#define PWC_FCG2_PERIPH_GPIOB GPIO_PORT_B // GPIOB 时钟使能位
#define PWC_FCG2_PERIPH_TMRA4 FCG2_PERIPH_TMRA_4 // TMRA4 时钟使能位
int32_t iTMRA_PWM_Init(uint32_t u32FreqHz);
void TMRA_PWM_Start(void);
int32_t TMRA_PWM_SetDuty(uint8_t u8Duty);
#endif /* __IPWM_H__ */
#include "ipwm.h"
static void TMRA_PWM_GpioInit(void)
{
stc_gpio_init_t stcGpioInit;
// 解锁GPIO寄存器
GPIO_REG_Unlock();
// 使能GPIOB时钟(使用修正后的宏)
FCG_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_GPIOB, ENABLE);
// 初始化GPIO结构体
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinDir = PIN_DIR_OUT; // 输出方向
stcGpioInit.u16PinOutputType = PIN_OUT_TYPE_CMOS; // CMOS推挽输出
stcGpioInit.u16PinDrv = PIN_MID_DRV; // 中等驱动能力
stcGpioInit.u16PinAttr = PIN_ATTR_DIGITAL; // 数字引脚
(void)GPIO_Init(TMRA_PWM_PORT, TMRA_PWM_PIN, &stcGpioInit);
// 配置引脚复用功能(使用正确的功能号)
GPIO_SetFunc(TMRA_PWM_PORT, TMRA_PWM_PIN, TMRA_PWM_FUNC);
// 锁定GPIO寄存器
GPIO_REG_Lock();
}
int32_t iTMRA_PWM_Init(uint32_t u32FreqHz)
{
stc_tmra_init_t stcTmraInit;
stc_tmra_pwm_init_t stcPwmInit;
uint32_t u32ClockDiv; // 分频系数
const uint32_t u32DivMap[] = {1, 2, 4, 8, 16, 32, 64}; // 标准分频值
// 初始化GPIO
TMRA_PWM_GpioInit();
// 使能TMRA4时钟
FCG_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TMRA4, ENABLE);
// 使能AOS时钟(如需事件触发,可选)
// FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);
/* 计算并修正分频系数为标准值 */
u32ClockDiv = TMRA_PCLK2_FREQ / (u32FreqHz * (TMRA_PWM_PERIOD_VALUE + 1UL));
if (u32ClockDiv == 0UL)
{
u32ClockDiv = TMRA_CLK_DIV1; // 最小分频为1
}
else
{
uint8_t i;
// 找到不小于计算值的最小标准分频
for (i = 0; i < sizeof(u32DivMap) / sizeof(u32DivMap[0]); i++)
{
if (u32DivMap[i] >= u32ClockDiv)
{
u32ClockDiv = i << TMRA_BCSTR_CKDIV_POS; // 转换为库要求的位偏移格式
break;
}
}
// 检查是否超出最大分频
if (i >= sizeof(u32DivMap) / sizeof(u32DivMap[0]))
{
FCG_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TMRA4, DISABLE);
return LL_ERR_INVD_PARAM;
}
}
/* 初始化TMRA定时器(使用计算后的分频值) */
(void)TMRA_StructInit(&stcTmraInit);
stcTmraInit.u8CountSrc = TMRA_CNT_SRC_SW; // 软件时钟源
stcTmraInit.sw_count.u16CountMode = TMRA_MD_SAWTOOTH; // 锯齿波模式(向上计数)
stcTmraInit.sw_count.u16CountDir = TMRA_DIR_UP; // 向上计数
stcTmraInit.sw_count.u16ClockDiv = u32ClockDiv; // 使用计算后的分频值(修正冲突)
stcTmraInit.u32PeriodValue = TMRA_PWM_PERIOD_VALUE; // 周期值
if (TMRA_Init(TMRA_PWM_UNIT, &stcTmraInit) != LL_OK)
{
FCG_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TMRA4, DISABLE);
return LL_ERR_INVD_PARAM;
}
/* 初始化PWM输出 */
(void)TMRA_PWM_StructInit(&stcPwmInit);
stcPwmInit.u32CompareValue = 0; // 初始比较值
stcPwmInit.u16StartPolarity = TMRA_PWM_HIGH; // 启动时高电平
stcPwmInit.u16StopPolarity = TMRA_PWM_LOW; // 停止时低电平
stcPwmInit.u16CompareMatchPolarity = TMRA_PWM_LOW; // 比较匹配时低电平
stcPwmInit.u16PeriodMatchPolarity = TMRA_PWM_HIGH; // 周期匹配时高电平
if (TMRA_PWM_Init(TMRA_PWM_UNIT, TMRA_PWM_CH, &stcPwmInit) != LL_OK)
{
FCG_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TMRA4, DISABLE);
return LL_ERR_INVD_PARAM;
}
// 使能PWM输出
TMRA_PWM_OutputCmd(TMRA_PWM_UNIT, TMRA_PWM_CH, ENABLE);
return LL_OK;
}
void TMRA_PWM_Start(void)
{
TMRA_Start(TMRA_PWM_UNIT); // 启动定时器
}
/* 占空比设置函数 */
int32_t TMRA_PWM_SetDuty(uint8_t u8Duty)
{
uint32_t u32CompareValue;
// 限制占空比范围(0~100)
if (u8Duty > 100)
{
return LL_ERR_INVD_PARAM;
}
// 核心逻辑:占空比=高电平时间占比 → 100%时高电平,0%时低电平全周期
u32CompareValue = (TMRA_PWM_PERIOD_VALUE * u8Duty) / 100;
TMRA_SetCompareValue(TMRA_PWM_UNIT, TMRA_PWM_CH, u32CompareValue);
return LL_OK;
}
总结
HC32F460 系列微控制器凭借 Timer6、Timer4、TimerA 等模块的协同工作,构建了完整的 PWM 解决方案。其丰富的输出通道、灵活的波形控制、精准的死区调节及可靠的故障保护机制,使其在电机驱动、电源管理等场景中具备显著优势。通过合理配置寄存器和利用硬件特性,工程师可快速实现高性能 PWM 应用,满足不同场景的精度与可靠性需求。
————————————————
版权声明:本文为CSDN博主「时光呀时光慢慢走」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/XdaDC/article/details/150610959
|
|