
1. 电流检测方案选型为什么最终锁定AT8236的IPROPI引脚做过直流有刷电机驱动的工程师都知道电流检测这件事看起来简单做起来坑不少。最常见的有两种路子一是低侧采样电阻加运放放大二是直接选带电流镜像输出的驱动芯片。早期我一直在用第一种方案直到在某款消费类产品上被地弹噪声折磨得够呛才彻底转向集成驱动芯片的方案。AT8236这款芯片之所以值得聊是因为它把功率驱动和电流检测做在了同一个封装里内部通过电流镜像的方式在IPROPI引脚输出一个与负载电流成比例的电流信号。也就是说你不需要在电机回路里串一个大功率采样电阻只需要在IPROPI引脚对地接一个几十欧到几百欧的电阻电流信号就自动变成了电压信号直接送ADC采样。这个方案从工程角度看至少有四层好处。第一采样电阻不再走主功率回路功耗和发热问题几乎可以忽略。第二IPROPI引脚输出的信号天然是低侧参考ADC输入端不需要做电平偏移MCU可以直接采样。第三芯片内部还提供了一个AIPROPI引脚用于过流阈值设置硬件上就能做到快速关断保护不需要等MCU的软件响应。第四整个电流采样链路很短抗干扰能力比外部分立方案强得多。选型的时候我其实也对比过同类的国产驱动芯片比如AT8236和DRV8873这类。AT8236的RDS(ON)标称值比较低IPROPI的比例系数在数据手册里给得也算清楚适配MCU的3.3V ADC特别方便。不过需要提醒的是市面上有些驱动芯片的IPROPI引脚输出的是电压信号而不是电流信号接线方式完全不一样买料之前务必看清楚数据手册里的内部框图。2. ADC采样电流检测的原理拆解与关键参数计算2.1 电流镜像比例系数与采样电阻取值逻辑AT8236的IPROPI输出电流与电机电流之间满足一个固定的比例关系通常记作K典型值在1/1000到1/5000之间。我用的这颗料实际比例系数是1/1700附近不同批次會有微小偏差但不影响这个方案的推导逻辑。采样电阻Rsense的选择核心逻辑就一句话让满量程电机电流映射到合适的ADC电压范围。假设电机正常工作电流是2A堵转保护电流是4AMCU的ADC参考电压是3.3V那么我们希望4A电流对应的IPROPI电压大约在2.5V左右既留出一定余量避免ADC饱和又充分利用ADC的测量范围。计算公式非常简单Vsense (I_motor / K) × Rsense。把已知数代进去2.5V (4A / 1700) × Rsense算下来Rsense大约是1062欧姆。实际取标准阻值1k欧姆对应满量程电压约2.35V比例刚好合适。如果采样电压偏低还可以适当加大Rsense但注意不要超过ADC的参考电压。还有一个容易踩坑的细节IPROPI引脚输出的电流能力是有限的数据手册里会标注最大灌电流或者拉电流能力。Rsense阻值取得过大IPROPI电压会被钳位采样曲线在大电流段就会出现明显的非线性。我习惯把满量程电压控制在2.5V到3.0V之间既保证线性度又兼顾分辨率。2.2 高侧采样与低侧采样的噪声差异分析AT8236的IPROPI本质上属于低侧参考输出也就是说采样电压参考的是功率地而不是电机电源正极。这个特性带来的最大好处是ADC输入端的共模电压为零MCU可以直接采样不用做差分放大。低侧采样最大的敌人是地弹噪声。电机启动瞬间电流快速上升功率地上的压降会叠加在采样电压上如果MCU的ADC参考地PGND和模拟地AGND没有做好单点连接采样值会在小电流段出现明显的跳变。我在这块板上把功率地分成独立的一段通过一个0欧电阻或者磁珠与模拟地连接采样信号线也做的是从IPROPI引脚直接走线到MCU的ADC引脚中间不打过孔实测底噪从原来的约40mV降到了约12mV。高侧采样则正好相反它参考的是电机电源正极抗地弹能力强但需要处理共模电压问题往往要加差动放大器或者电流传感器芯片。对于消费级和工业级的中小功率应用来说AT8236这种带低侧电流镜像输出的方案性价比最高信号链简单关键参数也容易控制。2.3 采样窗口与PWM同步的时序关系直流有刷电机电流在每个PWM周期内并不是恒定的。PWM导通期间电流上升关断期间通过续流回路下降如果ADC采样没有和PWM同步对齐采出来的值会随着采样点的位置不同而剧烈波动。最直接的做法是把ADC触发源设置为PWM定时器的某个比较事件让采样点落在PWM导通时间的中间附近。因为导通阶段电流近似线性上升中点位置的电流值正好接近导通期间的平均电流。如果MCU的ADC支持硬件触发优先使用硬件触发这样抖动最小。也有工程师习惯在PWM关断期间采样续流电流这个做法对电感较大的电机可行因为续流电流衰减缓慢但要注意此时采样到的是续流电流而不是母线电流两者之间存在一个占空比相关的比例关系软件里要换算容易绕晕。2.4 采样电阻功率与热漂移的工程测算采样电阻虽然不直接串接在主功率回路里但IPROPI引脚的电流经过Rsense同样会消耗一定功率。以满量程2.35V、电阻1k欧姆来算热功率P 2.35 × 2.35 / 1000大约5.5mW这个量级对任何封装的贴片电阻都是小意思完全不用担心发热。真正要留意的是采样电阻的温漂系数。普通厚膜电阻温漂一般在100ppm/°C以上如果产品工作环境温度跨度大比如从-20°C到85°C同一电流对应的采样电压可能偏移近1%。我建议这里至少用25ppm温漂的薄膜电阻或者更稳妥的做法是选50ppm以内的合金电阻成本差异不大但系统精度明显更好。采样电压再经过MCU内部ADC转换12位精度下每一步约0.8mV对应电流分辨率大约0.34A/K×1700×0.8mV1.36A不对重新算一下I_step (V_step / Rsense) × K (0.8mV / 1kΩ) × 1700 ≈ 1.36A。这么算下来单步分辨率约1.36A显然太粗了说明实际系统里还需要加一级放大或者另想办法。如果MCU的ADC是12位3.3V参考电压那最小分辨电压约0.8mV对应IPROPI电流0.8uA镜像回电机电流约1.36mA这个精度其实足够用上面的公式换算没问题。3. MCU嵌入式实现流程初始化、采样、滤波与过流保护的完整落地3.1 硬件连接与MCU资源规划我以STM32G431这颗带运放和比较器的MCU为例但思路可以平移到任何主流MCU平台上。硬件连接上重点关注几个点PWM输出引脚接AT8236的IN1和IN2IPROPI引脚通过1k欧姆采样电阻接地同时从采样电阻端引一根线到MCU的ADC输入引脚。注意AT8236的IN1和IN2是独立的PWM输入电机正反转分别对应两路PWM的组合。以我做的单电机驱动为例PC6配成TIM3_CH1输出PWM控制正转占空比PC7配成TIM3_CH2输出低电平反转时反过来。如果要做刹车功能就把两路PWM同时拉低电机通过下管续流实现快速制动。MCU资源规划方面至少要占用两个定时器通道一个ADC外部触发通道或者定时器触发通道外加一个IPROPI电压采集引脚。如果MCU内部还有比较器资源可以把AIPROPI引脚的阈值直接引到比较器输入实现纯硬件过流保护。我建议不管有没有硬件比较器软件过流保护逻辑都要写毕竟硬件保护阈值设太高时软件可以做到更精细的分级保护。3.2 ADC初始化与PWM触发同步的代码实现ADC采样这一块的代码看上去不难但细节决定成败。我直接把PWM定时器的TRGO事件作为ADC的触发源这样采样点与PWM周期严格同步。下面是基于STM32 HAL库的简化配置逻辑核心在于ADC的触发源选择和采样时间的设置。void Motor_ADC_Init(void) { ADC_ChannelConfTypeDef sConfig {0}; // 开启ADC时钟这里的ADC是ADC1 __HAL_RCC_ADC1_CLK_ENABLE(); hadc1.Instance ADC1; hadc1.Init.ClockPrescaler ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution ADC_RESOLUTION_12B; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; hadc1.Init.ScanConvMode ADC_SCAN_DISABLE; hadc1.Init.EOCSelection ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait DISABLE; hadc1.Init.LowPowerAutoPowerOff DISABLE; hadc1.Init.ContinuousConvMode DISABLE; hadc1.Init.NbrOfConversion 1; hadc1.Init.DiscontinuousConvMode DISABLE; hadc1.Init.ExternalTrigConv ADC_EXTERNALTRIGCONV_T3_TRGO; hadc1.Init.ExternalTrigConvEdge ADC_EXTERNALTRIGCONVEDGE_RISING; hadc1.Init.DMAContinuousRequests DISABLE; HAL_ADC_Init(hadc1); sConfig.Channel ADC_CHANNEL_3; sConfig.Rank ADC_REGULAR_RANK_1; sConfig.SamplingTime ADC_SAMPLINGTIME_47CYCLES_5; HAL_ADC_ConfigChannel(hadc1, sConfig); HAL_ADC_Start(hadc1); }采样时间设置到47.5个时钟周期这个参数不是随便拍的。IPROPI引脚连接的是1k欧姆电阻到地等效源阻抗大约1k欧姆ADC内部采样电容需要时间充电。ADC时钟约21MHz的情况下47.5个周期换算下来采样时间约2.26微秒对1k欧姆源阻抗来说是偏保守但可靠的取值。如果采样时间设太短采样电容充不满转换结果会偏低而且输入阻抗越高误差越明显。PWM定时器这边需要配置主输出触发事件TRGO在PWM计数器等于比较值附近输出一个脉冲。通常做法是设置TRGO为Update事件或者OC1REF事件。我是用PWM模式1把TRGO配置为Update事件也就是计数器溢出时触发一次ADC转换。如果要求更精确的采样窗口可以把TRGO配置为OC1REF脉冲让采样点正好落在占空比中间。void Motor_PWM_Init(void) { TIM_MasterConfigTypeDef sMasterConfig {0}; TIM_OC_InitTypeDef sConfigOC {0}; __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance TIM3; htim3.Init.Prescaler 84 - 1; // 84MHz/84 1MHz htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 1000 - 1; // PWM频率 1MHz / 1000 1kHz htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim3); sMasterConfig.MasterOutputTrigger TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(htim3, sMasterConfig); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 500; sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); }PWM频率选1kHz属于偏低的实际产品里直流电机建议跑到15kHz以上避开人耳可听范围。如果是大电感电机频率也可以低一些但要注意电流纹波会变大。频率调高后定时器分频和Period需要重新配同时ADC采样时间对应的角度窗口会变窄需要在采样窗口和PWM周期之间取平衡。3.3 电流采样数据的软件滤波与标定算法ADC采出来的原始值不能直接用因为里面有开关噪声、电机换向火花干扰和采样时序抖动。我最常用的滤波算法是中值滤波加滑动平均的组合策略。每收到20个采样点先做一次冒泡排序取中间值剔除可能的毛刺再把连续5个中值做滑动平均平滑度足够延迟也不大。如果MCU资源紧张可以用更简单的去极值均值滤波也就是去掉最大值和最小值再取平均。实测下来对AT8236这类驱动方案去极值均值滤波的效果已经很接近中值滤波但是代码量少一大截。在定时器中断里每来一次ADC转换完成事件就把结果存进环形缓冲区同时更新累加和缓冲区满时减去最老的点这样每个PWM周期都能输出一个稳定的电流平均值。标定这一块建议在产线上做两点或者三点校准。零电流校准比较容易电机不转的时候采一次ADC值作为偏移量注意这时候IPROPI理论上输出为0但ADC会有失调和PCB漏电流所以务必实测标定。满量程校准可以外接恒流源灌入已知电流也可以在电机堵转时通过测量母线电流来反推。把两组数据拟合成一次线性关系存储到Flash里运行时就按这个关系做电流反算。3.4 分级过流保护策略与PWM关断时序过流保护不能只靠一个阈值一刀切。我习惯把保护分成三档预警、降额、关断。预警阈值设在额定电流的120%触发后只置一个标志位不做动作方便上位机监控。降额阈值设在额定电流的200%触发后把PWM占空比强制削掉一半电机继续转但转速下降。关断阈值设在堵转电流附近一旦触发立即把PWM输出拉低同时置位错误标志等待上位机确认后重新使能。PWM关断时序上也有一点心得。软件检测到过流标志后最好的做法不是马上把占空比改成0而是把当前占空比逐步递减到0比如每100微秒减5%这样可以避免电流突变引发的反电动势冲击。不过对于堵转这种极端情况这种缓慢关断反而让电机过热所以我在软件里分了两条路径瞬时过流走快速关断持续性过流走缓降关断。快速关断的代码逻辑其实就是一个受保护的中断服务函数里面把PWM占空比寄存器直接写0再置位一个软件锁存标志防止主循环再次写入占空比。这个锁存标志只有在上位机清除故障码后才解除确保故障不会被自动恢复逻辑掩盖。void TIM3_IRQHandler(void) { if (__HAL_TIM_GET_FLAG(htim3, TIM_FLAG_UPDATE)) { __HAL_TIM_CLEAR_FLAG(htim3, TIM_FLAG_UPDATE); g_motor_current Motor_GetCurrentFromADC(); // 分级保护 if (g_motor_current CURRENT_FAULT_LEVEL) { Motor_FastShutdown(); g_motor_error | MOTOR_ERROR_OVERCURRENT; } else if (g_motor_current CURRENT_DERATE_LEVEL) { if (g_motor_pwm_target PWM_DERATE_MAX) { g_motor_pwm_target PWM_DERATE_MAX; g_motor_error | MOTOR_ERROR_DERATE; } } else if (g_motor_current CURRENT_WARN_LEVEL) { g_motor_error | MOTOR_ERROR_WARN; } else { g_motor_error ~(MOTOR_ERROR_WARN | MOTOR_ERROR_DERATE); } } }4. PCB布局布线与电路调试的关键细节4.1 功率地与模拟地的处理策略这块板子调试过程中我最大的体会是地平面设计直接决定了ADC采样的稳定性。AT8236的散热焊盘是功率地的一部分电流从电机回来会经过这个焊盘如果模拟地和功率地完全共用一个平面采样电阻上的电压会叠加地噪声。推荐的做法是从AT8236散热焊盘单独引出一段功率地走线连接到母线电容的负端形成星型接地。IPROPI采样电阻的接地端单独走一根线汇入模拟地然后模拟地通过一个0欧电阻或者磁珠单点连接到功率地。这样采样信号的地参考点就非常干净。采样电阻的摆放位置也有讲究要尽量靠近AT8236的IPROPI引脚和AGND引脚走线短而且粗。IPROPI引脚的走线两边最好有地包覆形成伪同轴结构减少耦合噪声。如果板空间允许IPROPI到ADC的线路上预留一个RC滤波位置通常在1k欧姆串联电阻加100pF对地电容的效果不错但要注意这个RC会引入极点采样窗口足够宽时没问题。4.2 电机换向噪声的抑制措施直流有刷电机运行的时候电刷换向会产生大量宽带噪声这种噪声不仅通过传导路径进入采样电路还会通过空间辐射耦合进来。实测发现电机线直接绑扎在采样线旁边时ADC采样的噪声底会从约10mV上升到约50mV。抑制措施主要有三个方向。第一是在电机两端并联一个0.1uF陶瓷电容加一个高压薄膜电容的组合尽量靠近电机端子。第二是电机线采用双绞线绞距在10mm到20mm之间让两根线的磁场互相抵消。第三是在PCB上把PWM输出线和IPROPI采样线分开走中间隔一条地线减少容性耦合。还有一个容易被忽略的位置是AT8236的电源脚和地脚之间的去耦电容务必用多个容值并联典型搭配是0.1uF加10uF再加47uF电解电容。这些电容的位置要靠近芯片的电源引脚否则高频去耦效果大打折扣。4.3 上电时序与使能引脚的防误动作设计AT8236这类驱动芯片通常有一个EN使能引脚上电瞬间如果这个引脚处于不确定状态芯片可能会意外导通导致电机抖动或者堵转电流冲击。我在设计里给EN引脚加了一个100k欧姆下拉电阻MCU还没初始化完成前EN保持低电平驱动输出处于高阻状态。如果MCU的IO口默认状态是浮空输入并且EN引脚和MCU直接相连建议MCU侧也配置为开漏输出加上拉或者下拉保证MCU复位期间电平和外部下拉保持一致。实测遇到过一种情况MCU还在下载程序的时候电机突然转了一下就是因为EN引脚被调试器的电平干扰了后来在EN引脚并联一个1nF电容到地问题消失。从软件策略上上电后主循环不要立即给PWM赋大占空比先初始化完成所有外设延时200毫秒再开始逐步增加占空比。这个软启动过程既保护电机也保护采样电路防止上电瞬间的浪涌电流导致ADC采样饱和。5. 常见问题与排查技巧实录5.1 ADC采样值跳变电流波形毛刺严重这个现象很常见十个做电机驱动的人里至少八个遇到过。排查思路从简到繁先看采样窗口是否稳定再用示波器直接量IPROPI引脚波形看看是否真的毛刺还是ADC转换过程被干扰。我遇到过一种情况软件配置上已经把ADC触发对齐到PWM中点但采样值依然跳变最后查出来是PWM死区配置不正确上下管直通产生了瞬间大电流导致IPROPI电压在采样瞬间出现尖峰。把死区时间从默认的0调整到500纳秒后波形立即干净了。如果你的电路支持最好用示波器同时抓PWM输出和IPROPI电压时间轴对齐很快就能定位是时序问题还是噪声问题。还有一种情况是ADC参考电压不稳。如果MCU的VREF直接接在3.3V电源上而3.3V电源又驱动了其他负载参考电压摆动会被ADC完整捕获表现为电流值随负载波动。解决方法是给VREF加独立的RC滤波或者直接把参考电压源接到高精度的基准芯片上。5.2 IPROPI电压异常偏低满量程对应关系不对IPROPI电压整体偏低时先排查Rsense阻值是否焊错然后确认电机电流是否真的到了设定值。用电流钳实测电机电流和IPROPI反推的电流做对比能快速定位是芯片比例系数问题还是测量链路问题。还有一种比较隐蔽的情况IPROPI引脚的最大输出电流能力不够当你把Rsense调大IPROPI电压达到一定值后不再跟随电机电流上升。这个其实是芯片内部电流镜饱和了应对办法是减小Rsense同时增加一级外部运放放大电压。如果你希望采样范围覆盖堵转电流务必在选型阶段就核算好Rsense和饱和电压的匹配关系。5.3 电机反转时电流采样方向怎么处理AT8236是双半桥结构电机正转和反转时电流方向不同IPROPI引脚输出的电压是否跟随方向翻转取决于芯片内部设计。AT8236的IPROPI只输出正向电流镜像反转时IPROPI输出为零通过电机电流采样判断方向不可行。如果要检测反向电流需要额外加一个负向电流检测电路或者换支持双向电流输出的驱动芯片。对于只需要幅值的应用比如堵转保护和负载监测单方向电流采样完全够用反正堵转电流和正常电流幅值都在一个增减方向。但如果你要做力矩闭环控制电流方向信息非常重要那就要考虑在软件里根据PWM方向信号做符号判断把反向电流用软件补成负值。聊了这么多AT8236的电流检测实现最后结合我个人的工程经验收个尾。做这类电机驱动项目最容易翻车的往往不是芯片本身而是采样链路的地平面处理和PWM时序对齐这两件看似基础的事。很多人在软件滤波上花很大功夫却忽略了硬件布局上的根本问题结果就是滤波参数调来调去效果依然有限。如果你是在现有板子上做软件调试遇到电流采样不稳的时候不妨先量一下IPROPI引脚的波形确认采样窗口和PWM边缘的相位关系再决定是改软件还是动硬件。AT8236这套方案总体上限很高但前提是PCB布局给采样链路留出了足够的干净空间。第一次画板就把功率地和模拟地的星型连接规划好后面会省去大量调试时间。