old encoder files deleted

This commit is contained in:
Jakub Tomczak 2021-12-20 14:18:51 +01:00
parent 806e7d12be
commit 4743194894
31 changed files with 354 additions and 1402 deletions

View File

@ -146,7 +146,6 @@ CSRC = $(STARTUPSRC) \
commands.c \
timeout.c \
comm_can.c \
encoder.c \
flash_helper.c \
mc_interface.c \
mcpwm_foc.c \

View File

@ -24,7 +24,7 @@
// Some useful includes
#include "mc_interface.h"
#include "utils.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "terminal.h"
#include "comm_can.h"
#include "hw.h"

View File

@ -24,7 +24,7 @@
// Some useful includes
#include "comm_can.h"
#include "commands.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "hw.h"
#include "mc_interface.h"
#include "terminal.h"
@ -605,4 +605,4 @@ static void terminal_show_skypuff_conf(int argc, const char **argv)
commands_printf(" rewinding force: %.2fkg (%.1fA)", (double)(config.rewinding_current / config.kg_to_amps), (double)config.rewinding_current);
commands_printf(" slow speed: %.1fms (%.0f ERPM)", (double)erpm_to_ms(config.slow_erpm), (double)config.slow_erpm);
commands_printf(" maximum slow force: %.2fkg (%.1fA)", (double)(config.slow_max_current / config.kg_to_amps), (double)config.slow_max_current);
}
}

View File

@ -24,7 +24,7 @@
#include "conf_general.h"
#include "mc_interface.h"
#include "utils.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "terminal.h"
#include "comm_can.h"
#include "hw.h"

View File

@ -23,7 +23,7 @@
#include "mc_interface.h"
#include "utils.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "terminal.h"
#include "comm_can.h"
#include "hw.h"

View File

@ -33,7 +33,6 @@
#include "packet.h"
#include "hw.h"
#include "canard_driver.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "utils.h"
#include "mempools.h"
@ -1578,7 +1577,7 @@ static void decode_msg(uint32_t eid, uint8_t *data8, int len, bool is_replaced)
case CAN_PACKET_POLL_TS5700N8501_STATUS: {
comm_can_transmit_eid_replace(app_get_configuration()->controller_id |
((uint32_t)CAN_PACKET_POLL_TS5700N8501_STATUS << 8),
encoder_ts5700n8501_get_raw_status(), 8, true);
encoders_get_raw_status(), 8, true);
} break;
case CAN_PACKET_CONF_BATTERY_CUT:

View File

@ -36,7 +36,6 @@
#include "flash_helper.h"
#include "utils.h"
#include "packet.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "nrf_driver.h"
#include "gpdrive.h"

View File

@ -27,7 +27,6 @@
#include "stm32f4xx_conf.h"
#include "timeout.h"
#include "commands.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "comm_can.h"
#include "app.h"

1166
encoder.c

File diff suppressed because it is too large Load Diff

View File

@ -1,88 +0,0 @@
/*
Copyright 2016 Benjamin Vedder benjamin@vedder.se
This file is part of the VESC firmware.
The VESC firmware is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
The VESC firmware is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ENCODER_H_
#define ENCODER_H_
#include "conf_general.h"
// Functions
void encoder_deinit(void);
void encoder_init_abi(uint32_t counts);
void encoder_init_as5047p_spi(void);
void encoder_init_mt6816_spi(void);
void encoder_init_ad2s1205_spi(void);
void encoder_init_sincos(float sin_gain, float sin_offset,
float cos_gain, float cos_offset, float sincos_filter_constant);
void encoder_init_ts5700n8501(void);
bool encoder_is_configured(void);
float encoder_read_deg(void);
float encoder_read_deg_multiturn(void);
void encoder_reset(void);
void encoder_tim_isr(void);
void encoder_set_counts(uint32_t counts);
bool encoder_index_found(void);
uint32_t encoder_spi_get_val(void);
uint32_t encoder_spi_get_error_cnt(void);
float encoder_spi_get_error_rate(void);
uint32_t encoder_get_no_magnet_error_cnt(void);
float encoder_get_no_magnet_error_rate(void);
uint32_t encoder_resolver_loss_of_tracking_error_cnt(void);
uint32_t encoder_resolver_degradation_of_signal_error_cnt(void);
uint32_t encoder_resolver_loss_of_signal_error_cnt(void);
float encoder_resolver_loss_of_tracking_error_rate(void);
float encoder_resolver_degradation_of_signal_error_rate(void);
float encoder_resolver_loss_of_signal_error_rate(void);
uint32_t encoder_sincos_get_signal_below_min_error_cnt(void);
uint32_t encoder_sincos_get_signal_above_max_error_cnt(void);
float encoder_sincos_get_signal_below_min_error_rate(void);
float encoder_sincos_get_signal_above_max_error_rate(void);
uint8_t* encoder_ts5700n8501_get_raw_status(void);
int16_t encoder_ts57n8501_get_abm(void);
void encoder_ts57n8501_reset_errors(void);
void encoder_ts57n8501_reset_multiturn(void);
AS504x_diag encoder_AS504x_get_diag(void);
#define AS504x_SPI_READ_BIT 0x4000
#define AS504x_SPI_WRITE_BIT 0x0000
#define AS504x_SPI_DIAG_OCF_BIT_POS 8
#define AS504x_SPI_DIAG_COF_BIT_POS 9
#define AS504x_SPI_DIAG_COMP_LOW_BIT_POS 10
#define AS504x_SPI_DIAG_COMP_HIGH_BIT_POS 11
#define AS504x_SPI_EXCLUDE_PARITY_AND_ERROR_BITMASK 0x3FFF
#define AS504x_SPI_DIAG_ADR 0x3FFD
#define AS504x_SPI_MAGN_ADR 0x3FFE
#define AS504x_SPI_CLEAR_ERROR_ADR 0x0001
#define AS504x_SPI_READ_DIAG_MSG (AS504x_SPI_DIAG_ADR | AS504x_SPI_READ_BIT)
#define AS504x_SPI_READ_MAGN_MSG (AS504x_SPI_MAGN_ADR | AS504x_SPI_READ_BIT)
#define AS504x_SPI_READ_CLEAR_ERROR_MSG (AS504x_SPI_CLEAR_ERROR_ADR | AS504x_SPI_READ_BIT)
#define AS504x_CONNECTION_DETERMINATOR_ERROR_THRESHOLD 5
#define AS504x_DATA_INVALID_THRESHOLD 20000
#define AS504x_REFRESH_DIAG_AFTER_NSAMPLES 100
#endif /* ENCODER_H_ */

View File

@ -73,11 +73,12 @@ encoders_ret_t ABI_init(ABI_config_t *abi_config) {
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
abi_config->is_init = 1;
abi_config_now = *abi_config;
// Enable and set EXTI Line Interrupt to the highest priority
nvicEnableVector(HW_ENC_EXTI_CH, 0);
abi_config->is_init = 1;
abi_config_now = *abi_config;
return ENCODERS_OK;
}
@ -86,3 +87,10 @@ float ABI_read_deg(void) {
return last_enc_angle;
}
void ABI_set_counts(uint32_t counts) {
if (counts != enc_counts) {
enc_counts = counts;
TIM_SetAutoreload(HW_ENC_TIM, enc_counts - 1);
}
}

View File

@ -10,4 +10,6 @@ encoders_ret_t ABI_init(ABI_config_t *abi_config);
float ABI_read_deg(void);
void ABI_set_counts(uint32_t counts);
#endif /* ENCODER_ABI_H_ */

View File

@ -94,8 +94,6 @@ encoders_ret_t AD2S1205_init(AD2S1205_config_t *AD2S1205_config) {
palSetPad(AD2S1205_RDVEL_GPIO, AD2S1205_RDVEL_PIN); // Will always read position
#endif
AD2S1205_config_now = *AD2S1205_config;
// Enable timer clock
HW_ENC_TIM_CLK_EN();
@ -110,18 +108,21 @@ encoders_ret_t AD2S1205_init(AD2S1205_config_t *AD2S1205_config) {
// Enable overflow interrupt
TIM_ITConfig(HW_ENC_TIM, TIM_IT_Update, ENABLE);
// Enable timer
TIM_Cmd(HW_ENC_TIM, ENABLE);
AD2S1205_config->is_init = 1;
AD2S1205_config_now = *AD2S1205_config;
nvicEnableVector(HW_ENC_TIM_ISR_CH, 6);
AD2S1205_config_now.is_init = 1;
AD2S1205_config->is_init = 1;
return ENCODERS_OK;
}
float AD2S1205_read_deg(void) {
return last_enc_angle;
}
void AD2S1205_routine(void) {
uint16_t pos;
// SAMPLE signal should have been be asserted in sync with ADC sampling
@ -233,10 +234,6 @@ uint32_t AD2S1205_spi_get_error_cnt(void) {
return spi_error_cnt;
}
float AD2S1205_read_deg(void) {
return last_enc_angle;
}
static void spi_transfer(uint16_t *in_buf, const uint16_t *out_buf, int length) {
const encoders_gpio_t gpio_miso = AD2S1205_config_now.spi_config.gpio_miso;
#if AS504x_USE_SW_MOSI_PIN || AS5047_USE_HW_SPI_PINS

View File

@ -11,7 +11,6 @@ encoders_ret_t AD2S1205_init(AD2S1205_config_t *AD2S1205_config);
float AD2S1205_read_deg(void);
void AD2S1205_routine(void);
bool AD2S1205_index_found(void);
float AD2S1205_resolver_loss_of_tracking_error_rate(void);
float AD2S1205_resolver_degradation_of_signal_error_rate(void);
float AD2S1205_resolver_loss_of_signal_error_rate(void);

View File

@ -9,6 +9,31 @@
#include "utils.h"
#include <math.h>
#define AS504x_SPI_READ_BIT 0x4000
#define AS504x_SPI_WRITE_BIT 0x0000
#define AS504x_SPI_DIAG_OCF_BIT_POS 8
#define AS504x_SPI_DIAG_COF_BIT_POS 9
#define AS504x_SPI_DIAG_COMP_LOW_BIT_POS 10
#define AS504x_SPI_DIAG_COMP_HIGH_BIT_POS 11
#define AS5047_SAMPLE_RATE_HZ 20000
#define AS504x_SPI_EXCLUDE_PARITY_AND_ERROR_BITMASK 0x3FFF
#define AS504x_SPI_DIAG_ADR 0x3FFD
#define AS504x_SPI_MAGN_ADR 0x3FFE
#define AS504x_SPI_CLEAR_ERROR_ADR 0x0001
#define AS504x_SPI_READ_DIAG_MSG (AS504x_SPI_DIAG_ADR | AS504x_SPI_READ_BIT)
#define AS504x_SPI_READ_MAGN_MSG (AS504x_SPI_MAGN_ADR | AS504x_SPI_READ_BIT)
#define AS504x_SPI_READ_CLEAR_ERROR_MSG (AS504x_SPI_CLEAR_ERROR_ADR | AS504x_SPI_READ_BIT)
#define AS504x_CONNECTION_DETERMINATOR_ERROR_THRESHOLD 5
#define AS504x_DATA_INVALID_THRESHOLD 20000
#define AS504x_REFRESH_DIAG_AFTER_NSAMPLES 100
//Private variables
#if AS504x_USE_SW_MOSI_PIN || AS5047_USE_HW_SPI_PINS
static uint16_t AS504x_diag_fetch_now_count = 0;
@ -181,8 +206,6 @@ encoders_ret_t AS504x_init(AS504x_config_t *AS504x_config) {
AS504x_spi_config.gpio_mosi.pin);
#endif
AS504x_config_now = *AS504x_config;
HW_ENC_TIM_CLK_EN();
// Time Base configuration
@ -198,12 +221,13 @@ encoders_ret_t AS504x_init(AS504x_config_t *AS504x_config) {
TIM_ITConfig(HW_ENC_TIM, TIM_IT_Update, ENABLE);
// Enable timer
TIM_Cmd(HW_ENC_TIM, ENABLE);
AS504x_config->is_init = 1;
AS504x_config_now = *AS504x_config;
nvicEnableVector(HW_ENC_TIM_ISR_CH, 6);
spi_error_rate = 0.0;
AS504x_config_now.is_init = 1;
AS504x_config->is_init = 1;
return ENCODERS_OK;
}
#if (AS504x_USE_SW_MOSI_PIN || AS5047_USE_HW_SPI_PINS)

View File

@ -5,39 +5,14 @@
#include "datatypes.h"
#include "encoder/encoder_datatype.h"
void AS504x_routine(void);
float AS504x_read_deg(void);
void AS504x_deinit(void);
encoders_ret_t AS504x_init(AS504x_config_t *AS504x_config);
float AS504x_read_deg(void);
void AS504x_routine(void);
AS504x_diag AS504x_get_diag(void);
bool AS504x_index_found(void);
float AS504x_spi_get_error_rate(void);
uint32_t AS504x_spi_get_val(void);
uint32_t AS504x_spi_get_error_cnt(void);
#define AS504x_SPI_READ_BIT 0x4000
#define AS504x_SPI_WRITE_BIT 0x0000
#define AS504x_SPI_DIAG_OCF_BIT_POS 8
#define AS504x_SPI_DIAG_COF_BIT_POS 9
#define AS504x_SPI_DIAG_COMP_LOW_BIT_POS 10
#define AS504x_SPI_DIAG_COMP_HIGH_BIT_POS 11
#define AS5047_SAMPLE_RATE_HZ 20000
#define AS504x_SPI_EXCLUDE_PARITY_AND_ERROR_BITMASK 0x3FFF
#define AS504x_SPI_DIAG_ADR 0x3FFD
#define AS504x_SPI_MAGN_ADR 0x3FFE
#define AS504x_SPI_CLEAR_ERROR_ADR 0x0001
#define AS504x_SPI_READ_DIAG_MSG (AS504x_SPI_DIAG_ADR | AS504x_SPI_READ_BIT)
#define AS504x_SPI_READ_MAGN_MSG (AS504x_SPI_MAGN_ADR | AS504x_SPI_READ_BIT)
#define AS504x_SPI_READ_CLEAR_ERROR_MSG (AS504x_SPI_CLEAR_ERROR_ADR | AS504x_SPI_READ_BIT)
#define AS504x_CONNECTION_DETERMINATOR_ERROR_THRESHOLD 5
#define AS504x_DATA_INVALID_THRESHOLD 20000
#define AS504x_REFRESH_DIAG_AFTER_NSAMPLES 100
#endif /* ENCODER_AS504X_H_ */

View File

@ -7,6 +7,7 @@
#include "mc_interface.h"
#include "utils.h"
#include <math.h>
#include "encoder/encoder_hwconf.h"
ENCSINCOS_config_t enc_sincos_config_now = { 0 };
@ -47,6 +48,7 @@ encoders_ret_t ENC_SINCOS_init(ENCSINCOS_config_t *enc_sincos_config) {
// ADC measurements needs to be in sync with motor PWM
#ifdef HW_HAS_SIN_COS_ENCODER
enc_sincos_config->is_init = 1;
enc_sincos_config_now = *enc_sincos_config;
return ENCODERS_OK;
#else
enc_sincos_config->is_init = 0;
@ -84,3 +86,19 @@ float ENC_SINCOS_read_deg(void) {
#endif
return last_enc_angle;
}
uint32_t ENC_SINCOS_get_signal_below_min_error_cnt(void) {
return sincos_signal_below_min_error_cnt;
}
uint32_t ENC_SINCOS_get_signal_above_max_error_cnt(void) {
return sincos_signal_above_max_error_cnt;
}
float ENC_SINCOS_get_signal_below_min_error_rate(void) {
return sincos_signal_low_error_rate;
}
float ENC_SINCOS_get_signal_above_max_error_rate(void) {
return sincos_signal_above_max_error_rate;
}

View File

@ -10,4 +10,9 @@ encoders_ret_t ENC_SINCOS_init(ENCSINCOS_config_t *enc_sincos_config);
float ENC_SINCOS_read_deg(void);
uint32_t ENC_SINCOS_get_signal_below_min_error_cnt(void);
uint32_t ENC_SINCOS_get_signal_above_max_error_cnt(void);
float ENC_SINCOS_get_signal_below_min_error_rate(void);
float ENC_SINCOS_get_signal_above_max_error_rate(void);
#endif /* ENCODER_ENC_SINCOS_H_ */

View File

@ -47,9 +47,6 @@ void MT6816_deinit(void) {
spiStop(&HW_SPI_DEV);
#endif
//palSetPadMode(HW_HALL_ENC_GPIO1, HW_HALL_ENC_PIN1, PAL_MODE_INPUT_PULLUP); //TODO: is this necessary
//palSetPadMode(HW_HALL_ENC_GPIO2, HW_HALL_ENC_PIN2, PAL_MODE_INPUT_PULLUP); //TODO: is this necessary
palSetPadMode(mt6816_config_now.spi_config.gpio_miso.port,
mt6816_config_now.spi_config.gpio_miso.pin, PAL_MODE_INPUT_PULLUP);
palSetPadMode(mt6816_config_now.spi_config.gpio_sck.port,
@ -112,6 +109,11 @@ encoders_ret_t MT6816_init(MT6816_config_t *mt6816_config) {
#endif
return ENCODERS_OK;
}
float MT6816_read_deg(void) {
return last_enc_angle;
}
void MT6816_routine(void) {
uint16_t pos;
uint16_t reg_data_03;
@ -167,10 +169,6 @@ uint32_t MT6816_get_no_magnet_error_rate(void) {
return encoder_no_magnet_error_rate;
}
float MT6816_read_deg(void) {
return last_enc_angle;
}
static void spi_begin(void) {
palClearPad(mt6816_config_now.spi_config.gpio_nss.port,
mt6816_config_now.spi_config.gpio_nss.pin);

View File

@ -7,9 +7,9 @@
void MT6816_deinit(void);
encoders_ret_t MT6816_init(MT6816_config_t *mt6816_config);
void MT6816_routine(void);
float MT6816_read_deg(void);
void MT6816_routine(void);
uint32_t MT6816_spi_get_val(void);
uint32_t MT6816_spi_get_error_cnt(void);

View File

@ -6,6 +6,15 @@
#include "ch.h"
#include "hal.h"
#define AS5047_SAMPLE_RATE_HZ 20000
#define AD2S1205_SAMPLE_RATE_HZ 20000 //25MHz max spi clk
#define TS5700N8501_SAMPLE_RATE_HZ 20000
#define MT6816_SAMPLE_RATE_HZ 20000
#define MT6816_NO_MAGNET_ERROR_MASK 0x0002
#define SINCOS_SAMPLE_RATE_HZ 20000
#define SINCOS_MIN_AMPLITUDE 1.0 // sqrt(sin^2 + cos^2) has to be larger than this
#define SINCOS_MAX_AMPLITUDE 1.65 // sqrt(sin^2 + cos^2) has to be smaller than this
typedef uint8_t encoders_pin_t;
typedef uint32_t encoders_refresh_rate_hz_t;
@ -88,5 +97,18 @@ typedef struct {
ENCSINCOS_config_t encsincos;
TS5700N8501_config_t ts5700n8501;
} encoders_config_t;
/*
typedef struct {
uint8_t is_connected;
uint8_t AGC_value;
uint16_t magnitude;
uint8_t is_OCF;
uint8_t is_COF;
uint8_t is_Comp_low;
uint8_t is_Comp_high;
uint16_t serial_diag_flgs;
uint16_t serial_magnitude;
uint16_t serial_error_flags;
}AS504x_diag;
*/
#endif /* ENCODER_ENCODER_DATATYPE_H_ */

View File

@ -4,15 +4,6 @@
#include "encoder/encoder_datatype.h"
#include "hw.h"
#define AS5047_SAMPLE_RATE_HZ 20000
#define AD2S1205_SAMPLE_RATE_HZ 20000 //25MHz max spi clk
#define TS5700N8501_SAMPLE_RATE_HZ 20000
#define MT6816_SAMPLE_RATE_HZ 20000
#define MT6816_NO_MAGNET_ERROR_MASK 0x0002
#define SINCOS_SAMPLE_RATE_HZ 20000
#define SINCOS_MIN_AMPLITUDE 1.0 // sqrt(sin^2 + cos^2) has to be larger than this
#define SINCOS_MAX_AMPLITUDE 1.65 // sqrt(sin^2 + cos^2) has to be smaller than this
extern encoders_config_t conf_AS5047;
extern encoders_config_t conf_MT6816;
extern encoders_config_t conf_AD2S1205;

View File

@ -1,12 +1,42 @@
#include "encoders.h"
static encoders_type_t encoder_type_now = ENCODERS_TYPE_NONE; // TODO: CHANGE TO encoder_config_now
#include "encoder/AS504x.h"
#include "encoder/MT6816.h"
#include "encoder/AD2S1205.h"
#include "encoder/encoder_hwconf.h"
#include "encoder/ABI.h"
#include "encoder/ENC_SINCOS.h"
#include "encoder/TS5700N8501.h"
#include "math.h"
static bool encoders_is_uart_defined(encoders_config_t *encoder_config);
static bool encoders_is_spi_defined(encoders_config_t *encoder_config);
static bool encoders_is_incremental_defined(encoders_config_t *encoder_config);
static encoders_type_t encoder_type_now = ENCODERS_TYPE_NONE;
static uint32_t enc_counts = 10000;
static bool index_found = false;
encoders_ret_t encoders_init(encoders_config_t *encoder_config) {
void encoders_deinit(void) {
if (encoder_type_now == ENCODERS_TYPE_AS504x) {
AS504x_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_MT6816) {
MT6816_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_AD2S1205_SPI) {
AD2S1205_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_ABI) {
ABI_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_SINCOS) {
ENC_SINCOS_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_TS5700N8501) {
TS5700N8501_deinit();
}
//TODO: ASSERTS
encoder_type_now = ENCODERS_TYPE_NONE;
}
encoders_ret_t encoders_init(encoders_config_t *encoder_config) {
if (encoder_type_now != ENCODERS_TYPE_NONE) {
return ENCODERS_ERROR;
@ -16,6 +46,11 @@ encoders_ret_t encoders_init(encoders_config_t *encoder_config) {
AS504x_config_t *as504x_config;
encoders_ret_t encoder_ret;
if(!encoders_is_spi_defined(encoder_config))
{
return ENCODERS_ERROR;
}
as504x_config = &(encoder_config->encspi);
as504x_config->is_init = 0;
@ -33,6 +68,11 @@ encoders_ret_t encoders_init(encoders_config_t *encoder_config) {
MT6816_config_t *mt6816_config;
encoders_ret_t encoder_ret;
if(!encoders_is_spi_defined(encoder_config))
{
return ENCODERS_ERROR;
}
mt6816_config = &(encoder_config->encspi);
mt6816_config->is_init = 0;
@ -50,6 +90,11 @@ encoders_ret_t encoders_init(encoders_config_t *encoder_config) {
AD2S1205_config_t *ad2s1205_config;
encoders_ret_t encoder_ret;
if(!encoders_is_spi_defined(encoder_config))
{
return ENCODERS_ERROR;
}
ad2s1205_config = &(encoder_config->encspi);
ad2s1205_config->is_init = 0;
@ -67,6 +112,11 @@ encoders_ret_t encoders_init(encoders_config_t *encoder_config) {
ABI_config_t *abi_config;
encoders_ret_t encoder_ret;
if(!encoders_is_incremental_defined(encoder_config))
{
return ENCODERS_ERROR;
}
abi_config = &(encoder_config->abi);
abi_config->is_init = 0;
@ -101,6 +151,11 @@ encoders_ret_t encoders_init(encoders_config_t *encoder_config) {
TS5700N8501_config_t *ts5700N8501_config;
encoders_ret_t encoder_ret;
if(!encoders_is_uart_defined(encoder_config))
{
return ENCODERS_ERROR;
}
ts5700N8501_config = &(encoder_config->ts5700n8501);
encoder_ret = TS5700N8501_init(ts5700N8501_config);
@ -137,6 +192,23 @@ float encoders_read_deg(void) {
return 0.0;
}
float encoders_read_deg_multiturn(void) {
if (encoder_type_now == ENCODERS_TYPE_TS5700N8501) {
encoders_get_abm();
float ts_mt = (float)encoders_get_abm();
if (fabsf(ts_mt) > 5000.0) {
ts_mt = 0;
encoders_reset_multiturn();
}
ts_mt += 5000;
return encoders_read_deg() / 10000.0 + (360 * ts_mt) / 10000.0;
} else {
return encoders_read_deg();
}
}
encoders_type_t encoders_is_configured(void) {
return encoder_type_now;
}
@ -145,24 +217,6 @@ bool encoders_index_found(void) {
return index_found;
}
void encoders_deinit(void) {
if (encoder_type_now == ENCODERS_TYPE_AS504x) {
AS504x_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_MT6816) {
MT6816_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_AD2S1205_SPI) {
AD2S1205_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_ABI) {
ABI_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_SINCOS) {
ENC_SINCOS_deinit();
} else if (encoder_type_now == ENCODERS_TYPE_TS5700N8501) {
TS5700N8501_deinit();
}
encoder_type_now = ENCODERS_TYPE_NONE;
}
float encoders_spi_get_error_rate(void) {
if (encoder_type_now == ENCODERS_TYPE_AS504x) {
return AS504x_spi_get_error_rate();
@ -216,6 +270,14 @@ uint32_t encoders_resolver_loss_of_signal_error_cnt(void) {
return AD2S1205_resolver_loss_of_signal_error_cnt();
}
void encoders_set_counts(uint32_t counts) {
if (encoder_type_now == ENCODERS_TYPE_ABI)
{
ABI_set_counts(counts);
index_found = false;
}
}
uint32_t encoders_spi_get_val(void) {
if (encoder_type_now == ENCODERS_TYPE_AS504x) {
return AS504x_spi_get_val();
@ -257,6 +319,65 @@ void encoders_reset(void) {
}
}
AS504x_diag encoders_get_diag(void) {
AS504x_diag diag = {0};
if (encoder_type_now == ENCODERS_TYPE_AS504x) {
diag = AS504x_get_diag();
}
return diag;
}
uint8_t* encoders_get_raw_status(void) {
if (encoder_type_now == ENCODERS_TYPE_TS5700N8501) {
return TS5700N8501_get_raw_status();
}
return NULL;
}
int16_t encoders_get_abm(void) {
if (encoder_type_now == ENCODERS_TYPE_TS5700N8501) {
return TS5700N8501_get_abm();
}
return 0;
}
void encoders_reset_errors(void) {
if (encoder_type_now == ENCODERS_TYPE_TS5700N8501) {
return TS5700N8501_reset_errors();
}
}
void encoders_reset_multiturn(void) {
if (encoder_type_now == ENCODERS_TYPE_TS5700N8501) {
return TS5700N8501_reset_multiturn();
}
}
uint32_t encoders_get_signal_below_min_error_cnt(void) {
if (encoder_type_now == ENCODERS_TYPE_SINCOS) {
return ENC_SINCOS_get_signal_below_min_error_cnt();
}
return 0;
}
uint32_t encoders_get_signal_above_max_error_cnt(void) {
if (encoder_type_now == ENCODERS_TYPE_SINCOS) {
return ENC_SINCOS_get_signal_above_max_error_cnt();
}
return 0;
}
float encoders_get_signal_below_min_error_rate(void) {
if (encoder_type_now == ENCODERS_TYPE_SINCOS) {
return ENC_SINCOS_get_signal_below_min_error_rate();
}
return 0.0;
}
float encoders_get_signal_above_max_error_rate(void) {
if (encoder_type_now == ENCODERS_TYPE_SINCOS) {
return ENC_SINCOS_get_signal_above_max_error_rate();
}
return 0.0;
}
void encoders_tim_isr(void) {
if (encoder_type_now == ENCODERS_TYPE_AS504x) {
AS504x_routine();
@ -267,3 +388,34 @@ void encoders_tim_isr(void) {
}
}
static bool encoders_is_uart_defined(encoders_config_t *encoder_config)
{
if (!encoder_config->ts5700n8501.uart_config.gpio_RX.port
|| !encoder_config->ts5700n8501.uart_config.gpio_TX.port)
{
return false;
}
return true;
}
static bool encoders_is_spi_defined(encoders_config_t *encoder_config)
{
if (!encoder_config->encspi.spi_config.gpio_miso.port
|| !encoder_config->encspi.spi_config.gpio_nss.port
|| !encoder_config->encspi.spi_config.gpio_sck.port)
{
return false;
}
return true;
}
static bool encoders_is_incremental_defined(encoders_config_t *encoder_config)
{
if (!encoder_config->abi.incremental_config.gpio_A.port
|| !encoder_config->abi.incremental_config.gpio_B.port)
{
return false;
}
return true;
}

View File

@ -2,36 +2,55 @@
#define ENCODER_ENCODERS_H_
#include "encoder_datatype.h"
#include "encoder/AS504x.h"
#include "encoder/MT6816.h"
#include "encoder/AD2S1205.h"
#include "encoder/encoder_hwconf.h"
#include "encoder/ABI.h"
#include "encoder/ENC_SINCOS.h"
#include "encoder/TS5700N8501.h"
#include "hal.h"
// GENERIC GLOBAL
void encoders_deinit(void);
encoders_ret_t encoders_init(encoders_config_t *encoder_config);
float encoders_read_deg(void);
float encoders_read_deg_multiturn(void);
encoders_type_t encoders_is_configured(void);
bool encoders_index_found(void);
void encoders_reset_multiturn(void);
// SPECIFIC GLOBAL
bool encoders_index_found(void);
float encoders_spi_get_error_rate(void);
uint32_t encoders_spi_get_error_cnt(void);
uint32_t encoders_get_no_magnet_error_cnt(void);
//AD2S1205
float encoders_resolver_loss_of_tracking_error_rate(void);
float encoders_resolver_degradation_of_signal_error_rate(void);
float encoders_resolver_loss_of_signal_error_rate(void);
uint32_t encoders_resolver_loss_of_tracking_error_cnt(void);
uint32_t encoders_resolver_degradation_of_signal_error_cnt(void);
uint32_t encoders_resolver_loss_of_signal_error_cnt(void);
float encoders_get_no_magnet_error_rate(void);
uint32_t encoders_spi_get_val(void);
void encoders_tim_isr(void);
//ABI
void encoders_set_counts(uint32_t counts);
//MT6816
float encoders_get_no_magnet_error_rate(void);
uint32_t encoders_get_no_magnet_error_cnt(void);
//AS504x
AS504x_diag encoders_get_diag(void);
//SINCOS
uint32_t encoders_get_signal_below_min_error_cnt(void);
uint32_t encoders_get_signal_above_max_error_cnt(void);
float encoders_get_signal_below_min_error_rate(void);
float encoders_get_signal_above_max_error_rate(void);
//TS5700N8501
uint8_t* encoders_get_raw_status(void);
int16_t encoders_get_abm(void);
void encoders_reset_errors(void);
//SPI ENCODERS
uint32_t encoders_spi_get_val(void);
float encoders_spi_get_error_rate(void);
uint32_t encoders_spi_get_error_cnt(void);
void encoders_reset(void);
void encoders_tim_isr(void);
#endif /* ENCODER_ENCODERS_H_ */

View File

@ -24,7 +24,6 @@
#include "mc_interface.h"
#include "mcpwm_foc.h"
#include "hw.h"
#include "encoder.h"
#include "encoder/encoders.h"
CH_IRQ_HANDLER(ADC1_2_3_IRQHandler) {

1
main.c
View File

@ -39,7 +39,6 @@
#include "commands.h"
#include "timeout.h"
#include "comm_can.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "servo_simple.h"
#include "utils.h"

View File

@ -28,7 +28,6 @@
#include "ch.h"
#include "hal.h"
#include "commands.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "buffer.h"
#include "gpdrive.h"
@ -348,7 +347,8 @@ void mc_interface_set_configuration(mc_configuration *configuration) {
switch (configuration->m_sensor_port_mode) {
case SENSOR_PORT_MODE_ABI:
// TODO: integrate with encoder/encoders
encoder_init_abi(configuration->m_encoder_counts);
conf_ABI.abi.counts = configuration->m_encoder_counts;
encoders_init(&conf_ABI);
break;
case SENSOR_PORT_MODE_AS5047_SPI:
@ -364,12 +364,14 @@ void mc_interface_set_configuration(mc_configuration *configuration) {
break;
case SENSOR_PORT_MODE_SINCOS:
// TODO: integrate with encoder/encoders
encoder_init_sincos(motor->m_conf.foc_encoder_sin_gain, motor->m_conf.foc_encoder_sin_offset,
motor->m_conf.foc_encoder_cos_gain, motor->m_conf.foc_encoder_cos_offset,
motor->m_conf.foc_encoder_sincos_filter_constant);
conf_SINCOS.encsincos.s_gain = motor->m_conf.foc_encoder_sin_gain;
conf_SINCOS.encsincos.s_offset = motor->m_conf.foc_encoder_sin_offset;
conf_SINCOS.encsincos.c_gain = motor->m_conf.foc_encoder_cos_gain;
conf_SINCOS.encsincos.c_offset = motor->m_conf.foc_encoder_cos_offset;
conf_SINCOS.encsincos.filter_constant = motor->m_conf.foc_encoder_sincos_filter_constant;
encoders_init(&conf_SINCOS);
break;
// TODO: integrate with encoder/encoders
case SENSOR_PORT_MODE_TS5700N8501:
case SENSOR_PORT_MODE_TS5700N8501_MULTITURN: {
app_configuration *appconf = mempools_alloc_appconf();
@ -392,7 +394,7 @@ void mc_interface_set_configuration(mc_configuration *configuration) {
}
if (configuration->m_sensor_port_mode == SENSOR_PORT_MODE_ABI) {
encoder_set_counts(configuration->m_encoder_counts);
encoders_set_counts(configuration->m_encoder_counts);
}
#ifdef HW_HAS_DRV8301
@ -2473,22 +2475,22 @@ static void run_timer_tasks(volatile motor_if_state_t *motor) {
motor->m_conf.foc_sensor_mode == FOC_SENSOR_MODE_ENCODER &&
motor->m_conf.m_sensor_port_mode == SENSOR_PORT_MODE_SINCOS) {
if (encoder_sincos_get_signal_below_min_error_rate() > 0.05)
if (encoders_get_signal_below_min_error_rate() > 0.05)
mc_interface_fault_stop(FAULT_CODE_ENCODER_SINCOS_BELOW_MIN_AMPLITUDE, !is_motor_1, false);
if (encoder_sincos_get_signal_above_max_error_rate() > 0.05)
if (encoders_get_signal_above_max_error_rate() > 0.05)
mc_interface_fault_stop(FAULT_CODE_ENCODER_SINCOS_ABOVE_MAX_AMPLITUDE, !is_motor_1, false);
}
if (motor->m_conf.motor_type == MOTOR_TYPE_FOC &&
motor->m_conf.foc_sensor_mode == FOC_SENSOR_MODE_ENCODER &&
motor->m_conf.m_sensor_port_mode == SENSOR_PORT_MODE_AS5047_SPI) {
if (!AS504x_get_diag().is_connected) {
if (!encoders_get_diag().is_connected) {
mc_interface_fault_stop(FAULT_CODE_ENCODER_SPI, !is_motor_1, false);
}
if (AS504x_get_diag().is_Comp_high) {
if (encoders_get_diag().is_Comp_high) {
mc_interface_fault_stop(FAULT_CODE_ENCODER_NO_MAGNET, !is_motor_1, false);
} else if(AS504x_get_diag().is_Comp_low) {
} else if(encoders_get_diag().is_Comp_low) {
mc_interface_fault_stop(FAULT_CODE_ENCODER_MAGNET_TOO_STRONG, !is_motor_1, false);
}
}

View File

@ -31,7 +31,6 @@
#include "ledpwm.h"
#include "terminal.h"
#include "timeout.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "timer.h"

View File

@ -30,7 +30,6 @@
#include "utils.h"
#include "ledpwm.h"
#include "terminal.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "commands.h"
#include "timeout.h"
@ -3074,7 +3073,7 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
float angle_now = 0.0;
if (encoders_is_configured()) {
if (conf_now->m_sensor_port_mode == SENSOR_PORT_MODE_TS5700N8501_MULTITURN) {
angle_now = encoder_read_deg_multiturn();
angle_now = encoders_read_deg_multiturn();
} else {
angle_now = enc_ang;
}

View File

@ -28,7 +28,6 @@
#include "comm_can.h"
#include "utils.h"
#include "timeout.h"
#include "encoder.h"
#include "encoder/encoders.h"
#include "app.h"
#include "comm_usb.h"
@ -880,22 +879,22 @@ void terminal_process_string(char *str) {
(unsigned int)encoders_spi_get_val(),
encoders_spi_get_error_cnt(),
(double)encoders_spi_get_error_rate() * (double)100.0,
AS504x_get_diag().is_connected);
encoders_get_diag().is_connected);
}
if (mcconf->m_sensor_port_mode == SENSOR_PORT_MODE_TS5700N8501 ||
mcconf->m_sensor_port_mode == SENSOR_PORT_MODE_TS5700N8501_MULTITURN) {
char sf[9];
char almc[9];
utils_byte_to_binary(encoder_ts5700n8501_get_raw_status()[0], sf);
utils_byte_to_binary(encoder_ts5700n8501_get_raw_status()[7], almc);
commands_printf("TS5700N8501 ABM: %d, SF: %s, ALMC: %s\n", encoder_ts57n8501_get_abm(), sf, almc);
utils_byte_to_binary(encoders_get_raw_status()[0], sf);
utils_byte_to_binary(encoders_get_raw_status()[7], almc);
commands_printf("TS5700N8501 ABM: %d, SF: %s, ALMC: %s\n", encoders_get_abm(), sf, almc);
}
if (mcconf->m_sensor_port_mode == SENSOR_PORT_MODE_MT6816_SPI) {
commands_printf("Low flux error (no magnet): errors: %d, error rate: %.3f %%",
encoders_get_no_magnet_error_cnt(),
(double)encoder_get_no_magnet_error_rate() * (double)100.0);
(double)encoders_get_no_magnet_error_rate() * (double)100.0);
}
#if AS504x_USE_SW_MOSI_PIN || AS5047_USE_HW_SPI_PINS
@ -907,22 +906,22 @@ void terminal_process_string(char *str) {
"OCF : %u\n"
"COMP_low : %u\n"
"COMP_high : %u\n",
AS504x_get_diag().AGC_value, AS504x_get_diag().magnitude,
AS504x_get_diag().is_COF, AS504x_get_diag().is_OCF,
AS504x_get_diag().is_Comp_low,
AS504x_get_diag().is_Comp_high);
encoders_get_diag().AGC_value, encoders_get_diag().magnitude,
encoders_get_diag().is_COF, encoders_get_diag().is_OCF,
encoders_get_diag().is_Comp_low,
encoders_get_diag().is_Comp_high);
}
#endif
}
if (mcconf->m_sensor_port_mode == SENSOR_PORT_MODE_SINCOS) {
commands_printf("Sin/Cos encoder signal below minimum amplitude: errors: %d, error rate: %.3f %%",
encoder_sincos_get_signal_below_min_error_cnt(),
(double)encoder_sincos_get_signal_below_min_error_rate() * (double)100.0);
encoders_get_signal_below_min_error_cnt(),
(double)encoders_get_signal_below_min_error_rate() * (double)100.0);
commands_printf("Sin/Cos encoder signal above maximum amplitude: errors: %d, error rate: %.3f %%",
encoder_sincos_get_signal_above_max_error_cnt(),
(double)encoder_sincos_get_signal_above_max_error_rate() * (double)100.0);
encoders_get_signal_above_max_error_cnt(),
(double)encoders_get_signal_above_max_error_rate() * (double)100.0);
}
if (mcconf->m_sensor_port_mode == SENSOR_PORT_MODE_AD2S1205) {
@ -937,10 +936,10 @@ void terminal_process_string(char *str) {
(double)encoders_resolver_loss_of_signal_error_rate() * (double)100.0);
}
} else if (strcmp(argv[0], "encoder_clear_errors") == 0) {
encoder_ts57n8501_reset_errors();
encoders_reset_errors();
commands_printf("Done!\n");
} else if (strcmp(argv[0], "encoder_clear_multiturn") == 0) {
encoder_ts57n8501_reset_multiturn();
encoders_reset_multiturn();
commands_printf("Done!\n");
} else if (strcmp(argv[0], "uptime") == 0) {
commands_printf("Uptime: %.2f s\n", (double)chVTGetSystemTimeX() / (double)CH_CFG_ST_FREQUENCY);

View File

@ -24,7 +24,6 @@
#include "math.h"
#include "stdio.h"
#include "commands.h"
#include "encoder.h"
#include "encoder/encoders.h"
typedef struct{
@ -290,9 +289,13 @@ static void disconnect_virtual_motor( void ){
break;
case SENSOR_PORT_MODE_SINCOS:
encoder_init_sincos(m_conf->foc_encoder_sin_gain, m_conf->foc_encoder_sin_offset,
m_conf->foc_encoder_cos_gain, m_conf->foc_encoder_cos_offset,
m_conf->foc_encoder_sincos_filter_constant);
conf_SINCOS.encsincos.s_gain = m_conf->foc_encoder_sin_gain;
conf_SINCOS.encsincos.s_offset = m_conf->foc_encoder_sin_offset;
conf_SINCOS.encsincos.c_gain = m_conf->foc_encoder_cos_gain;
conf_SINCOS.encsincos.c_offset = m_conf->foc_encoder_cos_offset;
conf_SINCOS.encsincos.filter_constant = m_conf->foc_encoder_sincos_filter_constant;
encoders_init(&conf_SINCOS);
break;
default: