116 lines
3.2 KiB
C
116 lines
3.2 KiB
C
|
#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;
|
||
|
}
|