TIM 开发参考
本文档深入介绍 TIM 定时器的高级特性和复杂配置场景,是 TIM 配置教程 的进阶补充。
高级定时器特性
高级定时器(如 TIM1、TIM8)在通用定时器基础上增加了以下特性,主要面向电机控制和电源转换应用。
互补输出与死区插入
互补输出提供一对极性相反的 PWM 信号(CHx 和 CHxN),常用于驱动 H 桥电路。
// 互补输出配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
// 死区时间配置 (DTS = 定时器时钟 / 死区分频)
TIM_BDTRInitStructure.TIM_DeadTime = 100; // 100 × DTS
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
刹车功能
刹车功能在检测到外部故障信号时立即关闭 PWM 输出,保护电路:
| 刹车源 | 说明 |
|---|---|
| BRK 引脚 | 外部刹车输入 |
| 时钟失效 | CSS 检测到 HSE 失效 |
| PVD | 可编程电压检测器 |
| 内核锁定 | 调试模式下的自动刹车 |
// 刹车配置参数
Break: {
label: 'Break Function',
type: 'checkbox',
value: false,
visible: '@get: isAdvancedTimer()'
},
BreakPolarity: {
label: 'Break Polarity',
type: 'select',
value: 'high',
visible: '@get: Break === true',
options: [
{ label: 'Active High', value: 'high' },
{ label: 'Active Low', value: 'low' }
]
},
AutomaticOutput: {
label: 'Automatic Output State',
type: 'select',
value: 'enable',
visible: '@get: Break === true',
options: [
{ label: 'Enable (MOE auto-recovery)', value: 'enable' },
{ label: 'Disable', value: 'disable' }
]
}
重复计数器
重复计数器用于在高级定时器中控制更新事件的频率:
更新事件频率 = 定时器溢出频率 / (重复计数值 + 1)
例如:PWM 频率 10kHz,重复计数 = 2 → 更新事件 = 10kHz / 3 ≈ 3.33kHz
编码器接口模式
编码器模式用于读取正交编码器的位置和方向:
// 编码器配置
EncoderMode: {
label: 'Encoder Mode',
type: 'select',
value: 'disable',
options: [
{ label: 'Disable', value: 'disable' },
{ label: 'Encoder Mode 1 (TI1+TI2)', value: 'mode1' },
{ label: 'Encoder Mode 2 (TI1 only)', value: 'mode2' },
{ label: 'Encoder Mode 3 (TI2 only)', value: 'mode3' }
]
}
编码器模式选择
| 模式 | 计数方式 | 适用场景 |
|---|---|---|
| Mode 1 | TI1 和 TI2 双边沿计数 (4× 分辨率) | 高精度位置测量 |
| Mode 2 | 仅 TI1 边沿计数 | 单相编码器 |
| Mode 3 | 仅 TI2 边沿计数 | 单相编码器 |
定时器同步
多个定时器可以级联或同步工作:
主从模式
// 主定时器配置
MasterMode: {
label: 'Master Mode',
type: 'select',
value: 'disable',
options: [
{ label: 'Disable', value: 'disable' },
{ label: 'Update (TRGO)', value: 'update' },
{ label: 'OC1REF (TRGO)', value: 'oc1ref' },
{ label: 'Enable (TRGO)', value: 'enable' }
]
}
// 从定时器配置
SlaveMode: {
label: 'Slave Mode',
type: 'select',
value: 'disable',
options: [
{ label: 'Disable', value: 'disable' },
{ label: 'Reset Mode', value: 'reset' },
{ label: 'Gated Mode', value: 'gated' },
{ label: 'Trigger Mode', value: 'trigger' },
{ label: 'External Clock Mode 1', value: 'ext1' }
]
}
TriggerSource: {
label: 'Trigger Source',
type: 'select',
value: 'itrx0',
visible: '@get: SlaveMode !== "disable"',
options: [
{ label: 'ITR0 (TIM1)', value: 'itrx0' },
{ label: 'ITR1 (TIM2)', value: 'itrx1' },
{ label: 'ITR2 (TIM3)', value: 'itrx2' },
{ label: 'TI1 Edge Detector', value: 'ti1' },
{ label: 'TI1 Filtered', value: 'ti1fp1' },
{ label: 'TI2 Filtered', value: 'ti2fp2' }
]
}
同步应用示例
级联 32 位计数器:TIM2(主)→ TIM3(从),TIM3 在 TIM2 溢出时计数一次。
TIM2: Prescaler=71, Period=65535 → 1MHz → 65ms 溢出周期
TIM3: Slave Mode=External Clock Mode 1, Trigger=ITR1
→ 每次 TIM2 溢出,TIM3 计数 +1
→ 最大计数 = 65535 × 65536 = 约 71 分钟
DMA 突发模式
定时器支持 DMA 突发传输,一次 DMA 请求可以更新多个寄存器:
// DMA 突发配置
DMABurstLength: {
label: 'DMA Burst Length',
type: 'select',
value: '1',
visible: '@get: DMAEnable === true',
options: [
{ label: '1 Transfer', value: '1' },
{ label: '2 Transfers', value: '2' },
{ label: '3 Transfers', value: '3' },
// ... 最多 18 次传输
]
}
定时器寄存器影子更新
定时器的部分寄存器支持影子更新机制,写入的值在更新事件(UEV)发生时才生效:
| 寄存器 | 影子更新 | 说明 |
|---|---|---|
| PSC | ✅ | 预分频器值 |
| ARR | ✅ | 自动重载值 |
| CCRx | ✅ | 捕获/比较值 |
| RCR | ✅ | 重复计数值(高级定时器) |
可以通过 ARPE(自动重载预装载使能)位控制 ARR 的影子更新行为。
最佳实践
- 时基先行:先确认总线时钟频率,再计算 Prescaler 和 Period
- PWM 分辨率:高频 PWM 需折中分辨率(高频 = 低分辨率)
- 互补输出:务必设置死区时间,防止上下桥臂同时导通
- 刹车保护:电机控制应用必须启用刹车功能
- 编码器滤波:使用输入滤波器消除编码器信号抖动
