前置条件:STM32G474,170MHz(HSE),定时器使能如图所示
Master Timer
Time Base Setting
PrecalerRatio
用于设置定时器分频
Period
设置定时器周期,至少为三个HRTIM时钟周期。
RepetitionCounter
重复周期计数器 用途未知。
Mode
貌似都是continuous mode 后面再说
Timing Unit
杂记
Preload
STM32 定时器的 Preload 功能是一种非常有用的特性,它允许在不影响当前计时周期的情况下,预先设置定时器的自动重装载寄存器(ARR)或比较寄存器(比如捕获/比较寄存器 CCR)。这个功能在生成精确的时间延迟或测量时间间隔,以及在PWM(脉冲宽度调制)输出时控制波形的具体形状时非常有用。
使用场景
- PWM波形生成:在PWM应用中,经常需要调整周期或占空比来控制电机速度、LED亮度等。使用preload功能,可以在当前周期结束前预设下一周期的参数,这样可以避免在周期中间更改参数可能导致的突然跳变或不稳定现象。
- 时间控制:在需要精确控制时间间隔的应用中,比如通信协议的实现,可以通过预装载ARR来准确设置时间间隔,确保通信的准确性和稳定性。
工作原理
- 自动重装载寄存器(ARR)Preload:当ARR preload功能被启用时,对ARR寄存器的更新不会立即生效,而是在当前计数周期结束时自动更新。这保证了计时周期的稳定性和准确性。
- 捕获/比较寄存器(CCR)Preload:对于CCR,preload功能同样允许在不干扰当前输出状态的情况下更新其值。在PWM模式下,这可以用来平滑地调整占空比。
实现步骤
- 配置TIMx_CR1的ARPE位:通过设置TIMx的控制寄存器CR1中的ARPE位(自动重装载预装载使能),可以启用ARR的preload功能。
- 配置TIMx_CCMRx的OCxPE位:对于CCR的preload功能,需要在TIMx的捕获/比较模式寄存器CCMRx中设置OCxPE位(输出比较x预装载使能)。
- 加载新值:将新的周期值写入ARR或新的比较值写入CCR。
- 更新请求:通常,需要一个更新事件(如计数器溢出)来使预装载的值生效。在某些模式下,可以通过软件生成一个立即更新的事件。
Repetition Update
STM32G474微控制器的高分辨率定时器(HRTIM)是一个高级功能,旨在满足精确的定时和波形生成需求。其中的“Repetition Update”功能是该定时器的一个重要特性。
“Repetition Update”的主要作用是控制何时更新定时器的寄存器。在HRTIM中,有一些寄存器是受保护的,这意味着在定时器运行时,这些寄存器的值不能随意改变,以避免产生不稳定的输出波形或是不准确的定时行为。因此,“Repetition Update”允许用户设定一个重复计数器,指定定时器完成多少周期后才更新这些寄存器的内容。
使用“Repetition Update”功能的优势包括:
- 增强稳定性:通过在适当的时机更新寄存器值,可以避免在输出周期中间改变设置,从而保持输出波形的稳定。
- 提高灵活性:用户可以根据需要配置更新频率,这对于需要频繁调整输出波形或定时参数的应用非常有用。
- 优化性能:在特定的应用中,如电机控制,可以通过精确地调整更新频率来优化系统的响应时间和效率。
在实际应用中,如果需要定时器在不同的输出周期内实现不同的行为,或者根据外部事件调整定时器的行为,这时“Repetition Update”就显得尤为重要。例如,在PWM(脉冲宽度调制)应用中,可能需要在不同的PWM周期中应用不同的占空比设置,而这些设置的更新就可以依赖于“Repetition Update”功能来实现定时和同步更新。
by the way
没太看懂,但是大家都加上了我也加上吧()
HRTIM中心对齐PWM
使用Master同步两个定时器(Timer A和Timer B),两个子定时器只有一个输出(TA1/TB1)。
如果不同步的后果
HAL_HRTIM_WaveformCountStart(&hhrtim1,HRTIM_TIMERID_TIMER_A);
HAL_HRTIM_WaveformOutputStart(&hhrtim1,HRTIM_OUTPUT_TA1);
HAL_HRTIM_WaveformCountStart(&hhrtim1, HRTIM_TIMERID_TIMER_B);
HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TB1);
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 200);
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, 200);
这么写的后果是在示波器上两个PWM输出端会发生相移,不是预期中的两个PWM波的起点是相同的。byd照片没了,艹
如果你不用主定时器去同步的话,请在Start初始化的时候一起初始化,譬如:
HAL_HRTIM_WaveformCountStart(&hhrtim1,HRTIM_TIMERID_TIMER_A | HRTIM_TIMERID_TIMER_B);
HAL_HRTIM_WaveformOutputStart(&hhrtim1,HRTIM_OUTPUT_TA1 | HRTIM_OUTPUT_TB1);
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 200);
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, 200);
这样的话就能看见两个一模一样的PWM波形了。
问题
尝试使用Up-Down Countering去生成中心对齐PWM,示波器上能看见周期翻倍了,但是Duty被锁死在了0.5,问题可复现,尚未有解决方案。
配置过程
Master 定时器
后面都是disable,开了PreLoad和重复更新
这里跟着CSDN配置的,开了中断源,NVIC也开中断了,但是我没用中断输出,我直接
HAL_HRTIM_WaveformCountStart(&hhrtim1,HRTIM_TIMERID_Master);
实测无影响。但是没测试过关了之后什么样,有时间再说
TimerA
子定时器如果想用Master去做同步更新,就要在 Reset Trigger Source里面选上跟随Master周期更新,开了两个比较的单元,没用2的原因是貌似跟ADC有关,然后3和1又是一样的就直接用3了。
这里TimerA是用来生成中心对齐PWM波形的,TimerB是生成了一个正常的PWM波形,用来和中心对齐的波形进行对比
Set Source是选了Counting到比较单元1的值之后再变成高电平,Reset Source则是在每个周期的开始和计数到比较单元3之后波形变成低电平。
实际波形图