步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因为其高精度、高可靠性、适用范围广等优点,步进电机在化学自动化方向有着广泛的应用。
步进电机驱动器是一种将电脉冲转化为角位移的执行机构。步进电动机和步进电动机驱动器构成步进电机驱动系统。步进电动机驱动系统的性能,不但取决于步进电动机自身的性能,也取决于步进电动机驱动器的优劣。
步进电机控制器中十分重要的参数为微步细分倍数,通过设置此参数,可以将步进电机的步进角进一步细分,达到更为精确控制的目的。
PWM(Pulse width modulation)是一种用脉冲宽度的模拟控制方式,用于控制电能的输出或输出电压和电流的波形。其主要具有以下主要参数:
PWM有着广泛的应用,控制步进电机是其主要功能之一。PWM可以对电机速度和转矩,电机的运行和停止进行调控。
观察步进电机铭牌,可以找到步进电机相关参数。如下图所示:
其中:
1.8°为步进角,表示每次脉冲电机旋转1.8°。
0.6A为工作电流,表示步进电机正常工作时的输入电流。
A+ A─为一组线圈 B+ B─为另一组线圈,其后颜色与电机上的导线颜色相对应。
步进电机的主要计算就是步进电机的转速,而转速由信号的频率决定。
其中:
n 表示电机转一圈所需脉冲数
q 表示步进角(°)
D 表示微步细分倍数
v 表示电机转速(转/秒)
f 表示PWM信号的频率(Hz)
对于步进电机的驱动,其接线核心在于清楚步进电机控制器每个引脚的功能和应该连接的设备与引脚。
此处以某型号的步进电机控制器为例,该驱动器拥有2个6位接线端子和一个6位拨码开关需要我们进行接线和操作。
接线示意图如下:
💡 该步进电机控制器顶部的6位拨码开关用于控制输出电流和微步细分,请根据所驱动的步进电机参数与应用场景,合理进行选择。
如需要全步控制一台额定电流1.0A的步进电机,开关选择应为
S1 S2 S3 S4 S5 S6 ON ON OFF ON OFF ON
esp32中的LEDC库可以方便、灵活的产生指定参数的PWM信号,因此我们采取LEDC库操作步进电机控制器,从而达到控制步进电机的目的。
控制步进电机需要以下几个步骤
💡 记得在包含以下代码的文件中引用ledc库头函数
#include "driver/ledc.h"
// 使用ledc_channel_config函数初始化LEDC Channel之前
// 需要构建包含ledc channel初始化参数的结构体 ledc_channel_config_t
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL, // 指定要初始化的Channel号
.timer_sel = LEDC_TIMER, // 指定Channel绑定的Timer号
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = IO_STEP, // 输出PWM信号引脚编号
.duty = 0, // 占空比
.hpoint = 0};
// 结构体构建完成,向ledc_channel_config传入结构体指针进行初始化
ledc_channel_config(&ledc_channel);
// 使用ledc_timer_config函数设定LEDC Timer
// 首先同样需要构建参数结构体
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = LEDC_TIMER, // 指定要设定的Timer号
.duty_resolution = LEDC_DUTY_RES, // 指定分辨率
.freq_hz = LEDC_FREQUENCY, // 指定PWM频率
.clk_cfg = LEDC_AUTO_CLK};
// 结构体构建完成,向ledc_timer_config传入结构体指针进行设定
ledc_timer_config(&ledc_timer);
// 重新设定占空比
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL, LEDC_DUTY); // LEDC_DUTY为占空比大小
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL);
在操控步进电机时,还需要指明电机旋转方向和输出使能信号。进行完这一系列操作后,可以观察到步进电机根据所需的方向和速度转动。
💡 记得在包含以下代码的文件中引用ledc库头函数并初始化IO口
#include "driver/gpio.h"
// IO_XXX 为信号输出引脚
gpio_reset_pin(IO_ENABLE);
gpio_set_direction(IO_ENABLE, GPIO_MODE_OUTPUT);
gpio_set_level(IO_ENABLE, 0);// 使能信号引脚:低电平有效
gpio_reset_pin(IO_DIRECTION);
gpio_set_direction(IO_DIRECTION, GPIO_MODE_OUTPUT);
gpio_set_level(IO_DIRECTION, 0);// 参数0或1,表示旋转方向
完整步进电机操控代码:
💡 将以下代码刷入esp32设备并正确连接导线,可以观察到步进电机按设置参数转动。
本示例中esp32设备IO端口分配如下:
端口 功能 P0 向步进电机控制器发送使能信号 P1 向步进电机控制器发送方向信号 P2 向步进电机控制器发送PWM信号
💡 有关如何编译代码并刷写esp32设备,请参考化学自动化开发环境搭建4.3节内容
#include "driver/ledc.h"
#include "driver/gpio.h"
#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_DUTY_RES LEDC_TIMER_8_BIT
#define LEDC_FREQUENCY 300
#define LEDC_DUTY 64
#define IO_ENABLE 0
#define IO_DIRECTION 1
#define IO_STEP 2
void app_main(void)
{
// IO_XXX 为信号输出引脚
gpio_reset_pin(IO_ENABLE);
gpio_set_direction(IO_ENABLE, GPIO_MODE_OUTPUT);
gpio_set_level(IO_ENABLE, 0);// 使能信号引脚:低电平有效
gpio_reset_pin(IO_DIRECTION);
gpio_set_direction(IO_DIRECTION, GPIO_MODE_OUTPUT);
gpio_set_level(IO_DIRECTION, 0);// 参数0或1,表示旋转方向
// 使用ledc_channel_config函数初始化LEDC Channel之前
// 需要构建包含ledc channel初始化参数的结构体 ledc_channel_config_t
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL, // 指定要初始化的Channel号
.timer_sel = LEDC_TIMER, // 指定Channel绑定的Timer号
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = IO_STEP, // 输出PWM信号引脚编号
.duty = 0, // 占空比
.hpoint = 0};
// 结构体构建完成,向ledc_channel_config传入结构体指针进行初始化
ledc_channel_config(&ledc_channel);
// 使用ledc_timer_config函数设定LEDC Timer
// 首先同样需要构建参数结构体
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = LEDC_TIMER, // 指定要设定的Timer号
.duty_resolution = LEDC_DUTY_RES, // 指定分辨率
.freq_hz = LEDC_FREQUENCY, // 指定PWM频率
.clk_cfg = LEDC_AUTO_CLK};
// 结构体构建完成,向ledc_timer_config传入结构体指针进行设定
ledc_timer_config(&ledc_timer);
// 重新设定占空比
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL, LEDC_DUTY); // LEDC_DUTY为占空比大小
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL);
}