thesis_bldc_controller/BLDC_E54/BLDC_E54/bldc.h

210 lines
7.2 KiB
C

/*
* bldc.h
*
* Created: 10/03/2021 14:38:14
* Author: Nick-XMG
*/
#ifndef BLDC_H_
#define BLDC_H_
// ----------------------------------------------------------------------
// header files
// ----------------------------------------------------------------------
#include "arm_math.h"
#include "atmel_start.h"
#include "control.h"
#include "motor_params.h"
/* if the Hall sensor reads 0x0 or 0x7 that means either one of the hall sensor is damaged or disconnected*/
#define INVALID_HALL_0 (0U)
#define INVALID_HALL_7 (7U)
// ----------------------------------------------------------------------
// ADC Parameters
// ----------------------------------------------------------------------
#define ADC_VOLTAGE_REFERENCE (3.3f)
#define ADC_RESOLUTION (12)
#define ADC_MAX_COUNTS (1<<ADC_RESOLUTION)
#define ADC_LSB_SIZE (ADC_VOLTAGE_REFERENCE/ADC_MAX_COUNTS)
// ----------------------------------------------------------------------
// Define the control and PWM frequencies:
// ----------------------------------------------------------------------
// 16kHz is the maximum frequency according to the calculation duration in the mode run and spin.
#define DEVICE_MCU_FREQUENCY_Hz (100000000U)
#define DEVICE_SPEEDTC_DIV (4U)
#define DEVICE_SPEEDTC_FREQUENCY_Hz (100000000U/DEVICE_SPEEDTC_DIV)
#define DEVICE_PWM_FREQUENCY_kHz (25.0f)
#define DEVICE_ISR_FREQUENCY_kHz DEVICE_PWM_FREQUENCY_kHz
#define DEVICE_ISR_PERIOD_Sec (0.001f/DEVICE_ISR_FREQUENCY_kHz)
// ----------------------------------------------------------------------
// Define the device quantities (voltage, current, speed)
// ----------------------------------------------------------------------
#define DEVICE_DC_VOLTAGE_V 24.0f // max. ADC bus voltage(PEAK) [V]
#define DEVICE_SHUNT_CURRENT_A 2.5f // phase current(PEAK) [A]
#define CURRENT_SENSOR_SENSITIVITY 0.4f //V/A
#define ONEON_CURRENT_SENSOR_SENSITIVITY 2.5f //V/A
// ----------------------------------------------------------------------
// Type Definitions
// ----------------------------------------------------------------------
volatile typedef struct
{
volatile float32_t A; // Phase A
volatile float32_t B; // Phase B
volatile float32_t C; // Phase C
volatile float32_t Bus; // Currently Active Phase Current
} MOTOR_3PHASES_t;
volatile typedef struct
{
volatile int16_t A; // Phase A measured offset
volatile int16_t B; // Phase B measured offset
} MOTOR_phase_offset_t;
volatile typedef struct timerflags
{
volatile bool pwm_cycle_tic;
volatile bool current_loop_tic;
volatile bool control_loop_tic; //! Is motor synchronized? Does not have any meaning when motorStopped is TRUE.
volatile bool motor_telemetry_flag;
} TIMERflags_t;
volatile typedef struct
{
volatile PI_t Pi_Idc;
volatile PID_t Pid_Speed;
volatile PI_t Pi_Pos;
} MOTOR_Control_Structs;
volatile typedef struct
{
volatile uint8_t desiredDirection; //! The desired direction of rotation.
volatile uint8_t directionOffset;
volatile float32_t desired_torque;
volatile int16_t desired_speed;
volatile int16_t desired_position;
volatile float32_t max_torque;
volatile float32_t max_current;
volatile int16_t max_velocity;
} MOTOR_Setpoints;
volatile typedef struct
{
volatile uint8_t actualDirection; //! The actual direction of rotation.
volatile uint16_t duty_cycle;
volatile float32_t calc_rpm;
volatile int32_t Num_Steps;
/* Hall States */
volatile uint8_t prevHallPattern;
volatile uint8_t currentHallPattern;
volatile uint8_t nextHallPattern;
/* Commutation State */
volatile uint8_t cur_comm_step;
volatile uint8_t prev_comm_step;
} MOTOR_Status;
// ----------------------------------------------------------------------
// Function Pointers
// ----------------------------------------------------------------------
typedef uint8_t (*ReadHallFunc)(void);
typedef void (*DisableMotorFunc)(void);
typedef void (*SetMotorDutyCycle)(uint16_t);
volatile typedef struct BLDCmotor
{
/* Hardware */
const Tcc *hw;
const uint16_t *motor_commutation_Pattern;
uint32_t current_sensor_channels[2];
/* Status */
MOTOR_Status motor_status;
/* Measured Values */
volatile MOTOR_3PHASES_t Iphase_pu;
volatile MOTOR_phase_offset_t Voffset_lsb;
volatile float32_t VdcBus_pu;
volatile float32_t VoneByDcBus_pu;
/* Motor Flags */
volatile TIMERflags_t timerflags;
volatile uint8_t regulation_loop_count;
/* Controllers */
volatile MOTOR_Control_Structs controllers;
/* Setpoints */
volatile MOTOR_Setpoints motor_setpoints;
/* Functions */
ReadHallFunc ReadHall;
DisableMotorFunc DisableMotor;
SetMotorDutyCycle SetDutyCycle;
} BLDCMotor_t;
// ----------------------------------------------------------------------
// global variables
// ----------------------------------------------------------------------
static const uint8_t HALL_PATTERN_ARRAY[16] = {0, 5, 3, 1, 6, 4, 2, 0, 0, 3, 6, 2, 5, 1, 4, 0 };
static const uint8_t MOTOR_COMMUTATION_STEPS[8] = {9, 1, 3, 2, 5, 6, 4, 9};
volatile BLDCMotor_t Motor1;
volatile BLDCMotor_t Motor2;
volatile BLDCMotor_t Motor3;
static uint8_t currentSensorCount = 4;
static uint32_t adc_seq_regs[4] = {0x1802, 0x1803, 0x1802, 0x1803};
static volatile uint16_t adc_res[4] = {0};
static volatile bool adc_dma_done = 0;
struct _dma_resource *adc_sram_dma_resource;
struct _dma_resource *adc_dmac_sequence_resource;
// ----------------------------------------------------------------------
// functions
// ----------------------------------------------------------------------
void BldcInitStruct(BLDCMotor_t *motor);
void BldcInitFunctions(void);
void select_active_phase(BLDCMotor_t *Motor, uint8_t hall_state);
void read_zero_current_offset_value(BLDCMotor_t *Motor);
//int32_t adc_sync_read_channel(struct adc_async_descriptor *const descr, const uint8_t channel, uint8_t *const buffer, const uint16_t length);
//static uint16_t adc_read(struct adc_async_descriptor *const descr, const uint8_t channel);
void exec_commutation(void);
uint8_t get_dir_hall_code(void);
uint8_t get_hall_state(void);
uint8_t HALLPatternGet(void);
uint8_t PDEC_HALLPatternGet(void);
void calculate_motor_speed(void);
void DisableMotor(BLDCMotor_t *motor);
void BLDC_runSpeedCntl(BLDCMotor_t *motor, volatile float speedfbk, volatile float speedRef);
void BLDC_runCurrentCntl(BLDCMotor_t *motor, volatile float curfbk, volatile float curRef);
void BLDC_runPosCntl(BLDCMotor_t *motor, int16_t posfbk, int16_t posRef);
// ----------------------------------------------------------------------
// Functions used with function pointers
// ----------------------------------------------------------------------
uint8_t readM1Hall(void);
uint8_t readM2Hall(void);
uint8_t readM3Hall(void);
void DisableM1GateDrivers(BLDCMotor_t *motor);
void DisableM2GateDrivers(BLDCMotor_t *motor);
void DisableM3GateDrivers(BLDCMotor_t *motor);
void SetM1DutyCycle(uint16_t duty);
void SetM2DutyCycle(uint16_t duty);
void SetM3DutyCycle(uint16_t duty);
// ----------------------------------------------------------------------
// all controller objects, variables and helpers:
// ----------------------------------------------------------------------
//Motor2.ReadHall = readM2Hall;
//Motor3.ReadHall = readM3Hall;
#endif /* BLDC_H_ */