ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32驱动57闭环步进电机:从接线到梯形加减速的完整实践

STM32驱动57闭环步进电机:从接线到梯形加减速的完整实践 最近帮朋友调一台小型点胶机原来用的是57开环步进画圆画方都能走但只要频繁启停和往返位置就开始慢慢漂。换伺服成本太高最后换成了57闭环步进情况马上就不一样了。驱动它的不是专用运动控制卡而是一块很常见的STM32F103ZET6。很多人一听“闭环步进”就以为很复杂实际上它的上位机接口和普通步进一样仍然是脉冲加方向MCU发脉冲就能驱动。这套组合特别适合桌面级数控、三轴平台、绕线机、送料机构这些中低速定位场景成本适中、可靠性和抗丢步能力都很不错。如果你手里正好有F103系列的板子又想让57闭环步进电机转起来这篇内容基本可以让你少走很多弯路。从连线到代码再到上电调试常见的坑我都会按实操顺序讲清楚。1. 为什么是F103ZET6加57闭环一套足够稳的桌面级运动控制方案1.1 闭环步进和开环步进、伺服到底差在哪先解决一个基础问题为什么要用闭环步进开环步进的逻辑很简单控制器发一个脉冲电机就走一步至于这一步实际有没有走到位系统完全不知道。一旦负载变大、速度太快、加减速过猛电机就会丢步。麻烦在于开环步进丢步之后位置是永久性错误必须回到原点重新校准。点胶机这类设备一旦位置漂移胶点位置全偏返工成本很高。57闭环步进则是在电机尾部加装了编码器驱动器会实时检测转子的实际位置。某个时刻如果发现实际位置落后或者超前于指令位置驱动器内部的位置环会通过调整绕组电流来补偿。重点在于这个闭环补偿完全在驱动器内部完成STM32只需要负责发送脉冲序列。所以站在MCU的角度看闭环步进和开环步进的接口完全一样接线和代码的复杂度几乎没有增加。和伺服电机相比闭环步进也有明显区别。伺服电机通常带光编或者磁编驱动器做电流环、速度环、位置环三闭环动态响应快、高速性能好但价格高、调试复杂。闭环步进本质上还是步进电机响应速度有限优点是便宜、皮实、低速扭矩大。在300到600转以下的定位场景里闭环步进的性价比是最高的。不少人一开始纠结“要不要直接上伺服”我的看法是除非你要求极高的响应速度或者连续高速运动否则57闭环完全够用。1.2 F103ZET6够不够用定时器资源盘点STM32F103ZET6的主频72MHzCortex-M3内核对于发脉冲这个任务来说核心资源是定时器。它有两个高级定时器TIM1和TIM8四个通用定时器TIM2、TIM3、TIM4、TIM5每个通用定时器有4个独立PWM通道。也就是说单芯片理论上可以同时产生多路可调速脉冲驱动多个轴。再加上普通GPIO做方向、使能、限位、原点信号资源绰绰有余。ZET6这个型号有144个引脚、512KB Flash、64KB RAM。跑一个梯形加减速规划器、几个轴的逻辑控制、串口通信都非常宽裕。我实际用到的是TIM3_CH1发脉冲PA7做方向PC5做使能TIM4做1ms调度中断USART1和上位机通信。剩余大部分资源还闲着后面扩展继电器、触摸屏、485通信都不用换芯片。如果只控制一两个轴用C8T6也完全够代码可以直接平移。选ZET6主要看中引脚多、Flash大以后扩展其他外设时不用重新设计硬件。不过要注意F103系列没有硬件浮点单元加减速计算时尽量避免大量浮点运算用整数运算就够了。1.3 驱动器与电机选型匹配我手上这套是57闭环电机配套的驱动器类似雷赛2CL57这个级别。额定电压DC24到50V峰值电流5A以上支持脉冲加方向和CW/CCW双脉冲两种控制模式最高输入脉冲频率一般是200kHz或500kHz。细分通过拨码开关设置常见8细分对应1600脉冲每圈16细分对应3200脉冲每圈。57电机本身的保持扭矩一般在1.2到2.2N·m具体看电机长度规格。选型时有个很容易忽略的地方57闭环电机必须配同品牌的驱动器因为编码器接口的电气定义、线序、编码器线数并不是通用标准。我见过有人把A家的电机编码器线插到B家的驱动器上一上电就报警。如果你的电机和驱动器是分开买的一定要确认编码器类型和接口定义完全一致。电源容量也要算一下。一个57闭环电机的额定电流约2.8到5.6A看具体型号驱动器工作电压24到50V推荐功率在150W以上。如果同时带动两个轴电源要按总电流的1.5倍以上来选否则电机在启动瞬间会拉低电压驱动器容易报欠压。2. 连线前必须想清楚的几件事端子定义、电平匹配、共地处理2.1 驱动器端子的真实含义与常见误区闭环步进驱动器的控制信号端子通常长这样PUL加和PUL减是脉冲输入DIR加和DIR减是方向输入ENA加和ENA减是使能输入还有ALM加和ALM减是报警输出。很多人第一次看到“加”“减”就以为是电源正负极实际上这是一对光耦输入的两端。电流从加号流入、从减号流出光耦导通就算有效信号。最常见的接法是共阳接法PUL加接正电源通常是24VPUL减接控制器的输出引脚。控制器输出低电平时电流从正电源经光耦发光二极管、限流电阻、GPIO流入地产生有效脉冲。控制器输出高电平时两端电位差变小光耦不导通。所以在这种接法下有效信号是低电平脉冲。DIR和ENA同理。容易犯的误区有三个。第一个把PUL加接到GND以为“负脉冲也对”结果完全不工作甚至可能损坏光耦。第二个不知道ENA是“使能”还是“禁止”。很多驱动器上电后默认使能悬空即可运行。如果接了ENA并让光耦导通反而会脱机。所以建议不要乱接ENA除非确定了驱动器逻辑或者你需要用软件控制脱机。第三个忽略限流。24V直接接到只有5V规格的光耦输入端很可能烧掉限流电阻或光耦。2.2 3.3V的STM32怎么驱动24V光耦输入STM32F103的GPIO输出高电平是3.3V而驱动器光耦输入回路接的是24V两边怎么匹配答案就是让GPIO做低边灌电流开关。我采用的接法如下PUL加接24V正极。有些驱动器内部已经串了限流电阻如果没有需要外串一个2到3.3kΩ的电阻。PUL减接STM32的PA6。DIR加接24V正极。DIR减接STM32的PA7。ENA加悬空使用默认使能。如果需要软件脱机ENA加接24VENA减接PC5。GPIO输出低电平时24V经过限流电阻和光耦LED从PA6灌进MCU地线典型电流约10mASTM32的GPIO灌电流上限是25mA安全。GPIO输出高电平3.3V时光耦两端几乎没有压差不导通也就没有脉冲。这样我们就用3.3V的IO管脚安全地控制了24V光耦回路。这里有个重要细节控制信号线最好用双绞屏蔽线屏蔽层单端接地一般接驱动器电源GND。不要把信号线和电机动力线绑在一起否则脉冲线会感应干扰高速时容易出现偶发丢步。这个属于现场经验后面调试部分还会再提到。还有一个容易忽略的点是共地。共阳接法下GPIO低电平时PA6被内部开关拉到GND24V电流沿光耦、限流电阻、PA6流入MCU GND再回到24V电源负极。如果MCU的GND和24V电源的GND电位差过大信号就会不可靠。最简单稳妥的处理方式是把MCU板卡的地和24V开关电源的GND接在一起。控制信号回路电流很小不用担心大电流串扰问题。2.3 动力线、编码器线、电源线和信号线的完整连接顺序我建议在断电情况下先接主回路再接编码器最后接信号线。第一步接驱动器电源。24到48V直流电源接到驱动器VCC和GND正负确认无误再上电。虽然多数驱动器有防反接但反接容易直接损坏内部电容。上电后观察驱动器数码管是否正常显示。第二步接电机动力线。57闭环步进电机一般是四根线A加、A减、B加、B减颜色各家不同按驱动器面板或说明书标注接入。接错相的直观现象是电机锁住时抖动、异响或者一转就失步。如果发现方向反了优先通过改变DIR信号处理不要随便换A/B相。闭环驱动器内部有编码器相位校验随便换线可能触发报警。第三步接编码器线。编码器线是驱动器实现位置反馈的关键插头要插到位并锁紧。编码器线不要延长超过推荐长度一般控制在20米以内。线径要够粗屏蔽要好否则高噪声环境下编码器信号受干扰驱动器会报编码器异常。第四步接控制信号线。按上面的共阳接法把PUL、DIR接到STM32。上电后电机应该锁止并发出轻微的“嗡”声此时给一个低电平信号看电机是否转动。2.4 接线自检表与最容易出错的三个位置下表是我每次上电前都会对照检查的清单你可以直接抄对象接法检查要点电源正驱动器VCC确认电压24到48V万用表实测电源负驱动器GND与MCU GND共地A相A加/A减接电机对应线颜色按说明书不能接反B相B加/B减接电机对应线颜色按说明书编码器对应接口插紧锁扣旋紧断电插拔PUL加接24V正若驱动器无内置限流则串2到3.3kΩ电阻PUL减接PA6低电平有效DIR加接24V正同上DIR减接PA7低电平有效ENA加悬空默认使能ENA减悬空默认使能最容易出错的位置有三个。第一个坑PUL加接5V而不是24V。有些驱动器在5V时电流不足表现为时转时不转。如果要用5V需要确认光耦输入规格必要时减小外串电阻但最小不要低于1kΩ否则GPIO灌电流可能超限。第二个坑编码器插反。有些编码器串行通信是有方向性的插反后上电驱动器直接报警。正确做法是断电安装按插头形状防呆不要硬插。第三个坑共地。STM32板和开关电源之间没有共地时高速脉冲可能随机少计数位置时准时不准确。这个问题最隐蔽很多人查代码查半天最后发现是地线没接。3. 产生脉冲这件事还是交给定时器PWM3.1 为什么GPIO翻转生成脉冲不靠谱新手上路的第一反应通常是用普通GPIO拉高拉低加延时翻转来产生脉冲。比如给个10微秒延时翻转一次。这种做法有两个致命问题。一是延时函数受中断影响频率不准脉冲间隔有抖动。STM32里SysTick、串口中断、定时器中断都会打断延时循环导致脉冲间隔忽长忽短。步进电机对脉冲间隔的均匀性比较敏感间隔抖动会让电机噪音变大甚至诱发失步。二是CPU被完全占用。一边要发脉冲一边还要执行加减速逻辑、处理通信、读取传感器根本忙不过来。脉冲频率越高CPU占用越严重整个程序就像卡死一样。解决办法是使用定时器的PWM输出。脉冲频率由硬件计数决定完全不受软件干扰。CPU只需要在需要修改频率时写一次寄存器其他时间可以去做别的事。STM32F103ZET6的72MHz时钟理论上可以输出到MHz级PWM实际驱动57闭环步进最多用到200到500kHz富余量很大。定时器PWM还有一个天然优势支持自动重装载预装载。修改频率时新值不会立即生效而是等当前计数周期结束后才加载不会产生瞬间毛刺。这个特性在加减速过程中非常关键。3.2 引脚分配与PWM初始化代码我选PA6做脉冲输出原因很简单PA6是TIM3_CH1的默认复用引脚不需要重映射在F103ZET6和C8T6上位置都一样焊接、飞线都方便。PA7做方向输出普通GPIO推挽即可。PC5做使能输出如果不需要脱机控制可以不接。初始化代码使用HAL库CubeMX生成和手写效果一样。下面是可以直接用的版本TIM_HandleTypeDef htim3; void Motor_PWM_Init(void) { GPIO_InitTypeDef gpio {0}; TIM_OC_InitTypeDef oc {0}; __HAL_RCC_TIM3_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); // PA6: TIM3_CH1 复用推挽 gpio.Pin GPIO_PIN_6; gpio.Mode GPIO_MODE_AF_PP; gpio.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, gpio); // PA7: 方向输出 gpio.Pin GPIO_PIN_7; gpio.Mode GPIO_MODE_OUTPUT_PP; gpio.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, gpio); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); // TIM3 输出100kHz初始速度方便调试 htim3.Instance TIM3; htim3.Init.Prescaler 0; htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 719; // 720-1 htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(htim3); oc.OCMode TIM_OCMODE_PWM1; oc.Pulse 359; // 50%占空比 oc.OCPolarity TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim3, oc, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); }注意AutoReloadPreload一定要使能。这样后续修改ARR时新值不会立即生效而是等本次计数周期结束后才加载不会导致脉冲宽度突变电机运行时就不会一顿一顿。3.3 脉冲频率与转速、细分的换算驱动闭环步进STM32只需要关心每秒钟发多少个脉冲。电机转一圈需要多少脉冲取决于驱动器细分数。以1.8度步距角的57电机为例电机整步走一圈需要200个脉冲因为360除以1.8等于200。驱动器设为8细分则一圈需要200乘以8等于1600个脉冲。驱动器设为16细分则一圈需要200乘以16等于3200个脉冲。已知目标转速和细分算频率的公式很简单freq rpm / 60 × 200 × 细分例如目标转速150rpm8细分freq 150 / 60 × 200 × 8 4000Hz也就是说只需要让定时器输出4000Hz的PWM电机就会以150rpm旋转。反过来知道当前PWM频率想算转速就用这个公式rpm freq × 60 / (200 × 细分)位置方面更直观。要走50圈在8细分下就是50乘以1600等于80000个脉冲。只要把80000个脉冲精确发出闭环驱动器就能把电机带到对应位置。所以整个运动控制可以抽象成三件事控制频率控制速度控制脉冲总数控制位置控制方向信号控制方向。这三件事刚好对应定时器PWM、更新中断计数、普通GPIO。3.4 位置脉冲计数、方向切换、使能控制的代码实现先看最简单的频率设置函数void Motor_Set_Freq(uint32_t freq_hz) { uint32_t arr; if (freq_hz 1) freq_hz 1; if (freq_hz 200000) freq_hz 200000; arr 72000000UL / freq_hz - 1; __HAL_TIM_SET_AUTORELOAD(htim3, arr); __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, arr 1); }原理是TIM3输入时钟72MHzPSC设为0所以PWM频率等于72MHz除以ARR加1。要求4000Hz时ARR等于72000000除以4000再减1等于17999。CCR设置为ARR的一半保证50%占空比。方向控制函数void Motor_Set_Dir(uint8_t dir) { if (dir) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); } }实际接线是DIR减接PA7低电平有效。PA7等于0对应一个方向PA7等于1对应另一个方向。如果发现方向反了把代码里的0和1对调即可不用改线。使能控制函数void Motor_Enable(uint8_t en) { // ENA-接PC5低电平有效悬空时默认使能 if (en) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); } else { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET); } }脉冲计数可以放到更新中断里。但要注意如果脉冲频率很高比如超过20kHz每个脉冲都进中断CPU会非常吃力。高频场景建议用定时器级联让TIM3每次溢出时自动唤醒另一个定时器计数无需进中断。本示例以低速点位运动为主直接用更新中断逻辑清晰uint32_t g_pulse_count 0; volatile uint32_t g_pulse_target 0; void TIM3_IRQHandler(void) { if (__HAL_TIM_GET_FLAG(htim3, TIM_FLAG_UPDATE)) { __HAL_TIM_CLEAR_FLAG(htim3, TIM_FLAG_UPDATE); g_pulse_count; if (g_pulse_count g_pulse_target) { Motor_Set_Freq(0); // 停脉冲 HAL_TIM_PWM_Stop(htim3, TIM_CHANNEL_1); } } }每次开始运动前要把g_pulse_count清零设定g_pulse_target然后启动PWM。停止后如果要再次运行记得重新调用HAL_TIM_PWM_Start。4. 加减速不做好闭环步进照样报警4.1 步进电机的矩频特性决定了必须缓启缓停步进电机有一个矩频特性转速越高输出扭矩越低。假如一上来就给几百kHz的脉冲电机根本没有足够扭矩跟上指令。即使闭环驱动器有位置环电机实际位置也会落后很多驱动器检测到位置偏差超过允许范围就会报警或者补偿失败。这跟你用多好的闭环驱动器没关系是电机物理特性决定的。所以运动控制里几乎没有“直接跳到目标速度”这种操作。常见做法有两类梯形加减速和S型加减速。梯形加减速实现简单、调试直观用在点胶、送料、雕刻机这类中低速设备上完全够用。S型加减速加速度连续变化适合需要平滑运动的场合但代码复杂一些可以先不做。梯形加减速的模型很简单启动后从起始频率逐步升到目标频率到达目标频率后匀速走一段接近目标位置前逐步降到停止频率最后停住。关键就是“逐步”两个字对应到代码就是周期性地修改PWM频率让它每次改变一点点。4.2 调速的本质在1ms调度里修改ARR我在实践中喜欢把加减速做成一个1ms周期任务。每1ms根据当前频率和目标频率的差距加一次频率步进量或者减一次然后调用Motor_Set_Freq去更新定时器ARR。这个1ms调度可以用SysTick也可以另开一个定时器中断看你的程序架构。以之前的例子目标速度150rpm8细分对应4000Hz。假设要求0.3秒内从0加速到4000Hz那么每1ms需要增加4000 / 300 ≈ 13.3 Hz代码里取整为13或14Hz每毫秒即可最终加速时间误差很小。减速同理在接近目标位置时把目标频率设为0按同样步进降下来。修改频率的具体动作就是Motor_Set_Freq里的__HAL_TIM_SET_AUTORELOAD。由于初始化时开了预装载ARR变更会等当前PWM周期结束再加载不会出现半个脉冲被截断的毛刺。这在工业运动控制里是很重要的细节。占空比也要同步改否则ARR变了而CCR没变占空比可能变成10%光耦导通电流不足脉冲信号就不可靠。4.3 一个能直接用的梯形加减速示例我一般用一个简单的状态机去管理运动流程空闲、加速、匀速、减速、完成。typedef enum { MOTOR_IDLE, MOTOR_ACCEL, MOTOR_RUN, MOTOR_DECEL, MOTOR_DONE } Motor_State; volatile Motor_State g_state MOTOR_IDLE; volatile uint32_t g_cur_freq 0; // 当前频率 volatile uint32_t g_target_freq 0; // 目标频率匀速段 volatile uint32_t g_acc_step 14; // 每1ms频率增量 volatile uint32_t g_dec_step 14; // 每1ms频率减量 volatile uint32_t g_pulse_total 0; // 本次总脉冲数 volatile uint32_t g_pulse_decel 0; // 减速点剩余脉冲数 void SysTick_Handler(void) { switch (g_state) { case MOTOR_ACCEL: g_cur_freq g_acc_step; if (g_cur_freq g_target_freq) { g_cur_freq g_target_freq; g_state MOTOR_RUN; } Motor_Set_Freq(g_cur_freq); break; case MOTOR_DECEL: if (g_cur_freq g_acc_step) { g_cur_freq - g_dec_step; } else { g_cur_freq 0; g_state MOTOR_DONE; } Motor_Set_Freq(g_cur_freq); break; case MOTOR_RUN: // 检查剩余脉冲到达减速点转入减速 if (g_pulse_count g_pulse_total - g_pulse_decel) { g_state MOTOR_DECEL; } break; case MOTOR_DONE: Motor_Set_Freq(0); HAL_TIM_PWM_Stop(htim3, TIM_CHANNEL_1); g_state MOTOR_IDLE; break; default: break; } }这里我没有详细写g_pulse_decel的计算实际就是根据当前频率和减速度反推需要多少个脉冲来减速。梯形加减速不追求完美只要确保开始减速后不会冲过目标位置就行。开始一次运动时设置好目标频率、总脉冲数、方向然后把状态切到加速启动PWM剩下的交给1ms调度即可void Motor_Move(int32_t pulse_count, uint32_t target_freq, uint8_t dir) { Motor_Set_Dir(dir); g_pulse_count 0; g_pulse_target pulse_count; g_target_freq target_freq; g_cur_freq 0; g_state MOTOR_ACCEL; HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); }要提醒的是pulse_count带符号时方向由DIR决定g_pulse_target只取绝对值。4.4 换向、急停、限位联动的处理思路换向不是简单改一下DIR就完事的。电机正在高速旋转时突然改变方向相当于要求它在极短时间内从正转到反转步进电机根本做不到容易过冲或失步闭环驱动器也可能报警。正确做法是先减速到0停下再切换方向重新加速。急停则要快。真正的紧急情况没时间做梯形减速软件急停就是立刻关闭PWM输出同时把驱动器使能信号断开。断开使能后电机是自由状态可以人工盘动如果需要紧急锁止就继续保持使能。具体取决于现场安全要求。急停之后要记得清理状态机状态复位脉冲计数避免恢复运行时不知道从哪里开始。限位信号建议用外部中断加GPIO读取双重保险。触发限位后第一件事是停PWM然后是标记运动任务终止。如果用了梯形加减速状态机限位触发可以直接把状态置为完成因为此时继续减速已经没有意义紧急情况优先停止。5. 上电调试的现场经验不动、抖动、方向反、丢步逐个拆5.1 电机锁住但不转按这个顺序查如果上电后电机锁住了但发脉冲不转我的排查顺序如下。第一确认PWM波形真的出来了。用示波器看PA6对地波形正常应该有方波频率和目标值一致。没有示波器的话用万用表频率档也可以测出大致频率。如果波形都没有问题在MCU配置检查CubeMX时钟树和定时器初始化。第二确认PUL接法。按照共阳接法PUL加接24VPUL减接PA6。如果接反了GPIO无法拉低光耦负端就永远没有有效脉冲。用万用表量PA6在低电平时的电压应该接近0V。第三确认ENA没有误接导致脱机。很多驱动器默认使能如果你接了ENA而且让它导通了电机可能没有锁止力。如果电机没有锁止先处理使能问题。第四确认脉冲频率没有超出驱动器设定范围。比如你直接调200kHz但驱动器最高只支持200kHz临界值附近也不可靠。把频率先设成1kHz看看电机是否一转就停。5.2 低速抖动和力矩不足多半不是代码问题低速时电机抖动、噪音大或者启动就失步常见原因有四类。第一驱动器电流拨码设置不对。57闭环电机一般有额定电流驱动器上有电流档位拨码要按电机铭牌标称值设置。电流太小低速扭矩不足电流太大电机会发热、振动加剧。第二细分设置不一致。比如驱动器实际配的是16细分而代码里按8细分算脉冲数速度和位置都会差一倍。但这不是抖动的主要原因抖动通常是相电流配合问题。第三闭环参数不合适。不少闭环驱动器提供刚性或位置刚度设置默认值在轻载时通常可以但负载惯量较大时位置环增益太高会低频振荡表现为电机低速来回抖温度也高。此时适当降低刚度观察是否改善。这个问题和代码无关全部在驱动器面板或软件上调整。第四编码器问题。电机低速抖动但锁止正常也可能是编码器信号毛刺导致驱动器持续纠偏。检查编码器线是否松动、是否和动力线捆在一起有条件用示波器看编码器AB相波形是否干净。5.3 高频丢步、报警从信号完整性和加速时间找原因高速时出现随机丢步位置不准或者驱动器偶尔报跟随误差超限我的建议是先不要怀疑代码逻辑按下面顺序查。第一信号线质量。脉冲线尽量短采用双绞屏蔽线避免和电机动力线平行走线。如果现场电磁干扰强把屏蔽层单端接地。第二差分信号。如果STM32和驱动器距离超过1米建议用差分转换芯片比如AM26LS31把单端脉冲转成差分信号接到驱动器的PUL加PUL减和DIR加DIR减上。很多工业驱动器都有差分输入接口抗干扰能力强很多。第三加速时间。高频丢步最常见的原因就是加速太猛。把梯形加减速的每ms频率增量调小比如从14Hz每ms改到5Hz每ms看看还会不会丢步。如果明显好转说明物理上电机吃不下这么大的加速度。第四参考电流。供电电压偏低或电源功率不够高速时母线电压跌落驱动器会报欠压也是高频失步的诱因。用万用表在高速运行瞬间观察24V电源电压有没有明显下跌。5.4 闭环参数、编码器接线与热插拔的教训最后说几条用57闭环步进最容易踩的现场教训。接线顺序上编码器线一定要在断电状态下插拔。编码器内部是精密光电器件或磁编码器芯片热插拔产生的浪涌很容易把它干掉而且这种损伤是慢性的可能当场没坏用几天后开始丢位置非常难查。吃过一次亏之后我就养成了习惯驱动器和编码器之间必须先断电再拔插。闭环参数不要乱动。很多国产57闭环驱动器出厂时默认刚度已经适配了中低负载。如果没有确切的调试方法先只改刚性这一项从默认值往小调每次调完跑一遍测试。不要多个参数一起改否则出了问题根本不知道是哪个改坏了。另外如果项目里同时有多台57闭环电机驱动器和电机、编码器的编号要一一对应最好在接线时写上标签。我之前在一个两轴平台上因为把两条编码器线对调导致两个轴都在补偿错误的位置现象是低速能走、高速乱跑排查了很久才发现是交叉接线。我个人的习惯是每接到一套新的57闭环驱动器和电机第一件事不是写代码而是先把驱动器和电机接好用面板上的手动JOG功能摇两下确认驱动器面板速度、方向显示正常再回过来写STM32的程序。这样可以先把电机和驱动器这套子系统验证好后续调试MCU时变量就少很多。如果你刚开始接触这个组合建议也这样把系统拆成“驱动器加电机”和“MCU控制”两半分别排错会比从头到尾拉通调试轻松得多。等这套跑顺了后面在此基础上加RS485、多轴联动、触摸屏上位机都是水到渠成的事。
返回列表