polarimeter_software/User/board/bsp_encoder.c

116 lines
3.2 KiB
C
Raw Normal View History

2025-09-30 02:37:23 +00:00
#include "bsp_encoder.h"
#if (USING_SOFT_ENCODER == 0)
#include "tim.h"
#else
#include "et_encoder.h"
et_encoder_t gpio_encoder;
void encoder_exti_callback(void);
#endif // USING_SOFT_ENCODER
volatile int32_t encoder_tim_overflow_count = 0; // 启动后就溢出, 进行++,所以初始化位-1
extern uint32_t encoder_mode;
void pm_encoder_init(void)
{
#if (USING_SOFT_ENCODER == 0)
MX_TIM2_Init();
#else
et_encoder_init(&gpio_encoder);
ENCODER_GPIO_RCC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = ENCODER_GPIO_PHASE_A_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ENCODER_GPIO_PHASE_A_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ENCODER_GPIO_PHASE_B_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ENCODER_GPIO_PHASE_B_Port, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0);
HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
#endif
encoder_tim_overflow_count = 0;
}
void pm_encoder_start(void)
{
#if (USING_SOFT_ENCODER == 0)
__HAL_TIM_ENABLE_IT(&ENCODER_TIM, TIM_IT_UPDATE);
__HAL_TIM_URS_ENABLE(&ENCODER_TIM); // only concern update event
__HAL_TIM_SET_COUNTER(&ENCODER_TIM, 0);
HAL_TIM_Encoder_Start(&ENCODER_TIM, TIM_CHANNEL_ALL);
encoder_tim_overflow_count = 0;
#else
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
#endif
}
void pm_encoder_stop(void)
{
#if (USING_SOFT_ENCODER == 0)
HAL_TIM_Encoder_Stop(&ENCODER_TIM, TIM_CHANNEL_ALL);
#else
HAL_NVIC_DisableIRQ(EXTI0_IRQn);
HAL_NVIC_DisableIRQ(EXTI1_IRQn);
#endif
}
int32_t pm_encoder_get_count(void)
{
#if (USING_SOFT_ENCODER == 0)
return __HAL_TIM_GET_COUNTER(&ENCODER_TIM);
#else
return et_encoder_get_position(&gpio_encoder);
#endif
}
bool pm_encoder_counting_down(void)
{
#if (USING_SOFT_ENCODER == 0)
return __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM);
#else
return et_encoder_get_dir(&gpio_encoder) == ET_ENCODER_DIR_REVERSE ? true
: false;
#endif
}
#if (USING_SOFT_ENCODER == 1)
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(ENCODER_GPIO_PHASE_A_Pin);
}
void EXTI1_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(ENCODER_GPIO_PHASE_B_Pin);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == ENCODER_GPIO_PHASE_A_Pin
|| GPIO_Pin == ENCODER_GPIO_PHASE_B_Pin)
{
bool channel_a = HAL_GPIO_ReadPin(ENCODER_GPIO_PHASE_A_Port,
ENCODER_GPIO_PHASE_A_Pin);
bool channel_b = HAL_GPIO_ReadPin(ENCODER_GPIO_PHASE_B_Port,
ENCODER_GPIO_PHASE_B_Pin);
if (__HAL_GPIO_EXTI_GET_IT(ENCODER_GPIO_PHASE_A_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(ENCODER_GPIO_PHASE_A_Pin);
et_encoder_isr(&gpio_encoder, channel_a, channel_b);
}
}
}
#endif
uint32_t pm_encoder_get_cpr(void)
{
uint8_t multi = encoder_mode == TIM_ENCODERMODE_TI12 ? 4 : 2;
return ENCODER_PPR * multi;
}