added current reading
This commit is contained in:
parent
a12432df36
commit
5234c7031b
|
@ -129,10 +129,10 @@ static volatile int16_t *M4_Spare = ((int16_t *)&QSPI_rx_buffer[15]+1);
|
||||||
|
|
||||||
void update_telemetry(void)
|
void update_telemetry(void)
|
||||||
{
|
{
|
||||||
//inline int16_t convert_to_mA(volatile float32_t current_PU)
|
inline int16_t convert_to_mA(volatile float32_t current_PU)
|
||||||
//{
|
{
|
||||||
//return (int16_t)(current_PU*1000.0f);
|
return (int16_t)(current_PU*1000.0f);
|
||||||
//}
|
}
|
||||||
//
|
//
|
||||||
//*M1_Status = 0;
|
//*M1_Status = 0;
|
||||||
//*M1_Mode = 0;
|
//*M1_Mode = 0;
|
||||||
|
@ -141,11 +141,10 @@ void update_telemetry(void)
|
||||||
*M1_Joint_rel_position = Motor1.motor_status.Num_Steps;
|
*M1_Joint_rel_position = Motor1.motor_status.Num_Steps;
|
||||||
//*M1_Joint_abs_position = ((int16_t *)&QSPI_tx_buffer[1]);
|
//*M1_Joint_abs_position = ((int16_t *)&QSPI_tx_buffer[1]);
|
||||||
//*M1_Motor_speed = (((int16_t *)&QSPI_tx_buffer[1])+1);
|
//*M1_Motor_speed = (((int16_t *)&QSPI_tx_buffer[1])+1);
|
||||||
*M1_Motor_current_bus = COMMUTATION_PATTERN[Motor1.motor_status.currentHallPattern +
|
*M1_Motor_current_bus = convert_to_mA(Motor1.Iphase_pu.Bus);
|
||||||
Motor1.motor_setpoints.directionOffset];
|
*M1_Motor_currentPhA = convert_to_mA(Motor1.Iphase_pu.A);
|
||||||
//*M1_Motor_currentPhA = (((int16_t *)&QSPI_tx_buffer[2])+1);
|
*M1_Motor_currentPhB = convert_to_mA(Motor1.Iphase_pu.B);
|
||||||
//*M1_Motor_currentPhB = ((int16_t *)&QSPI_tx_buffer[3]);
|
*M1_Motor_currentPhC = convert_to_mA(Motor1.Iphase_pu.C);
|
||||||
//*M1_Motor_currentPhC = (((int16_t *)&QSPI_tx_buffer[3])+1);
|
|
||||||
*M1_Motor__hallState = Motor1.motor_status.currentHallPattern;
|
*M1_Motor__hallState = Motor1.motor_status.currentHallPattern;
|
||||||
*M1_Motor_dutyCycle = Motor1.motor_status.duty_cycle;
|
*M1_Motor_dutyCycle = Motor1.motor_status.duty_cycle;
|
||||||
//
|
//
|
||||||
|
@ -153,12 +152,10 @@ void update_telemetry(void)
|
||||||
*M2_Joint_rel_position = Motor2.motor_status.Num_Steps;
|
*M2_Joint_rel_position = Motor2.motor_status.Num_Steps;
|
||||||
//*M1_Joint_abs_position = ((int16_t *)&QSPI_tx_buffer[1]);
|
//*M1_Joint_abs_position = ((int16_t *)&QSPI_tx_buffer[1]);
|
||||||
//*M1_Motor_speed = (((int16_t *)&QSPI_tx_buffer[1])+1);
|
//*M1_Motor_speed = (((int16_t *)&QSPI_tx_buffer[1])+1);
|
||||||
*M2_Motor_current_bus = COMMUTATION_PATTERN[Motor2.motor_status.currentHallPattern +
|
*M2_Motor_current_bus = convert_to_mA( Motor2.Iphase_pu.Bus);
|
||||||
Motor2.motor_setpoints.directionOffset];
|
*M2_Motor_currentPhA = convert_to_mA( Motor2.Iphase_pu.A);
|
||||||
//*M1_Motor_current_bus = ((int16_t *)&QSPI_tx_buffer[2]);
|
*M2_Motor_currentPhB = convert_to_mA( Motor2.Iphase_pu.B);
|
||||||
//*M1_Motor_currentPhA = (((int16_t *)&QSPI_tx_buffer[2])+1);
|
*M2_Motor_currentPhC = convert_to_mA(Motor2.Iphase_pu.C);
|
||||||
//*M1_Motor_currentPhB = ((int16_t *)&QSPI_tx_buffer[3]);
|
|
||||||
//*M1_Motor_currentPhC = (((int16_t *)&QSPI_tx_buffer[3])+1);
|
|
||||||
*M2_Motor__hallState = Motor2.motor_status.currentHallPattern;
|
*M2_Motor__hallState = Motor2.motor_status.currentHallPattern;
|
||||||
*M2_Motor_dutyCycle = Motor2.motor_status.duty_cycle;
|
*M2_Motor_dutyCycle = Motor2.motor_status.duty_cycle;
|
||||||
|
|
||||||
|
|
|
@ -158,35 +158,6 @@ void exec_commutation(BLDCMotor_t *motor)
|
||||||
//toc_port(DEBUG_2_PORT);
|
//toc_port(DEBUG_2_PORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_currents(BLDCMotor_t *motor1, BLDCMotor_t *motor2)
|
|
||||||
{
|
|
||||||
Motor1.timerflags.adc_readings_ready_tic = false;
|
|
||||||
Motor2.timerflags.adc_readings_ready_tic = false;
|
|
||||||
////tic_port(DEBUG_2_PORT);
|
|
||||||
//volatile int16_t phase_A_current_raw, phase_B_current_raw;
|
|
||||||
//
|
|
||||||
///* Motor 1 */
|
|
||||||
//phase_A_current_raw = (adc_res[0] - Motor1.Voffset_lsb.A);
|
|
||||||
//phase_B_current_raw = (adc_res[1] - Motor1.Voffset_lsb.B)*-1;
|
|
||||||
//// Covert from LSB to PU (A) and filter out small readings
|
|
||||||
//Motor1.Iphase_pu.A = phase_A_current_raw * LSB_TO_PU;
|
|
||||||
//Motor1.Iphase_pu.B = phase_B_current_raw * LSB_TO_PU;
|
|
||||||
//// i_c = -i_a - i_b because i_a + i_b + i_c = 0
|
|
||||||
//Motor1.Iphase_pu.C = -Motor1.Iphase_pu.A - Motor1.Iphase_pu.B;
|
|
||||||
//
|
|
||||||
///* Motor 2 */
|
|
||||||
//phase_A_current_raw = (adc_res[2] - Motor2.Voffset_lsb.A);
|
|
||||||
//phase_B_current_raw = (adc_res[3] - Motor2.Voffset_lsb.B)*-1;
|
|
||||||
//// Covert from LSB to PU (A) and filter out small readings
|
|
||||||
//Motor2.Iphase_pu.A = phase_A_current_raw * LSB_TO_PU;
|
|
||||||
//Motor2.Iphase_pu.B = phase_B_current_raw * LSB_TO_PU;
|
|
||||||
//// i_c = -i_a - i_b because i_a + i_b + i_c = 0
|
|
||||||
//Motor2.Iphase_pu.C = -Motor2.Iphase_pu.A - Motor2.Iphase_pu.B;
|
|
||||||
|
|
||||||
// Set Current Loop Flag
|
|
||||||
Motor1.timerflags.current_loop_tic = true;
|
|
||||||
Motor2.timerflags.current_loop_tic = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void calculate_motor_speed(BLDCMotor_t *motor)
|
void calculate_motor_speed(BLDCMotor_t *motor)
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,19 +69,13 @@ static const uint8_t MOTOR_COMMUTATION_STEPS[8] = {9, 1, 3, 2, 5, 6, 4, 9};
|
||||||
volatile BLDCMotor_t Motor1;
|
volatile BLDCMotor_t Motor1;
|
||||||
volatile BLDCMotor_t Motor2;
|
volatile BLDCMotor_t Motor2;
|
||||||
|
|
||||||
static uint32_t adc_seq_regs[4] = {0x1806, 0x1807, 0x1808, 0x1809};
|
|
||||||
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
|
// functions
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
void BldcInitStruct(BLDCMotor_t *motor, BLDCMotor_param_t *motor_param);
|
void BldcInitStruct(BLDCMotor_t *motor, BLDCMotor_param_t *motor_param);
|
||||||
void exec_commutation(BLDCMotor_t *motor);
|
void exec_commutation(BLDCMotor_t *motor);
|
||||||
void process_currents(BLDCMotor_t *motor1, BLDCMotor_t *motor2);
|
|
||||||
static void select_active_phase(BLDCMotor_t *Motor, const uint8_t hall_state);
|
static void select_active_phase(BLDCMotor_t *Motor, const uint8_t hall_state);
|
||||||
static void calculate_motor_speed(BLDCMotor_t *motor);
|
static void calculate_motor_speed(BLDCMotor_t *motor);
|
||||||
static void BLDC_runSpeedCntl(BLDCMotor_t *motor, const float32_t speedfbk, const float32_t speedRef);
|
static void BLDC_runSpeedCntl(BLDCMotor_t *motor, const float32_t speedfbk, const float32_t speedRef);
|
||||||
|
|
|
@ -18,6 +18,11 @@
|
||||||
#define DMAC_CHANNEL_ADC_SEQ 2U
|
#define DMAC_CHANNEL_ADC_SEQ 2U
|
||||||
#define DMAC_CHANNEL_ADC_SRAM 3U
|
#define DMAC_CHANNEL_ADC_SRAM 3U
|
||||||
|
|
||||||
|
const uint32_t adc_seq_regs[4] = {0x1806, 0x1807, 0x1808, 0x1809};
|
||||||
|
volatile uint16_t adc_res[4] = {0};
|
||||||
|
struct _dma_resource *adc_sram_dma_resource;
|
||||||
|
struct _dma_resource *adc_dmac_sequence_resource;
|
||||||
|
|
||||||
inline static void configure_tcc_pwm(void)
|
inline static void configure_tcc_pwm(void)
|
||||||
{
|
{
|
||||||
/* TCC0 */
|
/* TCC0 */
|
||||||
|
|
|
@ -15,53 +15,13 @@
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
static void pwm_cb(const struct pwm_descriptor *const descr)
|
static void pwm_cb(const struct pwm_descriptor *const descr)
|
||||||
{
|
{
|
||||||
//tic_port(DEBUG_2_PORT);
|
|
||||||
volatile uint8_t x = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void adc_sram_dma_callback(struct _dma_resource *adc_dma_res)
|
void adc_sram_dma_callback(struct _dma_resource *adc_dma_res)
|
||||||
{
|
{
|
||||||
volatile uint8_t x = 1;
|
|
||||||
Motor1.timerflags.adc_readings_ready_tic = true;
|
Motor1.timerflags.adc_readings_ready_tic = true;
|
||||||
//tic_port(DEBUG_2_PORT);
|
Motor2.timerflags.adc_readings_ready_tic = true;
|
||||||
//Motor1.timerflags.adc_readings_ready_tic = true;
|
|
||||||
//tic_port(DEBUG_2_PORT);
|
|
||||||
|
|
||||||
//toc_port(DEBUG_2_PORT);
|
|
||||||
//tic_port(DEBUG_3_PORT);
|
|
||||||
//tic_port(DEBUG_3_PORT);
|
|
||||||
|
|
||||||
//volatile int16_t phase_A_current_raw;
|
|
||||||
//volatile int16_t phase_B_current_raw;
|
|
||||||
//
|
|
||||||
///* Motor 1 */
|
|
||||||
//phase_A_current_raw = (adc_res[0] - Motor1.Voffset_lsb.A);
|
|
||||||
//phase_B_current_raw = (adc_res[1] - Motor1.Voffset_lsb.B)*-1;
|
|
||||||
//// Covert from LSB to PU (A) and filter out small readings
|
|
||||||
//Motor1.Iphase_pu.A = phase_A_current_raw * LSB_TO_PU;
|
|
||||||
//Motor1.Iphase_pu.B = phase_B_current_raw * LSB_TO_PU;
|
|
||||||
//// i_c = -i_a - i_b because i_a + i_b + i_c = 0
|
|
||||||
//Motor1.Iphase_pu.C = -Motor1.Iphase_pu.A - Motor1.Iphase_pu.B;
|
|
||||||
|
|
||||||
/* Motor 2 */
|
|
||||||
//phase_A_current_raw = (adc_res[2] - Motor2.Voffset_lsb.A);
|
|
||||||
//phase_B_current_raw = (adc_res[3] - Motor2.Voffset_lsb.B)*-1;
|
|
||||||
//Motor2.Iphase_pu.A = phase_A_current_raw * LSB_TO_PU;
|
|
||||||
//Motor2.Iphase_pu.B = phase_B_current_raw * LSB_TO_PU;
|
|
||||||
//// i_c = -i_a - i_b because i_a + i_b + i_c = 0
|
|
||||||
//Motor2.Iphase_pu.C = -Motor2.Iphase_pu.A - Motor2.Iphase_pu.B;
|
|
||||||
//
|
|
||||||
///* Motor 3 */
|
|
||||||
//phase_A_current_raw = (adc_res[4] - Motor3.Voffset_lsb.A);
|
|
||||||
//phase_B_current_raw = (adc_res[5] - Motor3.Voffset_lsb.B)*-1;
|
|
||||||
//Motor3.Iphase_pu.A = phase_A_current_raw * LSB_TO_PU;
|
|
||||||
//Motor3.Iphase_pu.B = phase_B_current_raw * LSB_TO_PU;
|
|
||||||
//// i_c = -i_a - i_b because i_a + i_b + i_c = 0
|
|
||||||
//Motor3.Iphase_pu.C = -Motor3.Iphase_pu.A - Motor3.Iphase_pu.B;
|
|
||||||
|
|
||||||
// Set Current Loop Flag
|
|
||||||
//Motor1.timerflags.current_loop_tic = true;
|
|
||||||
//toc_port(DEBUG_3_PORT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,13 +11,49 @@
|
||||||
#include "interrupts.h"
|
#include "interrupts.h"
|
||||||
#include "statemachine.h"
|
#include "statemachine.h"
|
||||||
|
|
||||||
|
|
||||||
|
void process_currents()
|
||||||
|
{
|
||||||
|
Motor1.timerflags.adc_readings_ready_tic = false;
|
||||||
|
Motor2.timerflags.adc_readings_ready_tic = false;
|
||||||
|
|
||||||
|
//////tic_port(DEBUG_2_PORT);
|
||||||
|
volatile int16_t phase_A_current_raw, phase_B_current_raw;
|
||||||
|
|
||||||
|
/* Motor 1 */
|
||||||
|
phase_A_current_raw = (adc_res[0] - Motor1.Voffset_lsb.A);
|
||||||
|
phase_B_current_raw = (adc_res[1] - Motor1.Voffset_lsb.B)*-1;
|
||||||
|
// Covert from LSB to PU (A) and filter out small readings
|
||||||
|
Motor1.Iphase_pu.A = phase_A_current_raw * LSB_TO_PU;
|
||||||
|
Motor1.Iphase_pu.B = phase_B_current_raw * LSB_TO_PU;
|
||||||
|
// i_c = -i_a - i_b because i_a + i_b + i_c = 0
|
||||||
|
Motor1.Iphase_pu.C = -Motor1.Iphase_pu.A - Motor1.Iphase_pu.B;
|
||||||
|
|
||||||
|
/* Motor 2 */
|
||||||
|
phase_A_current_raw = (adc_res[2] - Motor2.Voffset_lsb.A);
|
||||||
|
phase_B_current_raw = (adc_res[3] - Motor2.Voffset_lsb.B)*-1;
|
||||||
|
// Covert from LSB to PU (A) and filter out small readings
|
||||||
|
Motor2.Iphase_pu.A = phase_A_current_raw * LSB_TO_PU;
|
||||||
|
Motor2.Iphase_pu.B = phase_B_current_raw * LSB_TO_PU;
|
||||||
|
// i_c = -i_a - i_b because i_a + i_b + i_c = 0
|
||||||
|
Motor2.Iphase_pu.C = -Motor2.Iphase_pu.A - Motor2.Iphase_pu.B;
|
||||||
|
|
||||||
|
// Set Current Loop Flag
|
||||||
|
Motor1.timerflags.current_loop_tic = true;
|
||||||
|
Motor2.timerflags.current_loop_tic = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Example of using TIMER_0.
|
* Example of using TIMER_0.
|
||||||
*/
|
*/
|
||||||
static void One_ms_cycle_callback(const struct timer_task *const timer_task)
|
static void One_ms_cycle_callback(const struct timer_task *const timer_task)
|
||||||
{
|
{
|
||||||
if ((ecat_state == wait2)|(ecat_state == wait)) ecat_state= write_fifo;
|
if ((ecat_state == wait2)|(ecat_state == wait))
|
||||||
|
{
|
||||||
|
ecat_state= write_fifo;
|
||||||
run_ECAT =true;
|
run_ECAT =true;
|
||||||
|
}
|
||||||
|
|
||||||
update_telemetry();
|
update_telemetry();
|
||||||
//run_ECAT = true;
|
//run_ECAT = true;
|
||||||
}
|
}
|
||||||
|
@ -137,9 +173,10 @@ int main(void)
|
||||||
//x += 1;
|
//x += 1;
|
||||||
//comms_check();
|
//comms_check();
|
||||||
//update_setpoints();
|
//update_setpoints();
|
||||||
if (run_ECAT) ECAT_STATE_MACHINE();
|
if (Motor1.timerflags.adc_readings_ready_tic) {process_currents();}
|
||||||
if (Motor1.timerflags.adc_readings_ready_tic) process_currents(&Motor1, &Motor2);
|
if (Motor1.timerflags.current_loop_tic) {CONTROLLER_StateMachine();}
|
||||||
if (Motor1.timerflags.current_loop_tic) CONTROLLER_StateMachine();
|
if (run_ECAT) {ECAT_STATE_MACHINE();}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue