4. SAM ADC与电流采样
在FOC(磁场定向控制)或方波六步换相方案中,电流采样是闭环控制的“眼睛”。SAM系列MCU(如SAME70、SAMV71、SAMD51等)内部集成的12位逐次逼近型ADC,配合PDC/DMA与定时器事件触发,可以在PWM周期内精确地于电流稳定时刻完成相电流与母线电压的采集,并在此基础上实现硬件级过流保护。本节围绕“采样什么、何时采样、谁来触发、数据怎么搬、异常怎么判”这条主线展开。
一、采样对象与信号链
电机控制通常需要三类模拟量:两相或三相下桥臂电流(经采样电阻+运放调理)、母线电压(经分压网络)、以及可选的母线电流或温度。以三相逆变桥为例,最常用的方案是在每个下桥臂MOSFET源极串入毫欧级采样电阻,运放将双向电流抬升到ADC量程中点(如1.65V对应0A),使正负电流都能被单极性ADC读取。
信号链为:采样电阻 → 差分/同相放大 → RC抗混叠滤波 → ADC通道(如AFEC0_CH0)。SAM的ADC参考电压通常取VDDANA(3.3V),12位分辨率下1LSB≈0.806mV。若采样电阻为5mΩ、放大倍数为10,则电流灵敏度为50mV/A,对应约62LSB/A,可分辨约16mA的电流变化。
二、ADC关键配置与采样时序
SAM的AFEC(Analog Front-End Controller)模块支持12位分辨率、多通道序列转换和硬件触发。配置时需关注以下寄存器组:
- AFEC_CR:使能ADC、选择分辨率(12位)、启动校准。
- AFEC_MR:设置触发模式(如AFEC_MR_TRGSEL选择TIOA事件)、采样保持时间(STARTUP)、低功耗模式。
- AFEC_CHER:使能需要转换的通道(如CH0、CH1、CH5)。
- AFEC_SEQR:配置通道转换顺序,实现相电流与母线电压的自动轮询。
- AFEC_IER:使能数据就绪中断或DMA请求。
采样时序的核心是“触发—建立—转换—搬运”四段。以SAME70为例,AFEC时钟为150MHz,采样保持时间设为8个ADC时钟周期,转换时间约12个周期,单通道总耗时约133ns×20≈2.7μs。若PWM频率为20kHz(周期50μs),则ADC有充足时间完成3~4个通道的序列转换。
触发源选择上,推荐使用PWM定时器的比较匹配事件(如TC的TIOA)而非软件触发。硬件触发的好处是抖动小、与PWM严格同步,能保证每次都在电流稳定的同一相位点采样。配置时需将TC的TIOA输出连接到AFEC的触发输入,并在AFEC_MR中设置TRGSEL为对应事件源。
三、DMA传输与数据组织
若每次ADC转换都进中断读取结果,CPU开销大且可能错过下一个触发。SAM的AFEC支持PDC(Peripheral DMA Controller)或通用DMA,可将转换结果自动搬运到内存数组。典型配置如下:
// 示例:AFEC PDC 配置(SAME70,伪代码)
AFEC->AFEC_CHER = (1u << 0) | (1u << 1) | (1u << 5); // 使能CH0/CH1/CH5
AFEC->AFEC_SEQR1 = AFEC_SEQR1_USCH1(1) | AFEC_SEQR1_USCH2(5); // 序列:CH0→CH1→CH5
AFEC->AFEC_PDC_RPR = (uint32_t)adc_buffer; // 接收指针
AFEC->AFEC_PDC_RCR = 3; // 每次搬运3个通道
AFEC->AFEC_PDC_RNPR = (uint32_t)adc_buffer; // 下一轮指针
AFEC->AFEC_PDC_RNCR = 3;
AFEC->AFEC_PTCR = AFEC_PTCR_RXTEN; // 启动接收DMA
AFEC->AFEC_IER = AFEC_IER_RXBUFF; // 缓冲区满中断
这样,每个PWM周期触发一次序列转换,DMA自动将CH0(A相电流)、CH1(B相电流)、CH5(母线电压)写入adc_buffer[0..2]。当缓冲区满时产生中断,CPU在中断中读取三个值并执行FOC算法或过流判断。注意缓冲区大小应与序列长度一致,且使用双缓冲(RNPR/RNCR)避免数据覆盖。
四、过流保护基础
过流保护分两级:软件比较和硬件比较。软件方式在DMA中断中读取电流值,若超过阈值则关闭PWM输出。但软件响应受中断延迟影响,通常需要几十微秒,适合作为后备保护。
更快的方案是利用AFEC的硬件比较窗口。SAM的AFEC支持模拟看门狗(Analog Watchdog),可设置高低阈值,当转换结果超出窗口时直接触发中断或故障输出。例如,将CH0的窗口设为对应±10A的ADC码值(约1.65V±0.5V,即2048±620),一旦超限,AFEC立即产生中断,CPU可在中断中调用PWM_Stop(),响应时间可压缩到几微秒。
此外,SAM的部分PWM模块(如AFEC与PWM的故障输入联动)支持将过流信号直接路由到PWM的故障引脚,实现硬件级快速关断,无需CPU介入。这需要在PWM的故障控制寄存器中使能对应故障源,并设置关断后的输出状态(高阻或低电平)。
五、调试与验证要点
实际调试时,可用DAC输出或PWM占空比观察ADC采样值。例如,在DMA中断中将adc_buffer[0]右移4位后写入DAC,用示波器观察重构波形,应与实际相电流一致。若发现采样值跳变或偏置漂移,检查运放偏置电压是否稳定、RC滤波截止频率是否足够低(建议fc≤1/(2π×R×C),且远低于PWM频率)。
验证过流保护时,可临时将阈值调低,用可调负载或短接采样电阻模拟过流,观察PWM是否在预期时间内关断。记录从过流发生到PWM输出关闭的时间,若超过10μs,需检查中断优先级或改用硬件故障通道。
最后,注意ADC校准。SAM的AFEC在上电后需执行一次校准(设置AFEC_CR_CALIB),否则增益和偏置误差可能达到数十LSB。校准应在ADC使能后、启动转换前完成,且校准期间不进行采样。