基于GreenPAK的PWM风扇闭环调速系统设计与实现

基于GreenPAK的PWM风扇闭环调速系统设计与实现 1. 项目概述与核心思路最近在折腾一个需要精确控制风扇转速的项目目标是把一个普通的3线PWM风扇变成一个能根据设定值自动稳定转速的智能风扇。市面上很多现成的风扇控制器要么是开环的设定一个占空比就不管了要么精度不够在负载变化时转速波动很大。我的需求是无论外部供电电压轻微波动还是风扇轴承阻力因温度、灰尘发生变化风扇的转速都能牢牢锁定在我设定的目标值上平均误差最好能控制在3%以内。经过一番选型我最终把目光投向了Renesas的GreenPAK系列可编程混合信号芯片。这东西有点像高度集成化的“数字乐高”内部集成了可配置逻辑门、计数器、有限状态机ASM甚至模拟比较器用一款芯片就能搭出一个完整的数字控制系统特别适合这种对成本敏感、对PCB面积有要求但又需要一定灵活性的应用。这次我用的是SLG46531这款型号它内置了一个8状态的ASM正好可以用来实现闭环调速的状态逻辑。整个系统的核心思路是一个典型的负反馈闭环控制GreenPAK产生PWM波驱动一个MOSFET为风扇电机供电风扇内置的霍尔传感器也就是那根第三根线——Tachometer输出会随着扇叶旋转产生脉冲信号GreenPAK测量这个脉冲信号的频率即转速并与我通过I2C设定的目标频率进行比较如果实际转速低于目标就增加PWM占空比给电机更多功率如果转速过高则减小占空比。如此循环往复最终使实际转速动态稳定在目标值附近。这个方案的精妙之处在于所有的控制逻辑——频率检测、比较、PWM生成、状态管理——全部由GreenPAK这一颗芯片以纯硬件方式实现响应速度极快没有软件延时系统非常可靠。下面我就来拆解整个设计和实现过程。2. 硬件电路设计与关键器件选型要实现闭环调速硬件平台是基础。我的目标是驱动一个额定5V、0.2A左右的三线风扇。这类风扇的三根线分别是红色VDD电源正极、黑色GND电源地、黄色或蓝色TACH转速反馈信号线。2.1 功率驱动部分Buck转换器拓扑直接用一个MOSFET开关风扇的GND端是最简单的但这里我选择了一个稍微复杂但性能更好的方案一个由P沟道MOSFETPFET构成的高边Buck降压转换器。电路如图1所示注此处为文字描述实际设计请参考原理图。为什么用Buck拓扑而不是简单的低边开关主要有两个考虑滤波与稳定Buck电路中的电感L和电容C构成了一个LC滤波器。当PFET以PWM方式开关时这个滤波器能将方波电压平滑成一个平均值更稳定、纹波更小的直流电压施加在电机两端。这比直接把PWM方波加在电机上要好能减少电机的谐波损耗和噪音尤其是在低频PWM时可以避免电机的“咯咯”声。保护与续流续流二极管D在PFET关闭时为电感中的电流提供续流通路避免产生高压尖峰损坏MOSFET。这是开关电源中的标准配置。关键器件参数计算与选型PFET选型电机工作电流约0.2A考虑到启动电流可能更大选择连续漏极电流Id大于1A的型号。电压选择Vds耐压大于电源电压5V即可例如20V。重点看导通电阻Rds(on)越小越好以减少导通损耗。我选用了一颗常见的SOT-23封装的PMOS如AO3401。电感选型电感值影响电流纹波。对于Buck电路电感电流纹波ΔI_L ≈ (V_in - V_out) * D / (f_pwm * L)。其中V_in5VV_out≈平均电机电压0-5VD为占空比f_pwm为PWM频率。PWM频率由GreenPAK内部计数器决定后续会设计在几kHz到几十kHz。为了简化我选择了一个22uH的功率电感这个值在常用Buck电路中很常见能保证在设计的PWM频率下电流纹波在可接受范围内同时电感体积和DCR直流电阻也合适。电容选型输出电容主要用于滤除开关噪声和稳定电压。通常选用一个10uF的陶瓷电容如X5R或X7R材质并联一个0.1uF的陶瓷电容分别应对低频和高频噪声。续流二极管选择开关速度快的肖特基二极管如1N5817其正向压降低能提高效率。注意PFET是高端驱动这意味着它的源极S接电源5V漏极D接电感和负载。要使PFET导通栅极G电压需要低于源极电压一个阈值Vgs(th)。对于5V系统直接用GreenPAK的3.3V输出驱动可能无法完全关断某些Vgs(th)较低的PMOS。稳妥起见可以增加一个简单的电平转换电路或用一颗NPN三极管来驱动PFET栅极确保栅极能被拉高到接近5V来可靠关断拉低到0V来可靠导通。在我的测试中所选PFET的Vgs(th)范围较宽3.3V驱动足以使其完全导通和关断故直接连接。2.2 信号连接与GreenPAK接口GreenPAK SLG46531采用3.3V供电但其I/O口可以容忍5V输入。这很重要因为风扇的TACH信号通常是5V电平。PWM输出GreenPAK的一个GPIO我分配为PIN18配置为数字输出直接连接到PFET的栅极驱动电路或直接连接视PFET特性而定。转速反馈输入风扇的TACH线连接到GreenPAK的另一个GPIO如PIN3。该引脚配置为数字输入用于检测霍尔传感器产生的脉冲。这里有个关键点我使用的风扇内置的霍尔传感器如US1881是“锁存型”的。这意味着磁铁每旋转一周经过两个磁极传感器输出电平会翻转一次从高到低或从低到高。因此每一个边沿上升沿或下降沿都代表风扇旋转了半圈。在后续的频率测量中我们需要按“每个边沿代表一转”来处理或者将测得频率乘以2来得到真实的转速频率。I2C接口GreenPAK的I2C引脚SCL, SDA连接到主控MCU如STM32、Arduino等用于在线设定目标转速值。电源为GreenPAK提供稳定的3.3V供电。可以从5V主电源通过一个LDO如AMS1117-3.3降压得到。3. GreenPAK内部逻辑设计详解这是整个项目的核心全部在GreenPAK Designer软件中通过图形化配置完成。我们需要构建几个关键功能模块频率检测器看门狗、PWM信号发生器、以及协调整个控制流程的有限状态机ASM。3.1 有限状态机ASM设计系统的大脑SLG46531的ASM有8个状态我全部用上了状态转移图是控制逻辑的蓝图。各个状态的功能与转移条件复位状态系统上电或使能前的初始状态。在此状态下PWM输出强制为低占空比0%风扇停止。当外部使能信号到来时离开此状态。过驱状态从复位状态进入后的第一个状态。在此状态下PWM输出强制为高占空比100%持续3秒。为什么需要这个状态电机有静摩擦力需要一定的启动扭矩。初始的100%占空比能提供一个最大的启动电流确保风扇能可靠地开始旋转克服“启动死区”。PWM增加状态过驱状态结束后状态机进入此状态。在此状态下控制逻辑会尝试增加PWM的占空比具体机制在3.3节详述。如果频率检测器反馈“转速过低”状态机将保持或进入此状态。PWM减少状态与状态3相对。在此状态下控制逻辑会尝试减少PWM占空比。如果频率检测器反馈“转速过高”状态机将进入或保持此状态。缓冲高状态这是一个“安全缓冲区”状态。当占空比增加到100%时系统进入“停止高”状态前会先经过此状态。它的存在是为了防止状态机在边界条件下发生瞬间的“乒乓”跳变例如刚从“停止高”离开因为一个毛刺脉冲又立刻跳回去。它作为一个中间状态确保状态转移的稳定。停止高状态当PWM占空比已达到理论最大值100%但频率检测器仍指示“转速过低”时进入此状态。PWM输出被强制锁定为100%。这表示当前负载可能过重或者目标转速设定得过高已超出电机能力范围。缓冲低状态与“缓冲高”对称是进入“停止低”状态前的缓冲区。停止低状态当PWM占空比已达到理论最小值0%实际上可能是维持转动的最小占空比如30%但频率检测器仍指示“转速过高”时进入此状态。PWM输出被强制锁定在最小占空比。这通常发生在目标转速设定得过低低于电机空载最低稳定转速时。状态转移逻辑 核心转移发生在“PWM增加”和“PWM减少”之间由频率检测器FSM0的两个输出信号“Increase PWM”和“Decrease PWM”控制。这两个信号是互斥的不会同时有效。它们直接决定了ASM是在努力加速还是减速。 当占空比调节到达极限100%或最小占空比时由Set/Reset信号的重叠检测电路产生边沿信号触发状态机跳转到相应的“缓冲”和“停止”状态。3.2 频率检测与转速反馈处理转速反馈的测量由可配置有限状态机模块FSM0完成。我将其配置为“双边沿频率检测器”模式。工作原理测量周期FSM0内部有一个计数器其时钟源为GreenPAK的内部振荡器OSC。我将其分频至250kHz作为测量时钟。目标值设定通过I2C向FSM0的寄存器写入一个“计数器数据”值。这个值对应的就是目标转速周期所对应的时钟数。例如目标转速是1500 RPM对于两极风扇霍尔传感器输出频率f_hall 1500 / 60 25 Hz。由于是锁存型传感器每个边沿代表一转所以需要检测的脉冲频率是25 Hz周期T_target 1 / 25 0.04秒 40 ms。如果测量时钟频率是250kHz周期为4us那么目标计数器值 40ms / 4us 10000。比较与判断FSM0会测量输入的TACH信号两个边沿之间的时间即脉冲周期。如果测得的周期大于写入的目标周期值计数器计得更多说明实际转速太慢FSM0输出“Increase PWM”有效。反之如果测得的周期小于目标值说明实际转速太快输出“Decrease PWM”有效。计算公式计数器目标值 (内部振荡器频率 / 分频系数) / 目标转速频率其中目标转速频率 (目标RPM值 / 60) * 每转脉冲数。对于锁存型霍尔传感器每转脉冲数为2两个边沿。实操心得GreenPAK的内部振荡器OSC精度有限通常有±10%左右的偏差。这会导致频率测量的基准不准。为了获得更高精度可以在设计时使用外部晶振作为时钟源或者在实际使用时通过测量实际的OSC频率比如用频率计测一个GPIO输出的时钟然后根据实测值去反算应该写入的计数器目标值进行软件校准。我在项目中发现标称250kHz的OSC实测为253kHz这直接带来了约1.2%的系统误差。3.3 PWM生成与占空比调节机制PWM信号由一个经典的SR锁存器产生。两个计数器/延时模块CNT5/DLY5和CNT6/DLY6分别产生“置位”和“复位”脉冲。CNT6/DLY6产生PWM周期的开始脉冲Set。它每隔一个固定的PWM周期例如CNT6计满一个值后输出一个高脉冲。CNT5/DLY5产生PWM周期的结束脉冲Reset。它也在每个PWM周期内输出一个高脉冲但其相位时间点可调。占空比调节的精髓——脉冲相位移动 PWM的占空比由Set脉冲和Reset脉冲之间的时间差决定。固定Set脉冲的位置移动Reset脉冲的位置就能改变高电平的宽度。增加占空比让Reset脉冲在时间轴上向后延迟即CNT5的计数周期临时增加一点。这样从Set到Reset的高电平时间就变长了。减少占空比让Reset脉冲提前出现即CNT6的计数周期临时增加一点相对地Reset就提前了。这样高电平时间就变短了。如何实现“移动”通过向CNT5或CNT6的时钟输入中间歇性地插入一个额外的时钟脉冲。这个“额外脉冲”由另一个计数器CNT4/DLY4控制它定义了一个“更新周期”比如每50个PWM周期。在更新周期到来时根据ASM当前是处于“PWM增加”还是“PWM减少”状态决定将额外脉冲送给CNT5还是CNT6。如果状态是“PWM增加”则额外脉冲给CNT6推迟Reset。如果状态是“PWM减少”则额外脉冲给CNT5提前Reset相对概念。这种机制意味着占空比是步进式调整的每一步的调整量分辨率取决于CNT5/CNT6的计数器设置值。值越大每个PWM周期本身的时钟数越多插入一个额外脉冲所引起的相位变化比例就越小调节精度越高但系统响应速度也越慢。3.4 输出控制与保护逻辑ASM的输出信号“Force 0”和“Force 100”用于实现状态机中提到的强制输出。当处于“复位”、“停止低”、“缓冲低”状态时“Force 0”有效直接绕过SR锁存器将最终输出引脚强制拉低。当处于“过驱”、“停止高”、“缓冲高”状态时“Force 100”有效将输出强制拉高。在其他状态PWM增加/减少这两个信号无效输出由SR锁存器正常产生。一个3位查找表3-bit LUT被配置为SR锁存器Set信号置位输出高Reset信号复位输出低。 另一个3位查找表作为输出门控当“Force 100”有效时输出恒为高“Force 0”有效时输出恒为低两者都无效时输出等于SR锁存器的状态。4. 系统调试、测试与性能优化设计完成后将配置文件下载到GreenPAK开发板连接好硬件电路就可以开始测试了。4.1 I2C通信与目标转速设定主控MCU通过I2C与GreenPAK通信修改FSM0的计数器目标值从而动态设定风扇转速。GreenPAK的I2C从机地址是固定的例如0x00。需要写入的寄存器地址是FSM0的计数器寄存器。通信示例 假设目标转速为1500 RPM。计算过程如下目标霍尔信号频率 1500 RPM / 60秒 * 2边沿/转 50 Hz。目标周期 1 / 50 Hz 20 ms。测量时钟频率 内部OSC 2 MHz / 8分频 250 kHz (周期4us)。计数器目标值 20 ms / 4 us 5000。将十进制5000转换为十六进制0x1388。GreenPAK的FSM0计数器寄存器可能由两个8位寄存器组成例如地址0xC5存高字节0xC6存低字节。那么需要写入0x13和0x88。I2C写入序列假设从机地址为0x08[0x10 (写地址) 0xC5 0x13 0x88]。在软件中可以封装一个函数输入目标RPM自动完成上述计算并发送I2C指令。4.2 实测波形与性能分析使用示波器观察关键点波形是调试必备。需要观察的通道包括通道1PWM输出查看PWM频率是否稳定占空比是否在动态调整。通道2TACH信号测量其频率换算成实际转速。通道3电机两端电压可以看到经过LC滤波后电压是比较平滑的直流上面叠加了较小的开关纹波。在系统达到稳态后你会观察到状态机在“PWM增加”和“PWM减少”两个状态之间有规律地切换。这会导致PWM占空比在一个很小的范围内比如1-2个步进值来回抖动这正是闭环系统在努力维持设定点的表现称为“极限环振荡”。性能指标平均误差长时间运行下实际转速平均值与设定值的偏差百分比。在我的测试中这个值可以轻松做到小于2.5%。主要误差来源是内部OSC的频率误差。瞬时误差Min/Max由于PWM调节的分辨率和系统惯性瞬时转速会在平均值上下波动。测试中最大瞬时误差可能达到±15%。这看起来很大但对于风扇调速应用通常是可以接受的因为人耳对风扇噪音的平均值更敏感而不是瞬时波动。4.3 常见问题与调优技巧风扇无法启动或启动困难检查“过驱状态”时间3秒的100%占空比启动时间是否足够对于某些阻力较大的风扇可能需要延长这个时间。可以通过调整ASM中驱动“过驱状态”的延时计数器来实现。检查最小占空比有些风扇有最低工作占空比要求如20%-30%。确保在“停止低”状态或PWM调节下限时输出的占空比高于这个值。这需要修改CNT5/CNT6的初始值或ASM逻辑。硬件检查PFET是否完全导通电机两端电压是否达到续流二极管是否接反转速波动大无法稳定调节更新周期CNT4减少更新周期如从每50个PWM周期调整一次改为每20个可以加快系统响应但可能导致超调振荡。增加更新周期会使调节更平缓但响应变慢。需要根据风扇的机械惯性来权衡。调节PWM分辨率CNT5/CNT6基值增加CNT5和CNT6的计数器最大值可以提高PWM占空比的调节细度分辨率从而减小稳态时的极限环振荡幅度降低瞬时误差。但副作用是每次调节的步长变小达到稳态所需的调节次数增多稳定时间会变长。这是精度与速度的经典权衡。检查反馈信号TACH信号是否干净是否有毛刺可以在GreenPAK的输入引脚上加一个小的RC滤波如1kΩ串联电阻100pF对地电容滤除高频噪声避免误触发频率检测器。I2C通信失败确认GreenPAK的I2C从机地址是否正确。检查上拉电阻通常4.7kΩ是否已接在SDA和SCL线上。用逻辑分析仪抓取I2C波形检查时序是否符合规范。系统精度提升时钟校准如前所述测量GreenPAK的实际内部振荡频率在计算目标计数器值时使用实测值而非标称值可显著减小系统误差。使用外部晶振对于要求高精度的应用可以启用GreenPAK的外部时钟输入引脚连接一个更精准的有源或无源晶振。软件滤波虽然GreenPAK是硬件逻辑但主控MCU可以通过I2C定期读取状态如果GreenPAK支持或者在MCU端对设定的目标RPM进行缓慢的斜坡变化避免对系统造成大的冲击。这个基于GreenPAK的PWM风扇闭环控制器成功地将数字逻辑设计、模拟功率驱动和闭环控制理论结合在了一颗小小的芯片里。它提供了一种非常高效、低成本且可靠的电机调速解决方案。通过调整ASM状态逻辑、计数器参数和滤波器设计这套框架可以适配不同的电机类型和性能要求展现了可编程混合信号器件在嵌入式控制领域的灵活性和强大潜力。