116 lines
3.4 KiB
C++
116 lines
3.4 KiB
C++
#ifndef BLDCMotor_h
|
|
#define BLDCMotor_h
|
|
|
|
#include "Arduino.h"
|
|
#include "common/base_classes/FOCMotor.h"
|
|
#include "common/base_classes/Sensor.h"
|
|
#include "common/base_classes/BLDCDriver.h"
|
|
#include "common/foc_utils.h"
|
|
#include "common/time_utils.h"
|
|
#include "common/defaults.h"
|
|
|
|
/**
|
|
BLDC motor class
|
|
*/
|
|
class BLDCMotor: public FOCMotor
|
|
{
|
|
public:
|
|
/**
|
|
BLDCMotor class constructor
|
|
@param pp pole pairs number
|
|
@param R motor phase resistance - [Ohm]
|
|
@param KV motor KV rating (1/K_bemf) - rpm/V
|
|
@param L motor phase inductance - [H]
|
|
*/
|
|
BLDCMotor(int pp, float R = NOT_SET, float KV = NOT_SET, float L = NOT_SET);
|
|
|
|
/**
|
|
* Function linking a motor and a foc driver
|
|
*
|
|
* @param driver BLDCDriver class implementing all the hardware specific functions necessary PWM setting
|
|
*/
|
|
virtual void linkDriver(BLDCDriver* driver);
|
|
|
|
/**
|
|
* BLDCDriver link:
|
|
* - 3PWM
|
|
* - 6PWM
|
|
*/
|
|
BLDCDriver* driver;
|
|
|
|
/** Motor hardware init function */
|
|
void init() override;
|
|
/** Motor disable function */
|
|
void disable() override;
|
|
/** Motor enable function */
|
|
void enable() override;
|
|
|
|
/**
|
|
* Function initializing FOC algorithm
|
|
* and aligning sensor's and motors' zero position
|
|
*/
|
|
int initFOC() override;
|
|
/**
|
|
* Function running FOC algorithm in real-time
|
|
* it calculates the gets motor angle and sets the appropriate voltages
|
|
* to the phase pwm signals
|
|
* - the faster you can run it the better Arduino UNO ~1ms, Bluepill ~ 100us
|
|
*/
|
|
void loopFOC() override;
|
|
|
|
/**
|
|
* Function executing the control loops set by the controller parameter of the BLDCMotor.
|
|
*
|
|
* @param target Either voltage, angle or velocity based on the motor.controller
|
|
* If it is not set the motor will use the target set in its variable motor.target
|
|
*
|
|
* This function doesn't need to be run upon each loop execution - depends of the use case
|
|
*/
|
|
void move(float target = NOT_SET) override;
|
|
|
|
float Ua, Ub, Uc;//!< Current phase voltages Ua,Ub and Uc set to motor
|
|
float Ualpha, Ubeta; //!< Phase voltages U alpha and U beta used for inverse Park and Clarke transform
|
|
|
|
/**
|
|
* Method using FOC to set Uq to the motor at the optimal angle
|
|
* Heart of the FOC algorithm
|
|
*
|
|
* @param Uq Current voltage in q axis to set to the motor
|
|
* @param Ud Current voltage in d axis to set to the motor
|
|
* @param angle_el current electrical angle of the motor
|
|
*/
|
|
void setPhaseVoltage(float Uq, float Ud, float angle_el) override;
|
|
|
|
private:
|
|
// FOC methods
|
|
|
|
/** Sensor alignment to electrical 0 angle of the motor */
|
|
int alignSensor();
|
|
/** Current sense and motor phase alignment */
|
|
int alignCurrentSense();
|
|
/** Motor and sensor alignment to the sensors absolute 0 angle */
|
|
int absoluteZeroSearch();
|
|
|
|
|
|
// Open loop motion control
|
|
/**
|
|
* Function (iterative) generating open loop movement for target velocity
|
|
* it uses voltage_limit variable
|
|
*
|
|
* @param target_velocity - rad/s
|
|
*/
|
|
float velocityOpenloop(float target_velocity);
|
|
/**
|
|
* Function (iterative) generating open loop movement towards the target angle
|
|
* it uses voltage_limit and velocity_limit variables
|
|
*
|
|
* @param target_angle - rad
|
|
*/
|
|
float angleOpenloop(float target_angle);
|
|
// open loop variables
|
|
long open_loop_timestamp;
|
|
};
|
|
|
|
|
|
#endif
|