要使用 HRTIM(高分辨率定时器)输出可变占空比的 PWM,需通过修改比较寄存器(如 CMP1x)实时更新占空比。以下是配置步骤和代码示例(以 STM32 为例):
初始化 HRTIM 基础配置:
PERx 寄存器)。配置 PWM 通道:
OMM = 0,单输出)。POL 位)和空闲状态。DTEN 和 OUTEN)。设定占空比:
CMP1x 控制(如 CMP1A 对应通道 A)。CMP1x = (占空比 × PERx) / 100(占空比百分比)。实时更新占空比:
CMP1x 寄存器的值即可改变占空比。CMP1xUEN 位)。// 1. 初始化 HRTIM 定时器(以 TIMER A 为例)
void MX_HRTIM_Init(void) {
hhrtim.Instance = HRTIM1;
hhrtim.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
HAL_HRTIM_Init(&hhrtim);
// 配置 Timer A
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A,
HRTIM_OUTPUT_ACTIVE_HIGH | HRTIM_OUTPUT_POLARITY_HIGH);
// 设置周期 = 1000 (占空比分辨率)
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A,
HRTIM_TIMEBASE_PERIOD(1000) |
HRTIM_TIMEBASE_CONTINUOUS);
// 初始占空比 50% -> CMP1A = 500
HAL_HRTIM_WaveformCounterConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A,
HRTIM_WAVEFORM_CMP1(500));
// 启动 Timer A
HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TA1);
HAL_HRTIM_TimerStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_A);
}
// 2. 实时修改占空比(如设置为 30%)
void Update_PWM_DutyCycle(uint32_t duty_cycle_percent) {
// 计算 CMP1A 值(周期=1000)
uint32_t cmp_value = (duty_cycle_percent * 1000) / 100;
// 更新比较寄存器(同步模式)
HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].CMP1xR = cmp_value;
// 使能影子寄存器更新
HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].UPDxR = HRTIM_UPD_CMP1;
}PERxR:周期寄存器(PWM 频率)。CMP1xR:比较寄存器 1(控制占空比)。UPDxR:更新寄存器(设置 HRTIM_UPD_CMP1 启用同步更新)。OUTxR:输出控制(使能输出 OUTEN=1)。UPDGATE 设置同步门控)。
? 提示:通过示波器验证 PWM 输出,逐步调试占空比变化是否符合预期。确保计算占空比时无整数溢出。
举报
更多回帖