用 ESP32 做了个太阳能盖板升降——到位后总溜车,折腾半天是抱闸时序没对上
用ESP32做了个太阳能盖板升降——到位后总溜车,折腾半天是抱闸时序没对上
#ESP32 #抱闸电机 #限位开关 #执行器 #调试踩坑
我家院子有个简易太阳能板,我想做一套自动升降盖板,早上打开、傍晚盖上,用 ESP32 控制一台带抱闸的直流减速电机加艾思控的一款直流驱动器来驱动。功能一开始就能跑,但有个毛病:盖板升到顶停住之后,总会往下"溜"一小段,几十厘米的高度差,看着就让人不放心。查下来根因不在限位,也不在编码器,而是抱闸的吸合、释放和电机扭矩建立之间的时序没对上。下面是我的排坑记录。
一、硬件清单
- 主控:ESP32 DevKit(带 Wi-Fi,方便后面做远程开关)
- 驱动器:艾思控某款直流有刷驱动器(带刹车/抱闸控制脚)
- 电机:24V 直流减速电机,尾部带失电制动器(抱闸)
- 电源:24V 开关电源;抱闸单独一路 24V 经 MOS 管控制
- 传感器:上限位、下限位各一个行程开关
二、接线说明
- ESP32 的 IN1/IN2 接驱动器方向,PWM 脚接调速,BRAKE 脚接驱动器抱闸控制
- 驱动器 OUT 接电机动力线;抱闸线圈单独 24V,由驱动器抱闸脚经 MOS 管通断
- 上、下限位一端接 GPIO 一端接地,内部上拉,触发为低电平
三、现象描述
上升过程中一切正常;碰到上限位后程序停 PWM,但盖板会往下沉一点才停住,大约几厘米到十几厘米不等。更糟的是偶尔在到位瞬间听到"咔"的一声闷响,像抱闸硬咬住还在转的轴。下降到底时也类似,停机瞬间有顿挫。
四、排查过程
第一步,怀疑机械打滑。我先检查卷扬绳和刹车片磨损,重新紧了绳、换了摩擦片,溜车距离几乎没变——排除纯机械原因。第二步,怀疑限位抖动。我用串口打印限位状态,发现上限位触发得很干脆,没有抖动误触发,停机指令也确实下发了——排除限位。第三步,怀疑编码器累计误差导致停早了。把测速环路关掉,纯靠限位停,溜车依旧——说明溜车发生在"停住之后",不是停的位置不对。第四步,重点盯抱闸。我在抱闸线圈两端挂万用表看电压,发现停 PWM 的同时抱闸脚几乎同时断电,抱闸是"立刻咬下去"的,但此时电机轴因为盖板重力还在往下转,抱闸等于在带转的轴上硬刹车,于是先溜了一点、再"咔"一声咬死。
五、根因分析
一是时序错配:失电抱闸要等电机先把扭矩建立起来再释放、停机时要先让电机抱紧力接住负载再彻底失电;我是"停 PWM 和断抱闸"一起干,抱闸在零扭矩下咬旋转轴,自然先溜再硬咬。二是预扭矩缺失:上升到位瞬间电机已停转、电磁扭矩为零,全靠抱闸硬扛重力,必然有一段溜滑。三是抱闸动作滞后:线圈断电到真正抱紧有几十毫秒机械延迟,这段时间电机没有任何反向保持,溜车全发生在这一空窗。
六、解决过程
核心是把动作拆成带延时的三步:停机时先给一小段"反向预扭矩/短接保持",让电机轴基本停稳,再延时几十毫秒才断抱闸;释放时则相反,先让抱闸得电松开、再给驱动输出,避免带闸硬启动。代码片段如下。
const int BRAKE=25, IN1=32, IN2=33; // 抱闸脚/方向脚
void stopWithBrake(){
applyHoldTorque(); // 1) 先给保持扭矩(短接制动)顶住重力
delay(120); // 2) 等轴基本停稳(实测整定)
digitalWrite(BRAKE, LOW); // 3) 再断抱闸,让制动器接住负载
pwmWrite(0);
}
void runUp(){
digitalWrite(BRAKE, HIGH);// 先给抱闸得电松开
delay(80); // 等抱闸完全脱开
dirUp(); pwmWrite(SPEED); // 再驱动,避免带闸启动
}
七、验证结果
改完停机时序后,连续跑了上百次升降:上升到位后盖板稳稳停在限位处,肉眼看不到下沉,也没有那声"咔"的闷响;下降到底同样平稳。我把延时值从 80ms 试到 120ms、150ms,发现 120ms 左右这台机构既不漏溜、也不拖动作,就定下来了。
八、踩坑小结
- 失电抱闸不是"断电就完事",停机要先预扭矩、再延时断闸。
- 释放抱闸要"先松闸再给驱动",带闸启动最伤机构。
- 溜车发生在"停住之后"时,先别去查编码器和限位。
- 延时值用机构实测整定,别照抄别人的毫秒数。
- 抱闸线圈一定并续流二极管,否则关断尖峰易打坏 MOS。
这个项目让我彻底搞懂了"抱闸不是开关,是时序"。你们做升降/卷扬类机构时,溜车是先查机械还是先查抱闸时序?欢迎评论区交流。



