' *******************************************************************************
' 版权说明: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、重点实现启动、停止、反向运动的代码例程
这样一个完整的例程,小白用户就会套用了,感谢。
' *******************************************************************************
' 版权说明: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)
结束 函数
真好用,特别香,感谢大佬。
' *******************************************************************************
' 版权说明: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)
结束 函数
这是我使用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);
}