added miniskid

This commit is contained in:
2025-06-23 12:16:19 +02:00
parent 0c4edefa07
commit e818f45475
29 changed files with 2880 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
#include "Cdrv8833.h"
#include "esp32-hal-gpio.h"
Cdrv8833::Cdrv8833() {
// not initialized
m_in1Pin = -1;
m_in2Pin = -1;
m_power = 0;
m_swapDirection = false;
m_decayMode = drv8833DecaySlow;
}
Cdrv8833::Cdrv8833(uint8_t in1Pin, uint8_t in2Pin, uint8_t channel, bool swapDirection) {
init(in1Pin, in2Pin, channel, swapDirection);
}
Cdrv8833::~Cdrv8833() {
stop();
}
bool Cdrv8833::init(uint8_t in1Pin, uint8_t in2Pin, uint8_t channel, bool swapDirection) {
if (channel > 15)
return false;
if ((m_in1Pin != -1) && (m_in2Pin != -1))
stop();
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
m_in1Pin = in1Pin;
m_in2Pin = in2Pin;
m_power = 0;
m_swapDirection = swapDirection;
m_channel = channel;
m_decayMode = drv8833DecaySlow;
ledcSetup(channel, PWM_FREQUENCY, PWM_BIT_RESOLUTION);
return true;
}
bool Cdrv8833::move(int8_t power) {
if (-1 == m_in1Pin)
return false;
if (-1 == m_in2Pin)
return false;
if (0 == power) {
stop();
return true;
}
if (power > 100)
power = 100;
if (power < -100)
power = -100;
m_power = power;
if (m_swapDirection)
power = -power;
float value = (float)((1 << PWM_BIT_RESOLUTION) - 1) * ((float)abs(power))/100.0;
uint32_t dutyCycle;
if ((value - trunc(value)) < 0.5)
dutyCycle = value;
else
dutyCycle = value + 1;
if (drv8833DecaySlow == m_decayMode)
dutyCycle = ((1 << PWM_BIT_RESOLUTION) - 1) - dutyCycle;
if (power > 0) { // forward
if (drv8833DecayFast == m_decayMode) {
// forward fast decay
ledcDetachPin(m_in2Pin);
digitalWrite(m_in2Pin, LOW);
ledcAttachPin(m_in1Pin, m_channel);
}
else {
// forward slow decay
ledcDetachPin(m_in1Pin);
digitalWrite(m_in1Pin, HIGH);
ledcAttachPin(m_in2Pin, m_channel);
}
}
else { // reverse
if (drv8833DecayFast == m_decayMode) {
// reverse fast decay
ledcDetachPin(m_in1Pin);
digitalWrite(m_in1Pin, LOW);
ledcAttachPin(m_in2Pin, m_channel);
}
else {
// reverse slow decay
ledcDetachPin(m_in2Pin);
digitalWrite(m_in2Pin, HIGH);
ledcAttachPin(m_in1Pin, m_channel);
}
}
ledcWrite(m_channel, dutyCycle);
return true;
}
bool Cdrv8833::stop() {
if (-1 == m_in1Pin)
return false;
if (-1 == m_in2Pin)
return false;
ledcDetachPin(m_in1Pin);
ledcDetachPin(m_in2Pin);
digitalWrite(m_in1Pin, LOW);
digitalWrite(m_in2Pin, LOW);
m_power = 0;
return true;
}
bool Cdrv8833::brake() {
if (-1 == m_in1Pin)
return false;
if (-1 == m_in2Pin)
return false;
ledcDetachPin(m_in1Pin);
ledcDetachPin(m_in2Pin);
digitalWrite(m_in1Pin, HIGH);
digitalWrite(m_in2Pin, HIGH);
m_power = 0;
return true;
}
void Cdrv8833::setDecayMode(drv8833DecayMode decayMode) {
stop();
m_decayMode = decayMode;
}
void Cdrv8833::setFrequency(uint32_t frequency) {
stop();
ledcChangeFrequency(m_channel, frequency, PWM_BIT_RESOLUTION);
}
void Cdrv8833::swapDirection(bool swapDirection) {
stop();
m_swapDirection = swapDirection;
}