用GD32E230的ADC注入通道搞定无刷电机相电流采样(附完整代码)
2026/6/5 13:14:44 网站建设 项目流程

基于GD32E230 ADC注入通道的无刷电机相电流采样实战解析

在无刷电机(BLDC)控制系统中,相电流采样是闭环控制的核心环节。传统采样方法常面临PWM开关噪声干扰、采样时机不精确等问题,而GD32E230微控制器提供的ADC注入通道功能,为这一难题提供了优雅的解决方案。本文将深入探讨如何利用定时器触发ADC注入通道,在PWM高电平期间实现三相电流的精确采样。

1. 注入通道与规则通道的本质区别

ADC注入通道是嵌入式系统中常被忽视的高级功能,它与规则通道的主要差异体现在三个方面:

  1. 优先级机制:注入通道可以打断正在进行的规则通道转换,确保关键信号的实时采集
  2. 触发灵活性:支持独立的外部触发源,特别适合与定时器PWM信号同步
  3. 数据存储:拥有专用的数据寄存器组,避免与规则通道数据冲突

在无刷电机控制场景中,这些特性恰好解决了三个核心痛点:

  • PWM周期中仅有高电平阶段能反映真实相电流
  • 三相电流需要严格同步采样
  • 电流环控制对采样实时性要求极高

提示:注入通道的转换序列长度可配置为1-4个通道,正好匹配三相电流+直流母线电流的典型采样需求

2. 硬件架构设计要点

2.1 电流检测电路设计

相电流采样通常采用三种方案:

方案类型优点缺点适用场景
低侧采样电路简单无法检测PWM OFF状态电流低成本方案
高侧采样全周期可测需要高共模放大器高性能驱动
相电流采样直接反映绕组电流需要隔离运放精确控制

推荐电路参数配置:

// 电流传感器接口电路典型值 #define SHUNT_RESISTOR 0.005f // 5mΩ采样电阻 #define OP_AMP_GAIN 20.0f // 运放增益 #define VOLTAGE_REF 3.3f // ADC参考电压

2.2 GD32E230外设互联配置

关键外设需要协同工作:

  1. 定时器:产生PWM信号并配置触发事件
  2. ADC:设置注入通道转换序列
  3. DMA(可选):减轻CPU中断负担

外设时钟配置示例:

void RCU_Configuration(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_ADC); rcu_periph_clock_enable(RCU_TIMER1); rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6); }

3. 软件实现关键步骤

3.1 定时器触发配置

定时器需要产生两个关键信号:

  • PWM输出驱动MOSFET
  • 触发事件启动ADC采样

PWM与触发时序关系:

PWM周期 (100kHz示例) |-------|_______| ↑ ↑ PWM上升沿 触发点(50%占空比)

定时器配置代码片段:

void TIMER_Config(void) { timer_oc_parameter_struct oc_initpara; timer_parameter_struct timer_initpara; timer_initpara.prescaler = 71; // 72MHz/(71+1)=1MHz timer_initpara.period = 9; // 1MHz/10=100kHz timer_init(TIMER1, &timer_initpara); oc_initpara.ocpolarity = TIMER_OC_POLARITY_HIGH; oc_initpara.outputstate = TIMER_CCX_ENABLE; timer_channel_output_config(TIMER1, TIMER_CH_0, &oc_initpara); timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_0, 5); timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_PWM0); // 配置TRGO触发源 timer_master_output_trigger_source_select(TIMER1, TIMER_TRI_OUT_SRC_OC0); }

3.2 ADC注入通道初始化

注入通道配置需要注意四个要点:

  1. 触发源选择与定时器匹配
  2. 通道采样时间设置
  3. 中断优先级配置
  4. 数据对齐方式

典型配置流程:

void ADC_Config(void) { adc_special_function_config(ADC_SCAN_MODE, ENABLE); adc_external_trigger_source_config(ADC_INSERTED_CHANNEL, ADC_EXTTRIG_INSERTED_T1_TRGO); // 配置4个注入通道 adc_channel_length_config(ADC_INSERTED_CHANNEL, 4); adc_inserted_channel_config(0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); adc_inserted_channel_config(1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5); adc_inserted_channel_config(2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5); adc_inserted_channel_config(3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); adc_external_trigger_config(ADC_INSERTED_CHANNEL, ENABLE); adc_interrupt_enable(ADC_INT_EOIC); nvic_irq_enable(ADC_CMP_IRQn, 1, 0); }

3.3 中断服务程序优化

电流采样中断需要特别考虑:

  • 执行时间尽量短
  • 避免浮点运算
  • 数据缓冲处理

优化后的中断服务例程:

__IO uint16_t ADC_Values[4]; __IO uint8_t ADC_Ready = 0; void ADC_CMP_IRQHandler(void) { adc_interrupt_flag_clear(ADC_INT_EOIC); ADC_Values[0] = adc_inserted_data_read(ADC_INSERTED_CHANNEL_0); ADC_Values[1] = adc_inserted_data_read(ADC_INSERTED_CHANNEL_1); ADC_Values[2] = adc_inserted_data_read(ADC_INSERTED_CHANNEL_2); ADC_Values[3] = adc_inserted_data_read(ADC_INSERTED_CHANNEL_3); ADC_Ready = 1; // 设置数据就绪标志 }

4. 系统集成与性能优化

4.1 时序一致性保障

为确保采样时刻精确,需要校准三个延迟:

  1. 比较器输出到触发信号的传播延迟
  2. ADC采样保持时间
  3. 信号调理电路群延迟

校准方法:

  • 使用示波器观察PWM边沿与ADC采样时刻
  • 调整定时器触发偏移量
  • 验证采样点位于PWM高电平中部

4.2 抗干扰措施

电机驱动环境噪声主要来自:

  • MOSFET开关噪声
  • 电源纹波
  • 电磁辐射

硬件层面对策:

  • 每个ADC输入引脚添加100pF滤波电容
  • 采用星型接地布局
  • 使用屏蔽双绞线连接电流传感器

软件层面对策:

#define SAMPLE_COUNT 16 uint16_t GetFilteredCurrent(uint8_t channel) { static uint16_t buffer[SAMPLE_COUNT][4]; static uint8_t index = 0; uint32_t sum = 0; buffer[index][channel] = ADC_Values[channel]; index = (index + 1) % SAMPLE_COUNT; for(uint8_t i=0; i<SAMPLE_COUNT; i++) { sum += buffer[i][channel]; } return (sum + SAMPLE_COUNT/2) / SAMPLE_COUNT; }

4.3 实时性测试数据

在不同系统时钟下的性能表现:

主频(MHz)采样延迟(μs)最大采样率(kSPS)
482.176
721.4112
1080.9165

实际项目中,在72MHz主频下实现的三闭环控制带宽可达5kHz,完全满足大多数无刷电机应用需求。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询