1. 项目概述
1.1 核心需求解析
在电机FOC(磁场定向控制)系统中,电流采样的精确性和实时性直接决定了控制性能。传统软件触发ADC采样存在两个致命缺陷:一是采样时刻与PWM波形不同步,容易捕获到MOSFET开关瞬间的电流噪声;二是软件触发存在不可预测的中断延迟,导致采样时刻抖动。这两个问题都会导致电流环控制性能下降,表现为电机震动、噪音甚至失控。
本项目基于STM32G431微控制器,构建了一套完整的PWM硬件触发ADC同步采样方案。核心创新点在于利用TIM1_CH4比较事件直接触发ADC1注入组采样,实现了从PWM波形生成到电流采样的全硬件链路。这种设计带来了三个显著优势:
- 采样时刻精确可控:通过设置TIM1_CCR4寄存器,可以将采样点精确放置在PWM周期中电流最稳定的"采样窗口"内
- 零软件延迟:从触发到采样的全过程由硬件自动完成,不受中断响应时间影响
- 抗干扰能力强:完美避开MOSFET开关瞬间的电流尖峰和振铃噪声
1.2 技术方案选型
在STM32系列中实现PWM触发ADC有多种方案可选,我们最终选择了"TIM1中心对齐PWM + CCR4触发ADC1注入组"的组合,主要基于以下考量:
- 资源独立性:TIM1_CH4通道不用于PWM输出,专门用于产生内部触发事件,不会影响三相PWM波形质量
- 时序精确性:CCR4寄存器可以精确到1个时钟周期(6.25ns @160MHz)的精度设置触发时刻
- 硬件直连:TIM1与ADC1同属高级外设,触发路径最短,相位同步性最好
- 灵活性:注入组可以中断或DMA方式读取数据,适合不同实时性要求的场景
相比其他方案(如使用TRGO触发规则组),该方案在FOC应用中具有明显优势。实测表明,在10kHz PWM频率下,采样时刻抖动小于10ns,完全满足高性能电机控制需求。
2. 硬件设计与配置
2.1 硬件平台搭建
实验采用ST官方推出的NUCLEO-G431RB开发板搭配X-NUCLEO-IHM16M1电机驱动板,构成完整的电机控制开发平台。关键硬件配置如下:
- 主控芯片:STM32G431RBT6(Cortex-M4内核,主频170MHz)
- PWM定时器:TIM1高级定时器(6路互补PWM输出,带死区控制)
- ADC模块:12位ADC1和ADC2,支持硬件触发注入组采样
- 电流检测:三电阻采样架构,通过内部OPAMP放大后送入ADC
- 通信接口:LPUART1虚拟串口,用于与上位机VOFA+通信
硬件连接采用Arduino接口堆叠方式,确保信号完整性。特别需要注意的是,PB0、PB1和PA1三个ADC输入引脚需要配置为模拟输入模式,并确保走线远离高频PWM信号以减少干扰。
2.2 时钟树配置
精确的时钟配置是保证PWM和ADC同步工作的基础。我们采用以下时钟配置方案:
- 外部晶振:24MHz(HSE)
- 主PLL配置:
- PLLM = 3(分频系数)
- PLLN = 40(倍频系数)
- PLLP = 2(系统时钟分频)
- 输出频率:24MHz × 40 / 3 / 2 = 160MHz
- 外设时钟:
- APB1/APB2时钟:160MHz(无分频)
- ADC时钟:同步时钟模式,4分频(40MHz)
这种配置下,TIM1计数器每个时钟周期为6.25ns,可以实现非常精细的PWM和触发时刻控制。ADC时钟40MHz也保证了采样速率和精度的平衡。
3. 软件实现细节
3.1 CubeMX工程配置
3.1.1 TIM1配置
TIM1作为PWM生成和ADC触发的核心,需要精心配置以下参数:
-
基本参数:
- 时钟源:内部时钟(160MHz)
- 计数模式:中心对齐模式1(先向上后向下计数)
- 预分频器:0(不分频)
- 自动重装载值:7999(对应10kHz PWM频率)
- 重复计数器:0
-
通道配置:
- CH1/CH2/CH3:PWM模式1,互补输出使能
- CH4:PWM模式1,无输出,CCR4=4000(中点触发)
- 死区时间:50个时钟周期(约300ns)
-
触发输出:
- 触发事件选择:OC4REF(CH4比较事件)
- 从模式:禁用
关键点在于将CH4配置为不输出PWM波形,仅用于在计数器达到CCR4值时产生内部触发事件。通过将CCR4设置为ARR值的一半(4000),可以确保在PWM周期的中点触发ADC采样。
3.1.2 ADC1配置
ADC1注入组需要配置为外部触发模式,主要参数如下:
-
基本参数:
- 时钟预分频:同步时钟4分频(40MHz)
- 分辨率:12位
- 数据对齐:右对齐
- 扫描模式:使能
- 连续转换模式:禁用
-
注入组配置:
- 外部触发源:TIM1_CH4事件
- 触发边沿:上升沿
- 转换次数:3(对应三相电流)
- 采样时间:6.5个时钟周期(约160ns)
-
通道映射:
- Rank1:通道2(PA1,I_U)
- Rank2:通道12(PB1,I_V)
- Rank3:通道15(PB0,I_W)
特别注意要启用ADC1的DMA功能,以便自动将转换结果传输到内存数组。DMA应配置为循环模式,确保不会丢失任何采样数据。
3.2 关键代码实现
3.2.1 PWM初始化
c复制void init_TIM1_PWM(void)
{
// 启动TIM1基础计数器和各PWM通道
HAL_TIM_Base_Start(&htim1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
// 启动互补通道
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
// 设置初始占空比(20%,40%,50%)
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, 800);
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, 1600);
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, 2000);
// 设置CH4比较值(PWM周期中点)
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_4, 4000);
}
3.2.2 ADC初始化
c复制void init_ADC1_Injected(void)
{
// 启动TIM1_CH4用于产生ADC触发事件
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
// ADC校准
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK) {
Error_Handler();
}
// 启动ADC1注入组(外部触发+中断方式)
if (HAL_ADCEx_InjectedStart_IT(&hadc1) != HAL_OK) {
Error_Handler();
}
// 使能注入转换完成中断
__HAL_ADC_ENABLE_IT(&hadc1, ADC_IT_JEOC);
}
3.2.3 ADC中断回调
c复制// ADC注入组转换完成回调函数
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
{
if (hadc->Instance == ADC1) {
// 读取三相电流采样值
adc1_iu = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_1);
adc1_iv = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_2);
adc1_iw = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_3);
// 设置数据就绪标志
adc1_inj_ready = 1;
}
}
4. 调试与优化
4.1 采样时刻校准
精确的采样时刻对电流测量至关重要。调试时可以采用以下方法校准:
- 使用示波器同时观察PWM波形和ADC触发信号(如LED翻转信号)
- 逐步调整CCR4值,观察采样值的变化
- 找到电流最稳定的"采样窗口",通常位于PWM周期中点附近
- 最终确定CCR4 = 4000(ARR=8000时),对应PWM周期中点
实测发现,将采样点设置在PWM周期中点偏后约100ns(CCR4=4016)可以获得最稳定的电流采样值。
4.2 抗干扰措施
高频PWM环境下的ADC采样容易受到干扰,我们采取了以下措施:
-
PCB布局:
- 电流检测电阻靠近MOSFET放置
- 模拟走线与功率走线分开布局
- 使用星型接地降低地弹噪声
-
软件滤波:
- 在ADC输入端添加RC滤波(1kΩ+100nF)
- 采用滑动平均滤波处理采样数据
- 在Clarke变换前进行数据有效性检查
-
时序优化:
- 确保ADC采样时间(6.5周期)覆盖信号稳定时间
- 避免在PWM切换时刻附近采样
4.3 性能测试
通过VOFA+工具可以直观观察电流采样波形。测试指标包括:
- 采样同步性:三相电流采样时刻偏差小于50ns
- 采样精度:12位ADC实际有效位达到10.5位
- 实时性:从PWM触发到DMA数据就绪总延迟小于1μs
- 抖动:采样周期抖动小于10ns
测试结果表明,该方案完全满足10kHz PWM频率下的FOC控制需求,电流环带宽可达2kHz以上。
5. 应用扩展
5.1 单电阻采样方案
虽然本文采用三电阻采样方案,但该触发机制同样适用于单电阻采样。只需做以下调整:
- 在PWM周期内设置多个触发点(通常3-5个)
- 通过不同触发点采集不同相电流
- 在软件中重构三相电流波形
关键点在于确保每个相电流都能在有效窗口内被采样到,这需要精心设计PWM模式和触发时序。
5.2 与其他外设的协同
该触发机制可以扩展到其他应用场景:
- 与DAC协同:实时输出电流环控制信号用于监控
- 与比较器协同:实现硬件过流保护
- 与HRTIM协同:用于更高频率的PWM生成和采样
特别是STM32G4系列的高分辨率定时器(HRTIM)与ADC的协同,可以实现ns级的精确采样控制。
5.3 在无感FOC中的应用
在无传感器FOC中,该采样方案可以用于:
- 反电动势检测:在PWM关断期间采样电机中性点电压
- 高频注入:同步采样高频响应电流
- 初始位置检测:分析电流响应确定转子位置
这些应用都需要精确控制采样时刻,本文的硬件触发方案提供了理想的基础。