103 lines
2.2 KiB
C++
103 lines
2.2 KiB
C++
#ifndef L298N_ESP32_h
|
|
#define L298N_ESP32_h
|
|
|
|
#include <Arduino.h>
|
|
|
|
class L298N_ESP32 {
|
|
private:
|
|
uint8_t in1Pin;
|
|
uint8_t in2Pin;
|
|
uint8_t enPin;
|
|
uint8_t pwmChannel;
|
|
uint8_t _speed;
|
|
uint8_t _min_speed = 0;
|
|
uint8_t _max_speed = 255;
|
|
bool _invert = false;
|
|
|
|
void checkWrite(uint8_t value) {
|
|
if (_speed != value) {
|
|
_speed = value;
|
|
ledcWrite(pwmChannel, _speed);
|
|
}
|
|
}
|
|
|
|
public:
|
|
L298N_ESP32(uint8_t in1, uint8_t in2, uint8_t en, uint8_t channel = 0) :
|
|
in1Pin(in1), in2Pin(in2), enPin(en), pwmChannel(channel), _speed(0) {}
|
|
|
|
void begin() {
|
|
pinMode(in1Pin, OUTPUT);
|
|
pinMode(in2Pin, OUTPUT);
|
|
ledcAttachChannel(pwmChannel, 30000, 8, enPin); // 30kHz frequency, 8-bit resolution
|
|
digitalWrite(in1Pin, LOW);
|
|
digitalWrite(in2Pin, LOW);
|
|
checkWrite(0);
|
|
}
|
|
|
|
void setMin(uint8_t value) {
|
|
_min_speed = value;
|
|
}
|
|
|
|
void setMax(uint8_t value) {
|
|
_max_speed = value;
|
|
}
|
|
|
|
void invert() {
|
|
_invert = !_invert;
|
|
}
|
|
|
|
void forward() {
|
|
if (!_invert) {
|
|
digitalWrite(in1Pin, LOW);
|
|
digitalWrite(in2Pin, HIGH);
|
|
} else {
|
|
digitalWrite(in1Pin, HIGH);
|
|
digitalWrite(in2Pin, LOW);
|
|
}
|
|
}
|
|
|
|
void backward() {
|
|
if (!_invert) {
|
|
digitalWrite(in1Pin, HIGH);
|
|
digitalWrite(in2Pin, LOW);
|
|
} else {
|
|
digitalWrite(in1Pin, LOW);
|
|
digitalWrite(in2Pin, HIGH);
|
|
}
|
|
}
|
|
|
|
void goMin() {
|
|
checkWrite(_min_speed);
|
|
}
|
|
|
|
void goMax() {
|
|
checkWrite(_max_speed);
|
|
}
|
|
|
|
void setSpeed(uint8_t speed) {
|
|
speed = constrain(speed, _min_speed, _max_speed);
|
|
checkWrite(speed);
|
|
}
|
|
|
|
void setPercentage(uint8_t percentage) {
|
|
if (percentage == 0) {
|
|
checkWrite(0);
|
|
} else {
|
|
uint8_t speed = map(percentage, 1, 100, _min_speed, _max_speed);
|
|
checkWrite(speed);
|
|
}
|
|
}
|
|
|
|
void override(uint8_t value) {
|
|
ledcWrite(pwmChannel, value);
|
|
}
|
|
|
|
void stop() {
|
|
digitalWrite(in1Pin, LOW);
|
|
digitalWrite(in2Pin, LOW);
|
|
checkWrite(0);
|
|
}
|
|
};
|
|
|
|
#endif
|