rusefi-1/firmware/controllers/system/dc_motor.cpp

83 lines
1.7 KiB
C++
Raw Normal View History

/**
* @file DcMotor.cpp
* @brief DC motor controller
*
* @date Dec 22, 2018
* @author Matthew Kennedy
*/
2019-03-29 06:11:13 -07:00
#include "dc_motor.h"
#include "efi_gpio.h"
#include "pwm_generator_logic.h"
TwoPinDcMotor::TwoPinDcMotor(SimplePwm* enable, SimplePwm* dir1, SimplePwm* dir2, OutputPin* disablePin)
2019-05-04 21:42:50 -07:00
: m_enable(enable)
, m_dir1(dir1)
, m_dir2(dir2)
, m_disable(disablePin)
{
disable();
}
void TwoPinDcMotor::enable() {
if (m_disable) {
m_disable->setValue(false);
}
}
void TwoPinDcMotor::disable() {
if (m_disable) {
m_disable->setValue(true);
}
// Also set the duty to zero
set(0);
}
bool TwoPinDcMotor::isOpenDirection() const {
2019-05-04 21:42:50 -07:00
return m_value >= 0;
2019-03-01 20:09:33 -08:00
}
float TwoPinDcMotor::get() const {
2019-05-04 21:42:50 -07:00
return m_value;
}
2019-02-10 16:13:04 -08:00
/**
* @param duty value between -1.0 and 1.0
*/
bool TwoPinDcMotor::set(float duty)
{
2019-05-04 21:42:50 -07:00
m_value = duty;
bool isPositive = duty > 0;
2019-11-19 15:17:03 -08:00
if (!isPositive) {
duty = -duty;
}
2019-05-04 21:42:50 -07:00
2019-02-10 16:13:04 -08:00
// below here 'duty' is a not negative
// Clamp to 100%
2019-11-19 15:17:03 -08:00
if (duty > 1.0f) {
duty = 1.0f;
}
// Disable for very small duty
else if (duty < 0.01f)
{
duty = 0.0f;
}
2019-05-04 21:42:50 -07:00
// If we're in two pin mode, force 100%, else use this pin to PWM
2019-05-04 21:53:24 -07:00
float enableDuty = m_type == ControlType::PwmEnablePin ? duty : 1;
2019-04-12 22:03:12 -07:00
2019-05-04 21:53:24 -07:00
// Direction pins get 100% duty unless we're in PwmDirectionPins mode
float dirDuty = m_type == ControlType::PwmDirectionPins ? duty : 1;
2019-05-04 21:42:50 -07:00
m_enable->setSimplePwmDutyCycle(enableDuty);
m_dir1->setSimplePwmDutyCycle(isPositive ? dirDuty : 0);
m_dir2->setSimplePwmDutyCycle(isPositive ? 0 : dirDuty);
// This motor has no fault detection, so always return false (indicate success).
return false;
}