2、STM32生态系统与电机控制专用外设:STM32G4系列介绍,定时器高级功能(互补PWM、刹车、死区插入),ADC触发与注入模式
做电机控制这些年,我接触过不少MCU平台。但说实话,ST的STM32G4系列,是我个人觉得在电机FOC控制上最“顺手”的一个系列。为什么?因为它把电机控制需要的那些“硬核”外设,几乎都集成到芯片里了。你不需要在外围搭一堆逻辑电路,一个芯片就能搞定大部分事情。
这一章,我们就来拆解一下G4系列里,跟电机控制最相关的几个核心外设:高级定时器、ADC触发与注入模式。这些东西,说白了就是FOC算法的“手脚”和“眼睛”。
2.1 STM32G4:为电机控制而生的“特种兵”
STM32G4系列,是ST专门针对数字电源和电机控制推出的产品线。它基于ARM Cortex-M4内核,带FPU(浮点运算单元),主频最高能到170MHz。这个性能,跑FOC的电流环和速度环,绰绰有余。
我最早用G4做项目时,最直观的感受就是:它的定时器和ADC配合得太默契了。你不用像以前那样,费劲心思去对齐PWM和采样时刻。硬件自己就帮你搞定了。
核心亮点速览:
- 内核: Cortex-M4 FPU,170MHz,支持单周期乘加运算(MAC),适合跑复杂的矢量变换(Clark/Park)。
- 高级定时器(HRTIM/高级TIM): 可以生成高达6对互补PWM,支持死区插入、刹车、故障保护。
- ADC: 12位,最高5Msps,支持硬件过采样和注入模式,可以精确地在PWM中点采样电流。
- 运放与比较器(OPAMP/COMP): 内部集成,可以直接放大采样电阻上的微弱电流信号,省掉外部运放。
- CORDIC与FMAC: 硬件加速三角运算和滤波,跑FOC的三角函数和PI调节器,基本不占CPU时间。
你看,这些外设几乎就是为FOC量身定做的。尤其是那个CORDIC,我刚开始用的时候还不太习惯,后来发现算sin/cos比软件快了一个数量级,真香。
2.2 高级定时器:FOC的“心脏”与“节拍器”
电机控制里,PWM波就是驱动电机的“指令”。而高级定时器,就是生成这些指令的核心。G4的高级定时器(比如TIM1、TIM8、TIM15-TIM17),功能非常强大。我们重点讲三个:互补PWM、死区插入、刹车功能。
2.2.1 互补PWM与死区插入
驱动三相电机,通常需要6个MOS管组成三个半桥。每个半桥的上下两个MOS管,需要一对互补的PWM信号来控制。而且,这两个信号之间必须有一个“死区时间”,防止上下管直通短路。
G4的高级定时器,可以直接输出互补的PWM,并且硬件自动插入死区。你只需要在寄存器里设置死区时间,比如100ns,硬件就会在上下管切换时,自动插入这段延迟。
我的经验: 死区时间不是越大越好。太大了,电流波形会失真,电机噪音大,效率低。太小了,又容易炸MOS管。我一般根据MOS管的关断延迟时间,留出20%-30%的余量。比如MOS管关断延迟是50ns,我会设到65-70ns。具体还得上示波器看波形,调到最佳。
下面是一个配置互补PWM和死区的基本代码片段(基于STM32CubeMX生成的HAL库):
// 假设使用TIM1,通道1输出互补PWM
// 死区时间设置为100ns(假设定时器时钟为170MHz,即Tclk=5.88ns)
// 死区时间寄存器DTG = 100ns / 5.88ns ≈ 17
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 17; // 死区时间
sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.BreakFilter = 0;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
2.2.2 刹车功能(Break Function)
电机控制中,最怕的就是“炸机”。比如电流过流、母线过压、或者MOS管直通。这时候,需要立刻关断所有PWM输出,保护硬件。
G4的刹车功能,就是干这个的。你可以配置一个外部引脚(比如BKIN引脚)作为刹车输入。当这个引脚检测到高电平(或低电平,可配置)时,定时器会立即将PWM输出强制置为安全状态(比如所有输出为低,或者高阻态)。
这个反应速度是硬件级别的,比CPU中断快得多。我有个项目,曾经因为电机堵转导致电流飙升,就是靠刹车功能在几微秒内关断了PWM,保住了驱动板。要是靠软件中断,估计MOS管已经冒烟了。
避坑指南: 刹车功能虽然好用,但配置时一定要注意极性。我曾经在一个项目里,把刹车极性配反了,结果一上电,刹车信号一直有效,PWM死活出不来。查了半天才发现是极性搞反了。所以,建议你在调试阶段,先用示波器确认刹车引脚的电平状态。
2.3 ADC触发与注入模式:精准的“电流之眼”
FOC控制的核心,是精确采样三相电流。而采样的时机,非常讲究。通常,我们会在PWM的中间点(即计数器的中心值)进行采样。因为此时,电流纹波最小,采样值最接近真实值。
G4的ADC,支持由定时器硬件触发启动转换。这意味着,你不需要用CPU中断去启动ADC,硬件会自动在PWM的特定时刻开始采样。这大大降低了软件延迟和抖动。
2.3.1 定时器触发ADC
配置起来很简单:将定时器的TRGO(触发输出)事件,连接到ADC的触发输入。比如,设置定时器在更新事件(计数器溢出)或比较事件(计数器等于某个值)时,产生TRGO信号。
我一般习惯用定时器的“中心对齐模式”,并在计数器等于0的时刻触发ADC。这样,采样点正好在PWM周期的正中间。
// 配置TIM1的TRGO为更新事件
htim1.Instance->CR2 |= TIM_CR2_MMS_1; // 选择更新事件作为TRGO
// 配置ADC1的触发源为TIM1的TRGO
hadc1.Instance->CFGR |= (ADC_CFGR_EXTEN_0 | ADC_CFGR_EXTSEL_0); // 选择TIM1 TRGO作为触发源
2.3.2 注入模式:让采样更灵活
常规的ADC转换,是按顺序扫描所有通道。但有时候,我们需要“插队”采样一些紧急信号,比如母线电压、温度等。这时候,注入模式就派上用场了。
注入模式允许你在常规转换的间隙,插入一个更高优先级的转换序列。而且,注入转换的结果可以存储在独立的寄存器中,不会干扰常规转换的数据。
举个例子:你正在用常规组连续采样三相电流,突然想采样一下母线电压。如果用常规模式,你得等当前序列转换完,再重新配置。而用注入模式,你可以配置一个注入组,包含母线电压通道。当需要采样时,软件触发一下注入转换,硬件就会在下一个空闲时刻,插入这个采样,并把结果存到注入数据寄存器里。
实用场景: 在FOC控制中,我通常用常规组来采样三相电流(Ia, Ib, Ic),用注入组来采样母线电压(Vbus)和电机温度。这样,电流环的采样不受影响,而电压和温度数据可以按需获取,非常灵活。
2.4 知识体系总览:一张图看懂G4电机控制外设
下面这张图,是我自己总结的G4电机控制外设的协作关系。你可以看到,高级定时器是“大脑”,负责生成PWM和触发信号;ADC是“眼睛”,负责采样电流和电压;而CPU则负责运行FOC算法,协调一切。
2.5 本章小结
这一章,我们重点看了STM32G4系列在电机控制上的几个关键外设:高级定时器的互补PWM、死区插入、刹车功能,以及ADC的定时器触发和注入模式。这些东西,是FOC算法能够高效、稳定运行的基础。
我个人觉得,G4系列最大的优势,就是把这些外设的协同工作做到了极致。你不需要在软件里做太多“对齐”工作,硬件自己就能搞定。这让我们工程师,可以把更多精力放在算法优化和控制策略上。