added miniskid
This commit is contained in:
138
Miniskid/FW/lib/Cdrv8833/src/Cdrv8833.cpp
Executable file
138
Miniskid/FW/lib/Cdrv8833/src/Cdrv8833.cpp
Executable 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user