普通用户
pwm 电机实现频率配置、启动、停止、反向运动的代码例程 [复制链接]
lile88656 发表于 2026-04-28 141 3


' ******************************************************************************* ' 版权说明:Copyright(C) All Rights Reserved VcnStudio ' 程序版本:V1.0 ' 程序作者: ' 联系信息: ' 文件描述:该文件为固件启动程序;当编译工程运行到开发板中时;系统将默认启动该 '      程序、并同时回调:程序被启动 事件;该事件也是当前程序默认入口函数。 ' ******************************************************************************* ' 在上传代码之前,请确保你的硬件连接如下: ' 电机 A 线 1 → AOUT1 ' 电机 A 线 2 → AOUT2 ' AIN1 → GND (低电平) ' AIN2 → 数字引脚 3 (必须是支持 PWM 的引脚,如 3, 5, 6, 9, 10, 11) ' STBY (如果有) → Arduino 5V (高电平以启用驱动) ' VM (电机电源) → 外部电源 (如 7.4V 电池) ' VCC (逻辑电源) → 5V ' ******************************************************************************* ' 此演示程序将 AIN2 设置为 50% 的占空比,AIN1 保持低电平,从而使电机正转。 ' ' * 硬件连接参考: ' * AIN1 -> GND ' * AIN2 -> 数字引脚 3 (PWM) ' * STBY -> 5V (如果驱动模块有此引脚,必须接高电平) 宏定 PIN_AIN1 2 ' GND 宏定 PIN_AIN2 3 ' 必须使用支持 PWM 的引脚,如 3 或 9 '* ****************************************************************************** '* 当程序编译成功并被写入到连接的开发板闪存时;ESP32 自带的操作系统 FreeRTOS 将会启动 '* 本程序、并同时回调该事件;该事件也为程序启动的入口函数;你可以在此事件中初始化程序相 '* 关配置并开始实现自己的业务逻辑;注:该函数不可删除 '* ****************************************************************************** 事件 程序被启动() 初始化串口通信(115200) 调试输出("程序被启动") ' 设置连接小灯的引脚为输出模式 置引脚模式(PIN_AIN1,3) 置引脚模式(PIN_AIN2,3) ' 设置 AIN1 为低电平 写引脚值(PIN_AIN1,0) ' 设置速度:AIN2 输出 50% 占空比的 PWM ' Arduino 的 模拟引脚值 范围是 0-255 ' 50% 占空比计算:255 * 0.5 = 127.5 -> 取 127 或 128 写模拟引脚值(PIN_AIN2,127) 调试输出("电机已启动") 结束 事件 '* ****************************************************************************** '* 当程序被启动后、系统将会自动调用该函数;并在整个程序运行期间不断重执行该函数、你可以 '* 在该函数中执行程序的主要任务,如读写传感器值、控制执行器、处理用户输入和更新显示等 '* 注:该函数不可删除 '* ****************************************************************************** 函数 无限循环() ' 主循环不需要做任何事,PWM 信号会在后台持续输出 ' 你可以在这里添加其他逻辑 结束 函数


' 1. 设置通道、频率和分辨率
' 重点在这里:将频率参数改为你想要的值,例如 20000 (20kHz)
ledcSetup(0, 20000, 8); 

' 2. 将通道绑定到具体的 GPIO 引脚,GPIO 4 绑定到通道 0
ledcAttachPin(4, 0);

' 3. 设置占空比 (0 - 255,因为是8位分辨率) 50% 占空比
ledcWrite(0, 128);



上面的这两个代码都是官方提供的,但是这个对小白来说不能很好的嵌套融入,求官方来个完整的例程

需求如下:

1、整合两个代码实现 指定频率配置,引脚配置

2、重点实现启动、停止、反向运动的代码例程

这样一个完整的例程,小白用户就会套用了,感谢。

lile88656 2026-04-29
引用 @Course 的回复:
' *******************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 文件描述:该文件为固件启动程序;当编译工程运行到开发板中时;系统将默认启动该
'      程序、并同时回调:程序被启动 事件;该事件也是当前程序默认入口函数。
' *******************************************************************************

' 电机驱动输入引脚
宏定 MOTOR_PIN_1 18 ' 电机驱动输入1
宏定 MOTOR_PIN_2 19 ' 电机驱动输入2

' PWM 参数
宏定 PWM_FREQ 20000   ' 20kHz 频率
宏定 PWM_CHANNEL_1 0  ' LEDC 通道 0
宏定 PWM_CHANNEL_2 1  ' LEDC 通道 1
宏定 RESOLUTION 8     ' 8位分辨率 (0-255)

事件 程序被启动()
	初始化串口通信(115200)
    调试输出("程序被启动")
    ' 配置 LEDC 通道 1
	ledcSetup(PWM_CHANNEL_1, PWM_FREQ, RESOLUTION)
	ledcAttachPin(MOTOR_PIN_1, PWM_CHANNEL_1)
	' 配置 LEDC 通道 2
	ledcSetup(PWM_CHANNEL_2, PWM_FREQ, RESOLUTION)
	ledcAttachPin(MOTOR_PIN_2, PWM_CHANNEL_2)
	' 初始停止
	stopMotor()
	Serial.println("Motor Control Initialized - 电机控制初始化完毕")
结束 事件

函数 无限循环()
    ' 演示:正转加速 -> 正转减速 -> 停止 -> 反转加速 -> 反转减速 -> 停止
    调试输出("Forward Accelerating... - 正转加速...")
    变量循环(duty = 0,255,5)
        forward(duty)
        延时(20)
    结束循环
    stopMotor()
    延时(1000)
    调试输出("Reverse Accelerating... - 反转加速...")
    变量循环(duty = 0,255,5)
        reverse(duty)
        延时(20)
    结束循环
	延时(1000)
	调试输出("Reverse Accelerating... - 反转减速...")
    变量 duty  整数型 = 255
    判断循环(duty >= 0)
        duty = duty - 5
        reverse(duty)
		延时(20)
    结束循环
	stopMotor()
	延时(2000)
结束 函数

' 正转函数,假设 H 桥逻辑:PIN1 高电平/PWM, PIN2 低电平 为正转
函数 forward(speed  整数型)
    ledcWrite(PWM_CHANNEL_1, speed) ' PIN1 输出 PWM
	ledcWrite(PWM_CHANNEL_2, 0)     ' PIN2 输出 0 (低电平)
结束 函数

' 反转函数,假设 H 桥逻辑:PIN1 低电平, PIN2 高电平/PWM 为反转
函数 reverse(speed  整数型)
  ledcWrite(PWM_CHANNEL_1, 0)     ' PIN1 输出 0 (低电平)
  ledcWrite(PWM_CHANNEL_2, speed) ' PIN2 输出 PWM
结束 函数

' 停止函数,两个引脚都输出低电平,或者都输出高电平(取决于驱动模块,通常低电平停止)
函数 stopMotor()
  ledcWrite(PWM_CHANNEL_1, 0)
  ledcWrite(PWM_CHANNEL_2, 0)
结束 函数

真好用,特别香,感谢大佬。

回复
官方技术组 2026-04-29
' *******************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 文件描述:该文件为固件启动程序;当编译工程运行到开发板中时;系统将默认启动该
'      程序、并同时回调:程序被启动 事件;该事件也是当前程序默认入口函数。
' *******************************************************************************

' 电机驱动输入引脚
宏定 MOTOR_PIN_1 18 ' 电机驱动输入1
宏定 MOTOR_PIN_2 19 ' 电机驱动输入2

' PWM 参数
宏定 PWM_FREQ 20000   ' 20kHz 频率
宏定 PWM_CHANNEL_1 0  ' LEDC 通道 0
宏定 PWM_CHANNEL_2 1  ' LEDC 通道 1
宏定 RESOLUTION 8     ' 8位分辨率 (0-255)

事件 程序被启动()
	初始化串口通信(115200)
    调试输出("程序被启动")
    ' 配置 LEDC 通道 1
	ledcSetup(PWM_CHANNEL_1, PWM_FREQ, RESOLUTION)
	ledcAttachPin(MOTOR_PIN_1, PWM_CHANNEL_1)
	' 配置 LEDC 通道 2
	ledcSetup(PWM_CHANNEL_2, PWM_FREQ, RESOLUTION)
	ledcAttachPin(MOTOR_PIN_2, PWM_CHANNEL_2)
	' 初始停止
	stopMotor()
	Serial.println("Motor Control Initialized - 电机控制初始化完毕")
结束 事件

函数 无限循环()
    ' 演示:正转加速 -> 正转减速 -> 停止 -> 反转加速 -> 反转减速 -> 停止
    调试输出("Forward Accelerating... - 正转加速...")
    变量循环(duty = 0,255,5)
        forward(duty)
        延时(20)
    结束循环
    stopMotor()
    延时(1000)
    调试输出("Reverse Accelerating... - 反转加速...")
    变量循环(duty = 0,255,5)
        reverse(duty)
        延时(20)
    结束循环
	延时(1000)
	调试输出("Reverse Accelerating... - 反转减速...")
    变量 duty  整数型 = 255
    判断循环(duty >= 0)
        duty = duty - 5
        reverse(duty)
		延时(20)
    结束循环
	stopMotor()
	延时(2000)
结束 函数

' 正转函数,假设 H 桥逻辑:PIN1 高电平/PWM, PIN2 低电平 为正转
函数 forward(speed  整数型)
    ledcWrite(PWM_CHANNEL_1, speed) ' PIN1 输出 PWM
	ledcWrite(PWM_CHANNEL_2, 0)     ' PIN2 输出 0 (低电平)
结束 函数

' 反转函数,假设 H 桥逻辑:PIN1 低电平, PIN2 高电平/PWM 为反转
函数 reverse(speed  整数型)
  ledcWrite(PWM_CHANNEL_1, 0)     ' PIN1 输出 0 (低电平)
  ledcWrite(PWM_CHANNEL_2, speed) ' PIN2 输出 PWM
结束 函数

' 停止函数,两个引脚都输出低电平,或者都输出高电平(取决于驱动模块,通常低电平停止)
函数 stopMotor()
  ledcWrite(PWM_CHANNEL_1, 0)
  ledcWrite(PWM_CHANNEL_2, 0)
结束 函数
回复
lile88656 2026-04-28

这是我使用AI生成的代码,但是我不会套用到VCN求教如何套用。



// 定义引脚
// 注意:ESP32-S3 的 LEDC 通道与 GPIO 映射需根据实际开发板确认
// 这里假设使用 GPIO 18 和 GPIO 19 作为两个控制引脚
// 这种接法通常用于直接驱动 H 桥的两个输入端,或者一个接 PWM 一个接方向
// 为了演示“两个引脚采用PWM控制”,我们采用双路互补或独立 PWM 控制 H 桥输入的方式
// 常见 L298N/TB6612 接法:IN1 接 PWM1, IN2 接 PWM2

#define MOTOR_PIN_1 18  // 电机驱动输入1
#define MOTOR_PIN_2 19  // 电机驱动输入2

// PWM 参数
#define PWM_FREQ 20000   // 20kHz 频率
#define PWM_CHANNEL_1 0  // LEDC 通道 0
#define PWM_CHANNEL_2 1  // LEDC 通道 1
#define RESOLUTION 8     // 8位分辨率 (0-255)

void setup() {
  Serial.begin(115200);
  
  // 配置 LEDC 通道 1
  ledcSetup(PWM_CHANNEL_1, PWM_FREQ, RESOLUTION);
  ledcAttachPin(MOTOR_PIN_1, PWM_CHANNEL_1);
  
  // 配置 LEDC 通道 2
  ledcSetup(PWM_CHANNEL_2, PWM_FREQ, RESOLUTION);
  ledcAttachPin(MOTOR_PIN_2, PWM_CHANNEL_2);
  
  // 初始停止
  stopMotor();
  Serial.println("Motor Control Initialized");
}

void loop() {
  // 演示:正转加速 -> 正转减速 -> 停止 -> 反转加速 -> 反转减速 -> 停止
  
  Serial.println("Forward Accelerating...");
  for (int duty = 0; duty <= 255; duty += 5) {
    forward(duty);
    delay(20);
  }
  
  delay(1000);
  
  Serial.println("Forward Decelerating...");
  for (int duty = 255; duty >= 0; duty -= 5) {
    forward(duty);
    delay(20);
  }
  
  stopMotor();
  delay(1000);
  
  Serial.println("Reverse Accelerating...");
  for (int duty = 0; duty <= 255; duty += 5) {
    reverse(duty);
    delay(20);
  }
  
  delay(1000);
  
  Serial.println("Reverse Decelerating...");
  for (int duty = 255; duty >= 0; duty -= 5) {
    reverse(duty);
    delay(20);
  }
  
  stopMotor();
  delay(2000);
}

// 正转函数
// 假设 H 桥逻辑:PIN1 高电平/PWM, PIN2 低电平 为正转
void forward(uint8_t speed) {
  ledcWrite(PWM_CHANNEL_1, speed); // PIN1 输出 PWM
  ledcWrite(PWM_CHANNEL_2, 0);     // PIN2 输出 0 (低电平)
}

// 反转函数
// 假设 H 桥逻辑:PIN1 低电平, PIN2 高电平/PWM 为反转
void reverse(uint8_t speed) {
  ledcWrite(PWM_CHANNEL_1, 0);     // PIN1 输出 0 (低电平)
  ledcWrite(PWM_CHANNEL_2, speed); // PIN2 输出 PWM
}

// 停止函数
// 两个引脚都输出低电平,或者都输出高电平(取决于驱动模块,通常低电平停止)
void stopMotor() {
  ledcWrite(PWM_CHANNEL_1, 0);
  ledcWrite(PWM_CHANNEL_2, 0);
}
回复
 作者信息
lile88656
USB全栈版
专业开发指导服务

响应时间:5分钟

服务方式:官方1对1服务

工作时间:工作日 9:00 - 18:30

专业团队 · 开发指导 · 极速响应


官网 | 基础视频教程 | 在线文档 下载 VcnStudio IDE

© VcnStudio Inc All Rights Reserved

蜀ICP备17024229号