深入STM32定时器与ADC联动:FOC三电阻采样的时序逻辑全解析
深入STM32定时器与ADC联动:FOC三电阻采样的时序逻辑全解析
在电机控制领域,场定向控制(FOC)算法的实现离不开精确的电流采样。STM32系列微控制器凭借其强大的定时器和ADC外设,成为实现FOC算法的热门选择。本文将深入探讨STM32高级定时器(TIM1)与ADC的协同工作机制,解析三电阻采样中的关键时序逻辑,帮助开发者构建清晰的硬件抽象层认知。
1. FOC三电阻采样的硬件基础
三电阻采样是FOC算法中常用的电流检测方案,通过在电机三相下桥臂串联采样电阻,测量电流流向。这种方案相比单电阻或双电阻采样,具有更高的精度和更简单的硬件设计,但对时序控制的要求也更为严格。
1.1 STM32定时器的高级功能
STM32的高级定时器(如TIM1)为电机控制提供了丰富的功能:
- 中心对齐模式:PWM波形以计数器周期为中心对称,便于生成对称的驱动信号
- 互补输出:可生成带死区时间的互补PWM信号,直接驱动H桥电路
- 刹车功能:在异常情况下快速关闭PWM输出,保护功率器件
- 触发输出:可配置为ADC的外部触发源,实现精准的采样时刻控制
// 定时器基本配置示例 LL_TIM_SetCounterMode(TIM1, LL_TIM_COUNTERMODE_CENTER_DOWN); LL_TIM_OC_SetMode(TIM1, LL_TIM_CHANNEL_CH1, LL_TIM_OCMODE_PWM1); LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1N);1.2 ADC的注入组与外部触发
STM32的ADC模块支持多种采样模式,其中注入组特别适合电机控制应用:
- 外部触发:可由定时器事件精确触发采样
- 中断优先级:注入组转换可打断常规组转换,确保关键采样的实时性
- 多通道序列:可配置采样顺序,优化电流检测流程
提示:在FOC应用中,通常将ADC注入组配置为定时器触发,确保采样时刻与PWM波形严格同步。
2. PWM与ADC的时序协同设计
三电阻采样的核心挑战在于确定合适的采样时刻。理想的采样点应满足以下条件:
- 目标相的下桥臂MOS管完全导通
- 电流波形已稳定(渡过死区时间和振铃阶段)
- 采样时刻避开PWM开关边沿的噪声干扰
2.1 采样时刻的三种典型场景
根据PWM占空比的不同,三电阻采样可分为三种典型场景:
| 场景 | 条件 | 采样位置 | 触发边沿 |
|---|---|---|---|
| 中段采样 | 低占空比 | PWM周期中点 | 上升沿 |
| 前段采样 | 中高占空比 | 下桥臂导通起始 | 上升沿 |
| 后段采样 | 极高占空比 | 下桥臂关断前 | 下降沿 |
2.2 关键时间参数的计算
在代码中,hTafter和hTbefore是两个至关重要的时间参数:
hTafter:死区时间+MOS管开关引起的电流振铃时间
hTafter = \frac{(DEADTIME_{ns} + MAX\_TNTR_{ns}) \times ADV\_TIM\_CLK_{MHz}}{1000}hTbefore:ADC触发延迟+ADC采样保持时间
hTbefore = \frac{(ADC\_TRIG\_CONV\_LATENCY + ADC\_SAMPLING) \times ADV\_TIM\_CLK_{MHz}}{ADC\_CLK_{MHz}} + 1
3. 代码逻辑的深度解析
R3_2_SetADCSampPointSectX函数的核心任务是确定ADC采样时刻的定时器计数值,并配置相应的触发条件。其决策逻辑可分解为以下步骤:
判断是否可采用中段采样:
if ((pHandle->Half_PWMPeriod - lowDuty) > pHandle->pParams_str->hTafter) { // 采用中段采样策略 hCntSmp = pHandle->Half_PWMPeriod - 1; pHandle->_Super.Sector = SECTOR_4; // 固定采样AB相 }无法中段采样时的交叉点搜索:
- 计算占空比差值:
hDeltaDuty = lowDuty - midDuty - 根据差值大小决定采样策略:
if (hDeltaDuty > (pHandle->Half_PWMPeriod - lowDuty) * 2) { // 前段采样策略 hCntSmp = lowDuty - pHandle->pParams_str->hTbefore; } else { // 后段采样策略 hCntSmp = lowDuty + pHandle->pParams_str->hTafter; if (hCntSmp >= pHandle->Half_PWMPeriod) { // 需要切换为下降沿触发 pHandle->ADCTriggerEdge = LL_ADC_INJ_TRIG_EXT_FALLING; hCntSmp = (2 * pHandle->Half_PWMPeriod) - hCntSmp - 1; } }
- 计算占空比差值:
更新定时器寄存器:
return R3_2_WriteTIMRegisters(&pHandle->_Super, hCntSmp);
4. 实际应用中的优化技巧
在工程实践中,以下几点经验值得注意:
- 时钟配置优化:确保定时器时钟和ADC时钟的比值合理,避免采样时刻计算出现舍入误差
- 死区时间校准:根据实际MOS管的开关特性调整hTafter参数
- ADC采样时间:在信号稳定性和转换速度之间取得平衡
- 抗干扰设计:
- 在PCB布局上,采样电阻应尽量靠近MOS管
- 使用差分放大电路提高采样信号的信噪比
- 在软件上可添加数字滤波处理
// 推荐的ADC配置流程 LL_ADC_INJ_StartConversionExtTrig( ADC1, LL_ADC_INJ_TRIG_EXT_RISING, LL_ADC_INJ_SEQ_SCAN_ENABLE );5. 调试与验证方法
当三电阻采样出现问题时,可采用以下方法进行排查:
PWM波形验证:
- 使用示波器检查各相PWM波形是否符合预期
- 确认死区时间设置是否正确
ADC触发时刻检查:
- 通过GPIO输出标记ADC触发时刻
- 对比触发时刻与PWM波形的关系
电流采样数据分析:
- 通过调试接口导出原始采样数据
- 检查采样值是否与预期电流波形一致
注意:在调试过程中,建议先使用较低的PWM频率和母线电压,避免损坏功率器件。
