首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
电子烟恒功率输出控制方案:从PID闭环到PWM调参实践
📅 2026/10/20 23:01:11
✍️ 爱科研究院
👁 阅读 3,247
做便携雾化设备的嵌入式开发这行经常被问到一个问题电子烟恒功率输出到底是个什么控制逻辑很多刚入行的朋友一看“恒功率”三个字觉得不过是把功率算出来然后稳住就行可真到自己搭电路、写固件、上负载实测的时候才发现输出功率一路漂发热丝忽明忽暗电量一低功率整个就垮掉。这篇就把我实际做“电子烟恒功率输出”这套控制方案的过程完整拆开讲从为什么不用恒压、闭环怎么搭、关键参数怎么算到调参踩坑的实操记录一次说清楚。适合正在做小尺寸加热设备、便携雾化器电源方案的硬件工程师、嵌入式开发者也适合想搞懂这类控制逻辑的电子爱好者参考。1. 内容整体设计与思路拆解1.1 为什么“恒压”会把体验做成玄学很多初版方案为了省事直接用一个稳压芯片固定输出电压然后把发热丝一接就完事。刚上电那几十秒确实还行可一旦发热丝温度升上来问题就来了——发热丝用的合金材料有正温度系数温度上去了电阻值跟着涨实测下来常见规格的发热丝从常温到工作温度电阻变化能达到10%~20%甚至更高。电压是稳住了电流却因为电阻变大而变小实际功率等于电压平方除以电阻跟着一路往下掉。表现出来就是前两口还行越往后输出越疲体验完全看发热丝心情。更要命的是电池电压的影响。便携设备用的是单节锂电池满电4.2V放到3.4V就基本得保护了全程电压摆幅将近0.8V。就算后端有个稳压电路电池放电能力、线路压降也会让实际供给到发热丝的能量飘忽不定。我见过有方案直接用电池电压算功率结果满电和低电量时同一个输出档位差了将近30%这种偏差做开发的人自己知道用户也早晚能感觉出来。1.2 恒功率输出的工程定义与价值恒功率输出说白了就是让发热丝上消耗的电功率维持在一个设定值附近不管电池电压怎么掉、发热丝阻值怎么漂也不管线路接触电阻带来什么扰动到头来发热丝获得的功率基本不变。工程实现上它不再把发热丝当成一个固定电阻死算而是当成一个动态负载去主动控制。核心公式仍然是欧姆定律的功率表达P I²R U²/R但这里的电压和电流不是拿初始状态定的而是实时采样、实时调节。这带来的实际价值很直接同样一颗发热丝从满电到低压第一阶段和第十阶段的加热功率都能维持一致换了不同阻值的雾化芯用户选定的输出档位对应的实际功率也一致而不是出现“标称60W实测45W”这种尴尬。作为控制系统来做它本质是一个功率闭环比单纯的恒压、恒流都要更贴近实际负载的需求。1.3 方案选型几种控制思路的取舍做恒功率输出之前我先把几种常见技术路线对比了一圈包括开环查表、恒压加热、恒流加热和自己最终选择的功率闭环。开环查表是最初级的做法出厂前预设一张电压/功率对应表根据电池电压查到一个补偿电压输出。好处是省成本、代码量极小但只补偿了电池电压这一个变量发热丝阻值漂移和接触电阻变化完全没法处理精度全靠运气。恒压方案在上一小节已经说过了只能算半程选手。恒流方案稍好一些通过采样电阻闭环稳住电流但功率还受电阻影响换不同阻值的发热丝仍然会跑偏。功率闭环是目前工程上最合理的方案原理是采样发热丝两端的实际电压和流过它的实际电流两者相乘算出真实功率和设定目标比较然后通过调整驱动占空比去修正误差。这套思路复杂度不算高但涉及采样精度、控制频率、PID参数整定这些细节好在做出来后适应性很强阻值范围、电压范围都能自动兜住。2. 系统架构与核心参数计算2.1 整体架构拆解先看整体电路架构我用的方案可以分成几个模块电池输入、MOS开关驱动、发热丝负载、电压电流采样、MCU控制和保护逻辑。电池进来后先经过一个保险丝和一个低阻抗的电流采样电阻然后接到MOS管的漏极MOS管源极直接接地发热丝一端接电池正极另一端接MOS管的漏极也就是发热丝串联在电源正极和开关管之间。这样做的原因是发热丝需要大电流把它放在高端会让驱动电路复杂化低端驱动用一颗N沟道MOS就能解决导通阻抗也低适合便携设备的空间和成本约束。MCU这一侧负责两件事输出PWM到MOS的栅极去控制导通比例同时用ADC去读取电压采样点和电流采样点的模拟量。所有闭环计算都在MCU里完成外设只需要一个定时器输出PWM和一个ADC连续采样最基础的8位单片机就能跑起来这也是这类控制方案能被大量产品采用的原因之一。2.2 采样电路与关键元件的选型计算采样是整个闭环的地基。电压采样相对简单发热丝工作电压最高也就4.2V左右直接用电阻分压网络把电压衰减到ADC量程内就行。我这里把分压比例设定为2:1也就是ADC读到的电压是实际电压的一半这样4.2V对应2.1V留足了余量。电流采样要稍微多想一层。方案上用一颗毫欧级采样电阻串联在电路中通过测它两端的压差来反推电流。采样电阻阻值选大了功耗吃不消选小了信噪比不够。我选的规格是10毫欧额定电流设定在15A左右那它上面的压降最大是0.15V对应功耗0.225W用一颗1W的贴片电阻就能稳定扛住。接下来是采样放大。15A的电流在10毫欧电阻上只产生150mV压降如果直接送ADC量化精度不够特别是低功率档位只有几安培电流时压降几十毫伏很容易被噪声淹没。所以电流信号要经过一个运放放大。我用的放大倍数是20倍这样15A对应3V正好接近ADC量程同时又保留了一定的线性余量。运放选的是轨到轨单电源型号3.3V供电下能输出到接近3.2V保证高电流端不削顶。分压网络和放大电路的时间常数要控制在微妙级别不能拖慢采样环路。滤波电容取值宁小勿大我用的是1nF左右的陶瓷电容配合几十千欧的电阻截止频率大约在几十千赫兹既能滤掉一部分高频开关噪声又不会把功率计算用的瞬时信号抹平。2.3 控制环路PID与PWM的配合逻辑恒功率控制的核心是把“算功率”和“调占空比”这两件事循环跑起来。每一次控制周期里MCU先通过ADC读取电压和电流采样值按比例换算成真实电压和真实电流功率就是两者相乘的结果。把这个瞬时功率和用户设定的目标功率做差得到误差值然后在PID控制器里换算成PWM占空比的修正量。我的控制周期选在20kHz也就是说每50微秒完成一次采样和计算。这背后有两个理由第一发热丝的热惯性非常小尤其是细丝温度响应在毫秒量级控制频率低于1kHz时就会看到明显的功率波动第二20kHz刚好高于人耳的听觉上限避免在电感或者电池线上产生可闻的啸叫噪声。PID参数不需要面面俱到实际中只用了PI两个环节微分项基本没用。原因是发热丝的功率响应存在一定的滞后微分项容易把MOS驱动搞得太激进反而让PWM占空比剧烈跳变。P项负责快速纠正大偏差I项负责消除稳态误差。断断续续调了几轮之后适合这套负载的P值大概在8到12之间I值在0.05到0.1之间电机出PID参数会对不同负载差异巨大每次换发热丝规格都需要重新整定这是后话。在启动瞬间发热丝从冷态开始电阻值较低同样的电压下电流会比稳定工作时大不少。这时候如果直接一上来就满功率追击瞬时电流会突破电池能力极限还可能导致MOS过热或电池低压保护。我在软件里加了一个缓启动逻辑目标功率不是一上来就给满而是分几个阶段抬高每个阶段维持几十毫秒让发热丝逐步进入工作状态整体体验会更顺。3. 实操过程与核心环节实现3.1 测试环境搭建与负载模拟写固件之前我先在测试台上把硬件跑通。我用的是一块手焊的测试板电池用电感模拟没有直接接真电芯用的是可编程直流电源电压设定在3.7V带载能力能到20A这样测起来不会受电芯内阻影响数据也干净。负载端本来可以直接接一颗发热丝测试但我一开始用的是无感的功率电阻阻值按目标发热丝规格取比如我要模拟0.4欧的负载就用两颗0.8欧的大功率电阻并联。好处是阻值不受温度影响测试期间功率读数稳定方便验证控制环路的纯逻辑部分。等控制逻辑确认没问题再接真发热丝做温度漂移测试。测试过程中我同时接了电流探头和电压探头在发热丝两端用示波器观察波形。示波器看的是瞬时值可以直观看到PWM驱动时电压和电流的开关波形判断有没有振铃、有没有过冲。MCU里的功率计算值是经过数字滤波的示波器上则能捕捉到每次开关瞬间的真实电流尖峰两者对照来看才能发现问题。3.2 软件控制环落地细节控制逻辑的代码不复杂但有几个细节直接关系到最终效果。ADC采样不能直接读一次就用。PWM开关会导致发热丝两端的电压电流在一个周期内经历从零到峰值的跳变如果采样点刚好落在开关瞬态上读到的数值就没有代表性。我在一个控制周期内连续采样4次分别放在PWM周期的不同相位上再取平均值。这比单次采样稳得多等效于把开关纹波滤掉了一部分算出来的功率值更接近真实均值。乘法和除法在单片机上的代价要算清楚。功率是两个16位变量的乘积结果用32位保存这个还好。但PID计算里的除法容易拖慢周期如果每次都调用软除法库20kHz的周期很难跑满。我在代码里把PID系数都改成整数定标形式比如把0.08的积分系数乘以256后存在8位整型里每次计算完右移8位还原省掉浮点运算整个控制周期实测不到20微秒就能完成。另一个关键点是占空比的限幅。PWM最大占空比不能给到100%因为低端MOS的开关需要死区时间回头给栅极充电如果占空比顶到满会直接失去开关能力。我这套方案把最大占空比限制在92%左右剩余的时间留给开关切换和采样稳定。最小占空比限制在5%低于这个值就干脆关断输出避免极低占空比下电流断续带来的噪声和不受控状态。代码骨架大概长这样#define ADC_VOLT_SCALE 2.0f // 电压分压比例 #define ADC_CURR_SCALE 20.0f // 电流放大倍数 #define SHUNT_RES 0.01f // 采样电阻10毫欧 float measure_power(void) { uint16_t adc_v read_adc(ADC_CH_VOLT); uint16_t adc_i read_adc(ADC_CH_CURR); float volt adc_v * ADC_REF / ADC_MAX * ADC_VOLT_SCALE; float curr adc_i * ADC_REF / ADC_MAX / ADC_CURR_SCALE / SHUNT_RES; return volt * curr; } void control_loop(void) { static float integral; float target get_target_power(); float power measure_power(); float error target - power; integral error * INTEGRAL_SCALE; float output KP * error KI * integral; if (output PWM_MAX) output PWM_MAX; if (output PWM_MIN) output PWM_MIN; set_compare(output); }3.3 实测数据与调参记录硬件和代码都就位之后我开始记录输出数据。初始状态是目标功率30W负载用0.4欧的功率电阻模拟电源电压调成3.7V。第一版控制参数P给得偏大取到20结果示波器上能看到功率在目标值附近来回摆动波形像过阻尼一样有衰减振荡。把P降到10之后稳定时间从原来的200毫秒左右缩短到80毫秒左右稳态误差控制在正负1W以内。接下来做阻值漂移测试。我把负载电阻换成0.6欧发现稳态功率短时间会掉到28W附近但积分项会在几百毫秒内修正回来最终回到目标值。这个测试说明闭环对负载变化的敏感性是为了应对发热丝温度变化设计的关键特性哪怕换成容差不同的雾化芯最终也能锁住目标功率。电池电压变化的测试也同样验证了环路价值。我把输入电压从4.2V逐步降到3.2V每0.1V记一次稳态功率。结果全程功率波动在正负1.2W以内满电和低压的差别基本可以忽略。相比之下同样条件下开环恒压方案功率从满电时的38W掉到了低压时的25W差距一目了然。表: 30W目标功率下不同输入电压的实测功率输入电压闭环恒功率开环恒压4.20V30.1W38.2W3.90V29.8W30.5W3.60V30.3W26.7W3.30V29.7W25.1W4. 常见问题与排查技巧实录4.1 功率波动与噪声干扰做闭环控制最常遇到的微信“屏幕闪烁”式问题是功率数值在小数点附近跳来跳去面板上看着不难受实际输出其实也在跟着抖。这个情况多半不是控制环没调好而是采样信号污染严重。开关节点是最大的噪声源MOS管在导通和关断的瞬间会产生纳秒级的电压尖峰如果ADC采样线和功率线靠得太近这个尖峰就会被采样电路捡进去。解决方法是把采样电路的走线远离开关节点并且在地线上做单点接地。软件层面我也会在ADC读取后做一个中位值滤波连续读5次取中间3个值的平均思路上简单但对抗随机尖峰非常有效。注意滤波不能做得太厚否则控制环路的带宽被拖慢功率波动反而变大。4.2 MOS管发烫和低压误保护整机测试时发现一个小批量的现象同一个设计有的板子MOS管温度偏高有的正常。查到最后是栅极驱动电阻的问题。MOS管开关时需要一定的栅极充电电流驱动电阻太大开关时间变长开关损耗上升管子自然发烫。把栅极电阻从100欧降到12欧之后结温明显下降。但是电阻也不能太小太小了开关振铃会变大需要根据驱动能力和MOS栅极电容选一个平衡点。低压保护的问题更隐蔽。我设了3.2V的低压保护阈值按道理电池低于这个值才切断输出但测试的时候发现有些板子3.6V就触发保护了。查了半天发现是采样电路在PWM关断期间采到了电感反压的毛刺瞬时电压被ADC误当成电池电压。解决办法是让电池电压采样和驱动PWM错开在驱动导通稳定之后再采也就是在控制循环里加一个时间窗只允许在PWM高电平稳定区间读取电池电压。4.3 发热丝接触电阻的修正策略发热丝和电极之间不是理想接触夹持稍微松一点接触电阻可能多出0.05欧以上。这个数值在0.15欧的低阻发热丝面前占到了相当比例闭环虽然能把总回路功率稳住但接触电阻会分担一部分功率发热丝自身获得的功率反而不达标。所以做恒功率输出时不能只盯总功率还要考虑接触电阻误差带来的发热丝端电压降损失。我的做法是出厂前做一次校准先用已知阻值的精密电阻替代发热丝测量整机在不同功率档位下的实际输出电压和电流建立一条校准曲线修正分压系数和采样放大的固有偏差。这个步骤在批量生产时尤其重要因为运放的零漂和电阻分压误差每个板子都略有不同靠软件校准可以把一致性拉到正负1%以内。需要提一句如果发热丝是现场更换的接触状态不稳定的时候校准效果会打折扣这也是这类设备普遍采用一次性雾化芯结构的原因之一。从我个人的实际体会来说恒功率输出这套方案最大的价值不是把功率算得有多精准而是把电池、负载、温度这些变量全都统一到一个闭环里让使用者感受到的输出尽量一致。做这类系统不要一开始就追求复杂的算法先把采样这条链路做干净把PWM开关频率和控制周期定好PID用最简单的PI结构就能解决大部分问题。后续如果想继续扩展可以加入实时功率反馈显示、温升曲线记录甚至通过上位机动态调参都是在现有这个闭环骨架上加肉的事。希望这篇能帮正在调这套逻辑的同行少走一点弯路。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/20 23:01:11
考虑灵活性供需不确定性的储能调峰优化配置MATLAB建模
2026/10/20 23:01:11
AI辅助开发新选择:Auland-UI提示词优先组件库实战评测
2026/10/20 23:01:10
CF1554D Diane构造题详解:让所有子串出现奇数次
2026/10/20 23:51:34
汽车玻璃异形孔加工:从水刀到激光划线的工艺切换实录
2026/10/20 23:51:34
AI入门指南:理解能力边界与高效沟通的底层逻辑
2026/10/20 23:51:34
MoE计算原理与执行过程:从Router打分到专家并行与负载均衡
2026/10/20 23:51:34
HDFS Shell操作全攻略:从文件读写到权限、配额与排错实战
2026/10/20 23:51:34
用AudioContext打造动态音乐播放界面:从解码到频谱可视化
2026/10/20 23:46:34
Agent工程栈分层成形:编排、工具、记忆与可观测性实践
2026/10/20 1:05:26
WSL下STM32开发板烧录指南:USB透传与OpenOCD实操
2026/10/20 1:05:26
ROS2工业级开发:实时性、资源适配与可交付验证体系
2026/10/20 1:05:26
STM32+华为云IoT+Qt构建智能家居远程控制系统全解析
2026/10/20 16:07:12
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/20 7:57:25
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/20 16:49:38
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/20 2:24:03
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/20 2:23:57
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/20 2:23:53
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)