93 lines
3.0 KiB
C++
93 lines
3.0 KiB
C++
#include "BLDCDriver3PWM.h"
|
|
|
|
BLDCDriver3PWM::BLDCDriver3PWM(int phA, int phB, int phC, int en1, int en2, int en3){
|
|
// Pin initialization
|
|
pwmA = phA;
|
|
pwmB = phB;
|
|
pwmC = phC;
|
|
|
|
// enable_pin pin
|
|
enableA_pin = en1;
|
|
enableB_pin = en2;
|
|
enableC_pin = en3;
|
|
|
|
// default power-supply value
|
|
voltage_power_supply = DEF_POWER_SUPPLY;
|
|
voltage_limit = NOT_SET;
|
|
pwm_frequency = NOT_SET;
|
|
|
|
}
|
|
|
|
// enable motor driver
|
|
void BLDCDriver3PWM::enable(){
|
|
// enable_pin the driver - if enable_pin pin available
|
|
if ( _isset(enableA_pin) ) digitalWrite(enableA_pin, enable_active_high);
|
|
if ( _isset(enableB_pin) ) digitalWrite(enableB_pin, enable_active_high);
|
|
if ( _isset(enableC_pin) ) digitalWrite(enableC_pin, enable_active_high);
|
|
// set zero to PWM
|
|
setPwm(0,0,0);
|
|
}
|
|
|
|
// disable motor driver
|
|
void BLDCDriver3PWM::disable()
|
|
{
|
|
// set zero to PWM
|
|
setPwm(0, 0, 0);
|
|
// disable the driver - if enable_pin pin available
|
|
if ( _isset(enableA_pin) ) digitalWrite(enableA_pin, !enable_active_high);
|
|
if ( _isset(enableB_pin) ) digitalWrite(enableB_pin, !enable_active_high);
|
|
if ( _isset(enableC_pin) ) digitalWrite(enableC_pin, !enable_active_high);
|
|
|
|
}
|
|
|
|
// init hardware pins
|
|
int BLDCDriver3PWM::init() {
|
|
// PWM pins
|
|
pinMode(pwmA, OUTPUT);
|
|
pinMode(pwmB, OUTPUT);
|
|
pinMode(pwmC, OUTPUT);
|
|
if( _isset(enableA_pin)) pinMode(enableA_pin, OUTPUT);
|
|
if( _isset(enableB_pin)) pinMode(enableB_pin, OUTPUT);
|
|
if( _isset(enableC_pin)) pinMode(enableC_pin, OUTPUT);
|
|
|
|
|
|
// sanity check for the voltage limit configuration
|
|
if(!_isset(voltage_limit) || voltage_limit > voltage_power_supply) voltage_limit = voltage_power_supply;
|
|
|
|
// Set the pwm frequency to the pins
|
|
// hardware specific function - depending on driver and mcu
|
|
params = _configure3PWM(pwm_frequency, pwmA, pwmB, pwmC);
|
|
initialized = (params!=SIMPLEFOC_DRIVER_INIT_FAILED);
|
|
return params!=SIMPLEFOC_DRIVER_INIT_FAILED;
|
|
}
|
|
|
|
|
|
|
|
// Set voltage to the pwm pin
|
|
void BLDCDriver3PWM::setPhaseState(PhaseState sa, PhaseState sb, PhaseState sc) {
|
|
// disable if needed
|
|
if( _isset(enableA_pin) && _isset(enableB_pin) && _isset(enableC_pin) ){
|
|
digitalWrite(enableA_pin, sa == PhaseState::PHASE_ON ? enable_active_high:!enable_active_high);
|
|
digitalWrite(enableB_pin, sb == PhaseState::PHASE_ON ? enable_active_high:!enable_active_high);
|
|
digitalWrite(enableC_pin, sc == PhaseState::PHASE_ON ? enable_active_high:!enable_active_high);
|
|
}
|
|
}
|
|
|
|
// Set voltage to the pwm pin
|
|
void BLDCDriver3PWM::setPwm(float Ua, float Ub, float Uc) {
|
|
|
|
// limit the voltage in driver
|
|
Ua = _constrain(Ua, 0.0f, voltage_limit);
|
|
Ub = _constrain(Ub, 0.0f, voltage_limit);
|
|
Uc = _constrain(Uc, 0.0f, voltage_limit);
|
|
// calculate duty cycle
|
|
// limited in [0,1]
|
|
dc_a = _constrain(Ua / voltage_power_supply, 0.0f , 1.0f );
|
|
dc_b = _constrain(Ub / voltage_power_supply, 0.0f , 1.0f );
|
|
dc_c = _constrain(Uc / voltage_power_supply, 0.0f , 1.0f );
|
|
|
|
// hardware specific writing
|
|
// hardware specific function - depending on driver and mcu
|
|
_writeDutyCycle3PWM(dc_a, dc_b, dc_c, params);
|
|
}
|