从采样到控制:深入拆解FOC驱动板上的电流、电压、温度采样电路设计与STM32G4配置
从采样到控制:深入拆解FOC驱动板上的电流、电压、温度采样电路设计与STM32G4配置
在电机控制领域,场定向控制(FOC)技术因其优异的动态性能和效率表现,已成为现代高性能电机驱动的主流方案。然而,FOC系统的性能瓶颈往往不在于算法本身,而在于其前端信号采集的精度与实时性。本文将聚焦STM32G4平台下的FOC系统,深入剖析三电阻电流采样、相电压检测及温度监控等关键模拟前端电路的设计要点,并详解如何利用STM32G4内置的高速ADC、可编程增益运放(PGA)及比较器等外设构建高可靠性的信号采集链路。
1. FOC系统信号采集架构设计
1.1 信号采集在FOC闭环中的核心作用
FOC算法的实现依赖于精确的电机三相电流反馈,这些电流信号经过Clarke/Park变换后,被转换为旋转坐标系下的直轴(id)和交轴(iq)分量。电流采样误差将直接导致:
- 转矩波动:iq分量失真引起输出转矩不平稳
- 效率下降:id分量偏差造成不必要的励磁电流
- 稳定性问题:相位延迟可能导致控制环路振荡
典型FOC系统需要采集的信号类型及精度要求:
| 信号类型 | 典型范围 | 分辨率需求 | 采样速率 |
|---|---|---|---|
| 相电流 | ±20A | 12bit以上 | 20-100kHz |
| 母线电压 | 0-100V | 10bit以上 | 10kHz |
| 温度 | 0-125℃ | 8bit | 1Hz |
1.2 STM32G4的模拟外设优势
STM32G4系列针对电机控制优化的模拟外设组合:
- 4Msps 12-bit ADC:支持三重交替采样模式
- 可编程增益运放(PGA):增益可调(1.5x-64x)
- 高速比较器:响应时间<50ns
- 12-bit DAC:用于参考电压生成
这些外设与Cortex-M4内核的三角函数加速单元(CORDIC)协同工作,可构建完整的硬件信号处理链路。
2. 三电阻电流采样电路设计
2.1 采样拓扑选择与布局要点
三电阻采样方案通过在逆变器下桥臂串联采样电阻实现电流检测,相比单电阻方案具有以下优势:
- 更高的带宽:可捕捉PWM周期内的电流纹波
- 更低的延迟:无需等待特定PWM状态
- 更好的共模抑制:各相独立测量
关键设计考虑因素:
电阻选型:
- 阻值选择:通常50-200mΩ,需平衡信噪比与功耗
- 功率计算:P=I²R,考虑瞬时峰值电流
- 温度系数:<50ppm/℃的金属箔电阻为佳
PCB布局规范:
- 采样电阻采用开尔文连接
- 走线对称布置以减小寄生电感
- 避免功率回路与信号走线平行
2.2 信号调理电路设计
由于采样信号以地电平为中心双向摆动,需要电平移位电路将其适配到ADC输入范围。典型设计采用差分放大结构:
Vout = (Vshunt × Gain) + Vref其中Vref通常设为1.65V(对于3.3V系统)。STM32G4内置PGA可简化此设计:
// STM32G4 PGA配置示例 void PGA_Config(void) { OPAMP_HandleTypeDef hopamp; hopamp.Instance = OPAMP1; hopamp.Init.PowerMode = OPAMP_POWERMODE_NORMAL; hopamp.Init.Mode = OPAMP_PGA_MODE; hopamp.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO0; hopamp.Init.InternalOutput = DISABLE; hopamp.Init.PgaConnect = OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0; hopamp.Init.PgaGain = OPAMP_PGA_GAIN_16_OR_MINUS_15; HAL_OPAMP_Init(&hopamp); HAL_OPAMP_Start(&hopamp); }2.3 同步采样与PWM触发
精确的采样时序对电流重构至关重要。STM32G4的定时器可生成精确的ADC触发信号:
// 高级定时器触发ADC配置 TIM_HandleTypeDef htim1; htim1.Instance = TIM1; htim1.Init.RepetitionCounter = 0; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3; HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 配置ADC注入组由TIM1_TRGO触发 ADC_InjectionConfTypeDef sConfigInjected; sConfigInjected.InjectedNbrOfConversion = 3; sConfigInjected.InjectedTrigger = ADC_INJECTED_SOURCE_TRGI; sConfigInjected.AutoInjectedConv = DISABLE; sConfigInjected.InjectedDiscontinuousConvMode = DISABLE; HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);提示:中心对齐PWM模式配合ADC在计数器峰值/谷值触发采样,可有效避免开关噪声干扰。
3. 电压与温度采样电路实现
3.1 母线电压分压网络设计
母线电压采样需考虑:
- 分压比计算:确保最大输入时ADC不饱和
- 动态响应:RC时间常数需小于控制周期
- 安全隔离:高压侧使用0805及以上尺寸电阻
推荐电路参数:
Vbus = 100V max 分压比 = R2/(R1+R2) = 3.3V/100V = 0.033 取R1=300kΩ, R2=10.2kΩ3.2 温度监测方案对比
常见温度传感方案特性对比:
| 类型 | 精度 | 线性度 | 接口 | 成本 |
|---|---|---|---|---|
| NTC热敏电阻 | ±1℃ | 差 | 模拟 | 低 |
| PTC热敏电阻 | ±2℃ | 中 | 模拟 | 中 |
| 数字传感器 | ±0.5℃ | 优 | I2C/SPI | 高 |
NTC热敏电阻的线性化处理代码示例:
float NTC_GetTemperature(float adc_value) { const float B = 3950.0; // B值 const float R25 = 10000.0; // 25℃阻值 float Vntc = adc_value * 3.3f / 4095.0f; float Rntc = 10e3 * Vntc / (3.3f - Vntc); // 分压电阻10k float steinhart; steinhart = Rntc / R25; // (R/Ro) steinhart = log(steinhart); // ln(R/Ro) steinhart /= B; // 1/B * ln(R/Ro) steinhart += 1.0 / (25.0 + 273.15); // + 1/To steinhart = 1.0 / steinhart; // 倒数 steinhart -= 273.15; // 转换为℃ return steinhart; }4. 系统集成与性能优化
4.1 采样时序同步设计
FOC系统需要严格协调以下时序:
- PWM载波周期
- ADC采样时刻
- 电流重构算法执行
- 新PWM占空比更新
推荐的时间序列:
PWM周期开始 ↑ └─ 50% PWM周期时触发ADC采样 └─ ADC完成中断中执行Clarke/Park变换 └─ 计算新占空比 └─ 下次PWM周期更新占空比4.2 噪声抑制实践技巧
硬件措施:
- 在采样电阻两端并联100pF-1nF电容
- 采用星型接地分离功率地与信号地
- 使用屏蔽双绞线连接传感器
软件处理:
- 滑动平均滤波:适用于低速信号
- 中值滤波:消除突发干扰
- 卡尔曼滤波:最优估计动态信号
ADC采样噪声抑制代码示例:
#define FILTER_DEPTH 8 typedef struct { float buf[FILTER_DEPTH]; uint8_t index; } MovingAverageFilter; float MAF_Update(MovingAverageFilter* filter, float new_sample) { filter->buf[filter->index] = new_sample; filter->index = (filter->index + 1) % FILTER_DEPTH; float sum = 0; for(int i=0; i<FILTER_DEPTH; i++) { sum += filter->buf[i]; } return sum / FILTER_DEPTH; }4.3 校准流程与误差补偿
系统级校准步骤:
零点校准:
- 电机静止状态下采集ADC偏移
- 存储到NVM作为基础补偿值
增益校准:
- 施加已知负载电流
- 调整放大倍数使读数匹配
温度补偿:
- 建立温度-漂移特性曲线
- 实时校正采样值
校准参数存储结构示例:
typedef struct { float current_offset[3]; // 三相电流零点 float current_gain[3]; // 电流增益系数 float voltage_gain; // 电压分压比修正 float ntc_beta; // 热敏电阻B值 } CalibrationParams;在实际项目中,我们发现信号链中1%的增益误差会导致FOC系统在高速运行时产生约5%的转矩脉动。通过引入周期性自动校准机制,可将长期稳定性提升至0.5%以内。
