2022-01-20 12:23:37 -08:00
|
|
|
|
2021-12-15 04:40:16 -08:00
|
|
|
#include "encoder/ABI.h"
|
|
|
|
|
|
|
|
#include "ch.h"
|
|
|
|
#include "hal.h"
|
|
|
|
#include "stm32f4xx_conf.h"
|
|
|
|
#include "hw.h"
|
|
|
|
#include "mc_interface.h"
|
|
|
|
#include "utils.h"
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
static float last_enc_angle = 0.0;
|
2022-01-20 12:23:37 -08:00
|
|
|
static ABI_config_t ABI_config_now = { 0 };
|
2021-12-15 04:40:16 -08:00
|
|
|
static uint32_t enc_counts = 10000;
|
|
|
|
|
2021-12-15 05:17:43 -08:00
|
|
|
void ABI_deinit(void) {
|
2021-12-15 04:40:16 -08:00
|
|
|
nvicDisableVector(HW_ENC_EXTI_CH);
|
|
|
|
|
|
|
|
TIM_DeInit(HW_ENC_TIM);
|
|
|
|
|
2022-01-20 12:23:37 -08:00
|
|
|
palSetPadMode(ABI_config_now.port_A,
|
|
|
|
ABI_config_now.pin_A,
|
2021-12-15 05:17:43 -08:00
|
|
|
PAL_MODE_INPUT_PULLUP);
|
2022-01-20 12:23:37 -08:00
|
|
|
palSetPadMode(ABI_config_now.port_B,
|
|
|
|
ABI_config_now.pin_B,
|
2021-12-15 05:17:43 -08:00
|
|
|
PAL_MODE_INPUT_PULLUP);
|
2021-12-15 04:40:16 -08:00
|
|
|
|
|
|
|
last_enc_angle = 0.0;
|
2021-12-17 07:34:22 -08:00
|
|
|
|
2022-01-20 12:23:37 -08:00
|
|
|
ABI_config_now.is_init = 0;
|
2021-12-15 04:40:16 -08:00
|
|
|
}
|
|
|
|
|
2022-01-09 08:10:40 -08:00
|
|
|
encoder_ret_t ABI_init(ABI_config_t *abi_config) {
|
2021-12-15 04:40:16 -08:00
|
|
|
|
2021-12-15 05:17:43 -08:00
|
|
|
EXTI_InitTypeDef EXTI_InitStructure;
|
2021-12-15 04:40:16 -08:00
|
|
|
|
|
|
|
// Initialize variables
|
|
|
|
enc_counts = abi_config->counts;
|
|
|
|
|
2022-01-20 12:23:37 -08:00
|
|
|
ABI_config_now = *abi_config;
|
|
|
|
|
|
|
|
palSetPadMode(ABI_config_now.port_A,
|
|
|
|
ABI_config_now.pin_A,
|
2021-12-15 05:17:43 -08:00
|
|
|
PAL_MODE_ALTERNATE(HW_ENC_TIM_AF));
|
2022-01-20 12:23:37 -08:00
|
|
|
palSetPadMode(ABI_config_now.port_B,
|
|
|
|
ABI_config_now.pin_B,
|
2021-12-15 05:17:43 -08:00
|
|
|
PAL_MODE_ALTERNATE(HW_ENC_TIM_AF));
|
2021-12-15 04:40:16 -08:00
|
|
|
// palSetPadMode(HW_HALL_ENC_GPIO3, HW_HALL_ENC_PIN3, PAL_MODE_ALTERNATE(HW_ENC_TIM_AF));
|
|
|
|
|
2021-12-15 05:17:43 -08:00
|
|
|
// Enable timer clock
|
2021-12-15 04:40:16 -08:00
|
|
|
HW_ENC_TIM_CLK_EN();
|
|
|
|
|
|
|
|
// Enable SYSCFG clock
|
|
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
|
|
|
|
2021-12-15 05:17:43 -08:00
|
|
|
TIM_EncoderInterfaceConfig(HW_ENC_TIM, TIM_EncoderMode_TI12,
|
|
|
|
TIM_ICPolarity_Rising,
|
|
|
|
TIM_ICPolarity_Rising);
|
2021-12-15 04:40:16 -08:00
|
|
|
TIM_SetAutoreload(HW_ENC_TIM, enc_counts - 1);
|
|
|
|
|
|
|
|
// Filter
|
|
|
|
HW_ENC_TIM->CCMR1 |= 6 << 12 | 6 << 4;
|
|
|
|
HW_ENC_TIM->CCMR2 |= 6 << 4;
|
|
|
|
|
|
|
|
TIM_Cmd(HW_ENC_TIM, ENABLE);
|
|
|
|
|
|
|
|
// Interrupt on index pulse
|
|
|
|
|
|
|
|
// Connect EXTI Line to pin
|
|
|
|
SYSCFG_EXTILineConfig(HW_ENC_EXTI_PORTSRC, HW_ENC_EXTI_PINSRC);
|
|
|
|
|
|
|
|
// Configure EXTI Line
|
|
|
|
EXTI_InitStructure.EXTI_Line = HW_ENC_EXTI_LINE;
|
|
|
|
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
|
|
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
|
|
|
|
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
|
|
|
EXTI_Init(&EXTI_InitStructure);
|
|
|
|
|
2021-12-20 05:18:51 -08:00
|
|
|
abi_config->is_init = 1;
|
2022-01-20 12:23:37 -08:00
|
|
|
ABI_config_now = *abi_config;
|
2021-12-20 05:18:51 -08:00
|
|
|
|
2021-12-15 04:40:16 -08:00
|
|
|
// Enable and set EXTI Line Interrupt to the highest priority
|
|
|
|
nvicEnableVector(HW_ENC_EXTI_CH, 0);
|
|
|
|
|
2022-01-09 08:10:40 -08:00
|
|
|
return ENCODER_OK;
|
2021-12-15 04:40:16 -08:00
|
|
|
}
|
|
|
|
|
2021-12-15 05:17:43 -08:00
|
|
|
float ABI_read_deg(void) {
|
|
|
|
last_enc_angle = ((float) HW_ENC_TIM->CNT * 360.0) / (float) enc_counts;
|
2021-12-15 04:40:16 -08:00
|
|
|
return last_enc_angle;
|
|
|
|
}
|
|
|
|
|
2021-12-20 05:18:51 -08:00
|
|
|
void ABI_set_counts(uint32_t counts) {
|
|
|
|
if (counts != enc_counts) {
|
|
|
|
enc_counts = counts;
|
|
|
|
TIM_SetAutoreload(HW_ENC_TIM, enc_counts - 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|