Skip to content

Commit 7418102

Browse files
committed
Renamed encoder functions, moved fault generation
1 parent a00d1be commit 7418102

File tree

4 files changed

+35
-28
lines changed

4 files changed

+35
-28
lines changed

encoder.c

+25-26
Original file line numberDiff line numberDiff line change
@@ -159,16 +159,16 @@ static void spi_delay(void);
159159
static void spi_AS5047_cs_delay(void);
160160
static void TS5700N8501_send_byte(uint8_t b);
161161

162-
static void encoder_AS504x_determinate_if_connected(bool was_last_valid);
162+
static void AS504x_determinate_if_connected(bool was_last_valid);
163163

164164
#if AS504x_USE_SW_MOSI_PIN || AS5047_USE_HW_SPI_PINS
165165
static uint16_t AS504x_diag_fetch_now_count = 0;
166166

167-
static uint8_t encoder_AS504x_fetch_diag(void);
168-
static uint8_t encoder_AS504x_verify_serial(void);
169-
static void encoder_AS504x_deserialize_diag(void);
170-
static void encoder_AS504x_fetch_clear_err_diag(void);
171-
static uint8_t spi_transfer_err_check(uint16_t *in_buf, const uint16_t *out_buf, int length);
167+
static uint8_t AS504x_fetch_diag(void);
168+
static uint8_t AS504x_verify_serial(void);
169+
static void AS504x_deserialize_diag(void);
170+
static void AS504x_fetch_clear_err_diag(void);
171+
static uint8_t AS504x_spi_transfer_err_check(uint16_t *in_buf, const uint16_t *out_buf, int length);
172172
#else
173173
static uint32_t AS504x_data_last_invalid_counter = 0;
174174
#endif
@@ -620,7 +620,7 @@ void encoder_reset(void) {
620620
}
621621

622622
// returns true for even number of ones (no parity error according to AS5047 datasheet
623-
bool spi_check_parity(uint16_t x) {
623+
static bool spi_check_parity(uint16_t x) {
624624
x ^= x >> 8;
625625
x ^= x >> 4;
626626
x ^= x >> 2;
@@ -629,7 +629,7 @@ bool spi_check_parity(uint16_t x) {
629629
}
630630

631631
#if AS504x_USE_SW_MOSI_PIN || AS5047_USE_HW_SPI_PINS
632-
static uint8_t encoder_AS504x_fetch_diag(void) {
632+
static uint8_t AS504x_fetch_diag(void) {
633633
uint16_t recf[2], senf[2] = {AS504x_SPI_READ_DIAG_MSG, AS504x_SPI_READ_MAGN_MSG};
634634
uint8_t ret = 0;
635635

@@ -641,13 +641,13 @@ static uint8_t encoder_AS504x_fetch_diag(void) {
641641
spi_AS5047_cs_delay();
642642

643643
spi_begin();
644-
ret |= spi_transfer_err_check(recf, senf + 1, 1);
644+
ret |= AS504x_spi_transfer_err_check(recf, senf + 1, 1);
645645
spi_end();
646646

647647
spi_AS5047_cs_delay();
648648

649649
spi_begin();
650-
ret |= spi_transfer_err_check(recf + 1, 0, 1);
650+
ret |= AS504x_spi_transfer_err_check(recf + 1, 0, 1);
651651
spi_end();
652652

653653
if(!ret) {
@@ -663,7 +663,7 @@ static uint8_t encoder_AS504x_fetch_diag(void) {
663663
/*
664664
* This function fetches error flag from AS504x and afterwards clean error flag
665665
*/
666-
static void encoder_AS504x_fetch_clear_err_diag() {
666+
static void AS504x_fetch_clear_err_diag() {
667667
uint16_t recf, senf = AS504x_SPI_READ_CLEAR_ERROR_MSG;
668668

669669
spi_begin();
@@ -683,7 +683,7 @@ static void encoder_AS504x_fetch_clear_err_diag() {
683683
* Try verify if the diagnostics are not corrupt
684684
* This function can prevent deserialazing corrupted data if the MISO bus is HIGH or LOW
685685
*/
686-
static uint8_t encoder_AS504x_verify_serial() {
686+
static uint8_t AS504x_verify_serial() {
687687
uint16_t serial_diag_flgs, serial_magnitude, test_magnitude;
688688
uint8_t test_AGC_value, test_is_Comp_high, test_is_Comp_low;
689689

@@ -705,7 +705,7 @@ static uint8_t encoder_AS504x_verify_serial() {
705705
return 0;
706706
}
707707

708-
static void encoder_AS504x_deserialize_diag() {
708+
static void AS504x_deserialize_diag() {
709709
AS504x_sensor_diag.AGC_value = AS504x_sensor_diag.serial_diag_flgs;
710710
AS504x_sensor_diag.is_OCF = (AS504x_sensor_diag.serial_diag_flgs >> AS504x_SPI_DIAG_OCF_BIT_POS) & 1;
711711
AS504x_sensor_diag.is_COF = (AS504x_sensor_diag.serial_diag_flgs >> AS504x_SPI_DIAG_COF_BIT_POS) & 1;
@@ -714,7 +714,7 @@ static void encoder_AS504x_deserialize_diag() {
714714
AS504x_sensor_diag.magnitude = AS504x_sensor_diag.serial_magnitude & AS504x_SPI_EXCLUDE_PARITY_AND_ERROR_BITMASK;
715715
}
716716

717-
static uint8_t spi_transfer_err_check(uint16_t *in_buf, const uint16_t *out_buf, int length) {
717+
static uint8_t AS504x_spi_transfer_err_check(uint16_t *in_buf, const uint16_t *out_buf, int length) {
718718
spi_transfer(in_buf, out_buf, length);
719719

720720
for(int len_count = 0; len_count < length; len_count++) {
@@ -730,14 +730,13 @@ static uint8_t spi_transfer_err_check(uint16_t *in_buf, const uint16_t *out_buf,
730730
/*
731731
* Determinate if is connected depending on last retieved data.
732732
*/
733-
static void encoder_AS504x_determinate_if_connected(bool was_last_valid) {
733+
static void AS504x_determinate_if_connected(bool was_last_valid) {
734734
if(!was_last_valid) {
735735
AS504x_spi_communication_error_count++;
736736

737737
if(AS504x_spi_communication_error_count >= AS504x_CONNECTION_DETERMINATOR_ERROR_THRESHOLD) {
738738
AS504x_spi_communication_error_count = AS504x_CONNECTION_DETERMINATOR_ERROR_THRESHOLD;
739739
AS504x_sensor_diag.is_connected = 0;
740-
mc_interface_fault_stop(FAULT_CODE_ENCODER_SPI, 0, 1);
741740
}
742741
} else {
743742
if(AS504x_spi_communication_error_count) {
@@ -765,32 +764,32 @@ void encoder_tim_isr(void) {
765764
spi_AS5047_cs_delay();
766765

767766
spi_begin();
768-
spi_data_err_raised = spi_transfer_err_check(&pos, 0, 1);
767+
spi_data_err_raised = AS504x_spi_transfer_err_check(&pos, 0, 1);
769768
spi_end();
770769
spi_val = pos;
771770

772771
// get diagnostic every AS504x_REFRESH_DIAG_AFTER_NSAMPLES
773772
AS504x_diag_fetch_now_count++;
774773
if(AS504x_diag_fetch_now_count >= AS504x_REFRESH_DIAG_AFTER_NSAMPLES || spi_data_err_raised) {
775774
// clear error flags before getting new diagnostics data
776-
encoder_AS504x_fetch_clear_err_diag();
775+
AS504x_fetch_clear_err_diag();
777776

778-
if(!encoder_AS504x_fetch_diag()) {
779-
if(!encoder_AS504x_verify_serial()) {
777+
if(!AS504x_fetch_diag()) {
778+
if(!AS504x_verify_serial()) {
780779

781780
// if (encoder_AS504x_get_diag().is_Comp_high) {
782781
// mc_interface_fault_stop(FAULT_CODE_ENCODER_NO_MAGNET, 0, 1); // COMP HIGH
783782
// } else if(encoder_AS504x_get_diag().is_Comp_low) {
784783
// mc_interface_fault_stop(FAULT_CODE_ENCODER_MAGNET_TOO_STRONG, 0, 1); // COMP low
785784
// }
786785

787-
encoder_AS504x_deserialize_diag();
788-
encoder_AS504x_determinate_if_connected(true);
786+
AS504x_deserialize_diag();
787+
AS504x_determinate_if_connected(true);
789788
} else {
790-
encoder_AS504x_determinate_if_connected(false);
789+
AS504x_determinate_if_connected(false);
791790
}
792791
} else {
793-
encoder_AS504x_determinate_if_connected(false);
792+
AS504x_determinate_if_connected(false);
794793
}
795794
AS504x_diag_fetch_now_count = 0;
796795
}
@@ -804,11 +803,11 @@ void encoder_tim_isr(void) {
804803
AS504x_data_last_invalid_counter++;
805804
} else {
806805
AS504x_data_last_invalid_counter = 0;
807-
encoder_AS504x_determinate_if_connected(true);
806+
AS504x_determinate_if_connected(true);
808807
}
809808

810809
if (AS504x_data_last_invalid_counter >= AS504x_DATA_INVALID_THRESHOLD) {
811-
encoder_AS504x_determinate_if_connected(false);
810+
AS504x_determinate_if_connected(false);
812811
AS504x_data_last_invalid_counter = AS504x_DATA_INVALID_THRESHOLD;
813812
}
814813
#endif

encoder.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ AS504x_diag encoder_AS504x_get_diag(void);
8282

8383
#define AS504x_CONNECTION_DETERMINATOR_ERROR_THRESHOLD 5
8484

85-
#define AS504x_DATA_INVALID_THRESHOLD 10000
85+
#define AS504x_DATA_INVALID_THRESHOLD 20000
8686
#define AS504x_REFRESH_DIAG_AFTER_NSAMPLES 100
8787

8888
#endif /* ENCODER_H_ */

mc_interface.c

+8
Original file line numberDiff line numberDiff line change
@@ -2427,6 +2427,14 @@ static void run_timer_tasks(volatile motor_if_state_t *motor) {
24272427
mc_interface_fault_stop(FAULT_CODE_ENCODER_SINCOS_ABOVE_MAX_AMPLITUDE, !is_motor_1, false);
24282428
}
24292429

2430+
if(motor->m_conf.motor_type == MOTOR_TYPE_FOC &&
2431+
motor->m_conf.foc_sensor_mode == FOC_SENSOR_MODE_ENCODER &&
2432+
motor->m_conf.m_sensor_port_mode == SENSOR_PORT_MODE_AS5047_SPI) {
2433+
if (!encoder_AS504x_get_diag().is_connected) {
2434+
mc_interface_fault_stop(FAULT_CODE_ENCODER_SPI, !is_motor_1, false);
2435+
}
2436+
}
2437+
24302438
if(motor->m_conf.motor_type == MOTOR_TYPE_FOC &&
24312439
motor->m_conf.foc_sensor_mode == FOC_SENSOR_MODE_ENCODER &&
24322440
motor->m_conf.m_sensor_port_mode == SENSOR_PORT_MODE_AD2S1205) {

terminal.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,7 @@ void terminal_process_string(char *str) {
873873
(unsigned int)encoder_spi_get_val(),
874874
encoder_spi_get_error_cnt(),
875875
(double)encoder_spi_get_error_rate() * (double)100.0);
876-
} else if (argc == 1) {
876+
} else {
877877
commands_printf("SPI encoder value: %d, errors: %d, error rate: %.3f %%, Connected: %u",
878878
(unsigned int)encoder_spi_get_val(),
879879
encoder_spi_get_error_cnt(),

0 commit comments

Comments
 (0)