diff --git a/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Inc/MotorDC.hpp b/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Inc/MotorDC.hpp new file mode 100644 index 0000000..a9456b9 --- /dev/null +++ b/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Inc/MotorDC.hpp @@ -0,0 +1,17 @@ +/* + * MotorDC.hpp + * + * Created on: Jul 5, 2025 + * Author: Gabriel + */ + +#ifndef SHARED_ROBOFRAMEWORK_INC_MOTORDC_HPP_ +#define SHARED_ROBOFRAMEWORK_INC_MOTORDC_HPP_ + +class MotorDC { +public: + virtual int32_t init() = 0; + virtual int32_t setPower(float newPower) = 0; +}; + +#endif /* SHARED_ROBOFRAMEWORK_INC_MOTORDC_HPP_ */ diff --git a/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Inc/MotorDC_BTS7960_H_Bridge.hpp b/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Inc/MotorDC_BTS7960_H_Bridge.hpp new file mode 100644 index 0000000..6139cdb --- /dev/null +++ b/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Inc/MotorDC_BTS7960_H_Bridge.hpp @@ -0,0 +1,30 @@ +/* + * MotorDC_BTS7960B_H_Bridge.hpp + * + * Created on: Jul 5, 2025 + * Author: Gabriel + */ + +#ifndef MOTORDC_BTS7960B_H_BRIDGE_HPP_ +#define MOTORDC_BTS7960B_H_BRIDGE_HPP_ + +#include "main.h" +#include "MotorDC.hpp" +#include "PWM_Pin.hpp" +#include "GPIO_Pin.hpp" + +class MotorDC_BTS7960B_H_Bridge : public MotorDC { +public: + MotorDC_BTS7960B_H_Bridge(PWM_Pin* ina, PWM_Pin* inb, GPIO_Pin* inha, GPIO_Pin* inhb); + virtual ~MotorDC_BTS7960B_H_Bridge(); + int32_t init(); + int32_t setPower(float newPower); +private: + PWM_Pin* ina; + PWM_Pin* inb; + GPIO_Pin* inha; + GPIO_Pin* inhb; + bool initialized = false; +}; + +#endif /* MOTORDC_BTS7960B_H_BRIDGE_HPP_ */ diff --git a/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Src/MotorDC_BTS7960_H_Bridge.cpp b/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Src/MotorDC_BTS7960_H_Bridge.cpp new file mode 100644 index 0000000..99e61c4 --- /dev/null +++ b/Firmware/OmniBot_RC/Application/Shared/MotorDC_BTS7960B_H_Bridge/Src/MotorDC_BTS7960_H_Bridge.cpp @@ -0,0 +1,72 @@ +/* + * otorDC_BTS7960B_H_Bridge.cpp + * + * Created on: Jul 5, 2025 + * Author: Gabriel + */ + +#include +#include "MotorDC_BTS7960_H_Bridge.hpp" + +MotorDC_BTS7960B_H_Bridge::MotorDC_BTS7960B_H_Bridge(PWM_Pin* ina, PWM_Pin* inb, GPIO_Pin* inha, GPIO_Pin* inhb) : + ina(ina), + inb(inb), + inha(inha), + inhb(inhb) +{ + +} + +MotorDC_BTS7960B_H_Bridge::~MotorDC_BTS7960B_H_Bridge() { + +} + +int32_t MotorDC_BTS7960B_H_Bridge::init() { + int32_t errors = 0; + errors += ina->init(); + errors += inb->init(); + errors += inha->init(); + errors += inhb->init(); + if(!errors){ + initialized = true; + } + return errors; +} + +int32_t MotorDC_BTS7960B_H_Bridge::setPower(float newPower) { + int32_t errors = 0; + if(!initialized){ + // Not initialized + return -1; + } + if(newPower>1 || newPower<-1){ + // Power out of range + return -1; + } + if(std::isnan(newPower)){ + // Float the motor + errors += ina->setDutyCycle(0); + errors += inb->setDutyCycle(0); + errors += ina->reset(); + errors += inb->reset(); + errors += inha->reset(); + errors += inhb->reset(); + return errors; + } + if(newPower>=0){ + errors += ina->setDutyCycle(newPower); + errors += inb->setDutyCycle(0); + errors += ina->reset(); + errors += inb->reset(); + errors += inha->set(); + errors += inhb->set(); + }else{ + errors += ina->setDutyCycle(0); + errors += inb->setDutyCycle(-newPower); + errors += ina->reset(); + errors += inb->reset(); + errors += inha->set(); + errors += inhb->set(); + } + return errors; +}